본문 바로가기

코딩테스트 풀이 정리/코테2

코딩 테스트_1. 방향전환

728x90

( 문제 )

다음과 같이  "EEESEEEEEENNNN" 방향이 주어집니다. ( E: 동 N: 북, S: 남, W: 서 )

방향 하나당 100M이며 1의 시간이 걸립니다.

해당 예시로 들면 E방향으로 300M 후에 S로 움직이니 오른쪽으로 움직이는 겁니다

다시 한 번 E로 움직이니 왼쪽으로 움직이는 거지요. 그리고 6번 움직이는데,, 5번 이상 같은 방향으로 움직여야 된다고 판단될 시 100M씩은 내비게이션은 지시를 안 해도 됩니다 ( 문제 풀 때 이부분을 못 봐서 문제를 제대로 못 품 )

그렇기 500M 움직인 이후에 다시 N방향으로 가니까 왼쪽으로 움직이게 되는 거죠.

 

결론적으로 출력 결과는

'Time 0:Go straight 300m and turn right', 

'Time 3:Go straight 100m and turn left', 

'Time 5:Go straight 500m and turn left'  # Time이 5인 이유 -> 6칸 직진하기 때문에 같은 방향으로 이동하는 한 칸은 내비게이션이 언급하지 않아도 되기 때문

이렇게 나옵니다.

 

다른 예제 입력 2 )

SSSSSSWWWNNNNNN

답 2 )

["Time 1: Go straight 500m and turn right","Time 6: Go straight 300m and turn right"]

( 문제 해설 ) 

 

구현 문제라 해설할 건 없지만 개인적으로 저는 

현 노드에서 다음 노드가 방향이 변환할 때를 체크하는 것보다

이전 노드와 현 노드가 달라지는 것으로 체크하는 게 편하더라고요.

+

왼쪽 오른쪽은 이동방향을 정면으로 할 때의 기준입니다.

 

타임을 스킵한다는 게 이해가 좀 안 가실 겁니다 그림으로 설명하겠습니다.

 

설명이 부족하지만 조금 곰곰이 생각해보시면 제가 멀 의도하는지 아실지도..

코드도 함께 보아요

 


[ 코드 ]

 

def dirchk(curDir, next):
    direct = ""

    if curDir == 'N' and next == "E":
        direct = "right"
    elif curDir == "E" and next == "S":
        direct = "right"
    elif curDir == "S" and next == "W":
        direct = "right"
    elif curDir == "W" and next == "N":
        direct = "right"
    # e -> n, n -> w, w -> s, s -> e: left
    if curDir == 'E' and next == "N":
        direct = "left"
    elif curDir == "N" and next == "W":
        direct = "left"
    elif curDir == "W" and next == "S":
        direct = "left"
    elif curDir == "S" and next == "E":
        direct = "left"

    return direct


def solution(path):
    answer = []

    res = []
    start_pos = 0
    same_pt = 1
    prev_pt = -1

    for i in range(1, len(path)):
        cur_dir = path[i - 1]
        next_dir = path[i]
        if cur_dir == next_dir:
            same_pt += 1
            if same_pt > 5:
                same_pt -= 1
                start_pos += 1
        elif cur_dir != next_dir:
            dir = dirchk(cur_dir, next_dir)
            # 바로 방향 전환 된 경우
            if prev_pt == 1:
                res.append([start_pos, same_pt, dir])
            else:
                prev_pt = same_pt
                res.append([start_pos, same_pt, dir])
            start_pos = i
            same_pt = 1
    print(res)
    # "vars are %d and %d." % (a, b)
    for r in res:
        a, b, c = r
        ans = "Time %d:Go straight %dm and turn %s" % (a, b * 100, c)
        answer.append(ans)
    # print(res)
    return answer


print(solution("EEESEEEEEENNNN"))

후기 

테케 2를 왜 안 봤을까..?

테케 2를 봤으면 풀 수 있었을 텐데 너무 아쉽네요..

그리고 방향 전환 같은 경우는 동서남북을 인덱스로 표시하고

+1 값이면 오른쪽 -1 값이면 왼쪽으로 하는 쉽게 할 수 도 있었습니다

당시에는 급해서 무식하게 했네요...

남은 2문제는 풀이할 겁니다

두 번째 문제는 이미 풀어놓은 상태고요..

예.. 다들 그럼 즐공!!

728x90