티스토리 뷰

반응형

 문제

 

programmers.co.kr/learn/courses/30/lessons/42860

 

코딩테스트 연습 - 조이스틱

조이스틱으로 알파벳 이름을 완성하세요. 맨 처음엔 A로만 이루어져 있습니다. ex) 완성해야 하는 이름이 세 글자면 AAA, 네 글자면 AAAA 조이스틱을 각 방향으로 움직이면 아래와 같습니다. ▲ - 다

programmers.co.kr

 

 

 

 문제 상황

 

- AAA로 시작해서 이름을 바꾸는데 조작해야하는 조이스틱 횟수를 계산한다.

 

 

 

 해결 전략

 

- 바꿔야할 횟수를 계산하되 알파벳 26자중 가운데를 넘어서는 순간 반대쪽으로 돌리는 것이 더 유리하므로 26을 기준으로 나눠준다.

 

- 횟수 변경후 반영해주고, 문자열이 일치하는지 확인한다.

 

- 일치하면 반환, 안하면 왼쪽 오른쪽 중 바꿔야하는 방향이 가까운쪽으로 이동한다.

 

 

 

 코드

 

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
def solution(name):
    letter = "A" * len(name)
    # 움직여야하는 횟수
    cnt = 0
    # 관찰할 위치 인덱스
    idx = 0
    while True:
        change = ord(name[idx]) - ord("A")
        # 반대로 돌 수 있다.
        if change > 13 : change = 26 - change
        # 글자를 변경해준다.
        cnt += change
        name = name[:idx] + "A" + name[idx+1:]
   
        # 같아졌으면 종료
        if letter == name:
            return cnt
        # 안 같기 때문에 좌 우를 결정해주어야 한다. 
        left, right = 00
        ischeck_left, ischeck_right = TrueTrue
        for i in range(1len(name)):
            if name[(idx+i)%len(name)] != "A" and ischeck_right:
                right = i
                ischeck_right = False
            if name[(idx-i)] != "A" and ischeck_left:
                left = i
                ischeck_left = False
            if not ischeck_left and not ischeck_right:
                break
        # 오른쪽으로 더 많이 가야되면 왼쪽으로 가야한다.
        if right > left:
            idx = idx-left
            cnt += left
            if idx < 0: idx += len(name) 
        # 왼쪽으로 더 많이 가야되면 오른쪽으로 가야한다.
        else:
            cnt += right
            idx = (idx+right)%len(name)
cs

 

 

 

 해설

 

- 코드에 해설 첨언

 

 

 

 새로 학습한 것 & 실수 

 

- 정말 많은 실수를 했다. 특히 글자를 바꿔주는데에서 횟수만 추가하고 글자를 안바꿔준다거나, 부호를 반대로 했다. 좀 더 꼼꼼히 하기 위해서는 #를 좀 더 구체적으로 활용해야한다.

 

 

반응형
댓글