강의로 돌아가기
Y00L

13번부터 주르륵 실패해서 들어온 당신에게

당신은 아마 유클리드 거리를 사용했겠죠.
문제의 가정에 '손가락은 상하좌우로만 이동할 수 있다'가 있기 때문에, 맨하튼 거리를 사용해야 합니다!
특정 케이스에서는 사용한 공식에 따라 거리가 달라질 수 있기 때문입니다.
예) 왼손은 2, 오른손은 6에 있을 때, 0과의 거리를 측정하면 맨하튼 거리는 같지만, 유클리드 거리는 같지 않습니다!
(맨하튼 - Left 3, Right 3 / 유클리드 - Left 3, Right √5)

작성중인 코드―solution.py
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
fingerPoses = {'left':10, 'right':12}


def solution(numbers, hand):
    answer = ''
    for i in numbers:
        answer += judgeHand(i,hand)
    return answer


def judgeHand(number,hand): 
    if number in [1,4,7]:
        return press(number,'left')    
    elif number in [3,6,9]:
        return press(number,'right')    
    else:
        return press(number,ChooseHand(number,hand))


def press(number,usingHand):
    fingerPoses[usingHand] = number
    if usingHand == 'left':
        return 'L'
    elif usingHand == 'right':
        return 'R'


def ChooseHand(number,hand):
    traget_pos = CalcPos(number)
    left_pos = CalcPos(fingerPoses['left'])
    right_pos = CalcPos(fingerPoses['right'])     

    if CalcDistance(right_pos, traget_pos) < CalcDistance(left_pos, traget_pos):
        return 'right'
    elif CalcDistance(left_pos, traget_pos) < CalcDistance(right_pos, traget_pos):
        return 'left'
    else:
        return hand


def CalcPos(num):
    if num == 0:
        num = 11

    if num%3 == 0:
        x = 3
    else:
        x = num%3        
    y = (num+2)//3   
    pos_list = [x,y]  

    return pos_list


def CalcDistance(list_a, list_b):
    distance = 0
    for i in range(2):
        distance += abs(list_b[i] - list_a[i])
    return distance
  • 박세준

    감사합니다.....!

    박세준―2022.04.29 19:30
  • sophiainailys

    맨하튼, 유클리드 오답포인트 깔끔하게 정리해주셔서 감사합니다

    sophiainailys―2022.05.01 19:46
  • 이윤서

    와 너무 감사하네요 한참 해매고 있었는데...

    이윤서―2022.05.07 00:57
  • Jxxunnn

    감사합니다 선생님..

    Jxxunnn―2022.06.24 15:42
  • 와.. 맨하튼 거리였군요! 감사합니다!!!

    탈퇴한 사용자―2022.06.24 22:53
  • kynam

    감사합니다!

    kynam―2022.07.06 12:15
  • 안성민

    [수정전] const leftDistance = ((leftX - nowX) ** 2) + ((leftY - nowY) ** 2); => [수정후] const leftDistance = Math.abs(leftX - nowX) + Math.abs(leftY - nowY);

    안성민―2022.08.06 22:23
  • hwajj

    !!!!!!!!!!! 감사합니다

    hwajj―2022.08.06 22:46
  • baksohyeon

    대박 감사합니다

    baksohyeon―2022.08.20 16:33
  • Lee Jaeyoon

    글쓴이분이 없었다면 몇 시간을 더 헤맸을 것 같네요... 감사합니다!

    Lee Jaeyoon―2022.10.04 16:13
0 개의 답변
답변 쓰기
이 입력폼은 마크다운 문법을 지원합니다. 마크다운 가이드 를 참고하세요.