티스토리 뷰

728x90

thinking

도착점의 column 인덱스를 찾아서 역으로 위로 올라가면서 시작점의 column 인덱스를 찾는 방향으로 설정

 

1. 위로 가는 경우: 왼쪽이나 오른쪽이 1이 나오면 direction 체인지

2. 오른쪽으로 가는 경우: 쭉 가다가 0 나오면 위로 턴 (d: 1 -> 0)

3. 왼쪽으로 가는 경우: 쭉 가다가 0 나오면 위로 턴 (d: 2 -> 0)

 


반복문을 돌리면서 이동해야 하는데 코드를 도대체 어케 짜야 하는지 감이 안왔다......
그래서 아래 처럼 그림판으로 일일이 좌표를 찾으며 디버깅을 했다 ^^
100 x 100 배열이라 눈알 빠질뻔 ㅎ;; 답답하고 멍청해보일지라도 이해에 아주 직빵이었다 ㅎ

 

 

 

 

위로 쭉 갈때는 column은 동일하고 row만 바뀐다. 이때, 왼쪽이나 오른쪽이 1이면 그 방향으로 꺾어야한다.

 

방향 전환은 왼쪽 아니면 오른쪽이므로 두번의 if문이 아닌 if~elif 문으로 설정하여 첫 if문을 빠져나와도 다음 조건문에 해당하지 않도록 설정했다. 만약 왼쪽 오른쪽 각각 두번의 if 문을 사용하면 (6,2) -> (6,7)까지 이동했다가 다시 (6,7) -> (6,2)로 이동하는 대참사가 발생한다.

 

오른쪽으로 꺾으려면 현재 column의 오른쪽 값이 1이기 때문에 a[r][c+1] == 1이라는 조건을 설정했고, 방향 전환을 위해 d를 1로 설정했다.

 

이때 반복문을 빠져나오지 않고 계속 오른쪽으로 가기 위해 while 반복문을 돌렸고 (6,8)처럼 그 다음 열이 0이라면 반복문을 종료하도록 break를 걸어줬다.

 

왼쪽 역시 마찬가지로 동일하게 설정하되, 왼쪽이므로 a[r][c-1] == 1이라는 조건을 설정했고, 방향 전환을 위해 d를 2로 설정했다. 마찬가지로 (3,3)처럼 그 다음 열이 0이라면 반복문을 종료하도록 break를 걸어줬다.

 

왼쪽, 오른쪽 이동이 아니라면 무조건 위로 직진하도록 조건문 하단에 위쪽 방향의 direction(d = 0)을 설정했다.

 

초기 row 인덱스를 99로 초기화해주고 while문 돌리다가 row 인덱스가 0이 되면 반복문 종료하고 출력하도록 break 를 설정해줬다.

 

 

  완전 중요한 포인트는 이동은 우리가 보는 화면 방향 그대로라는 것이다 !  

오른쪽으로 쭉 가다가 방향을 꺾을때 왼쪽으로 턴한거 같지만 배열의 인덱스로 보면 row 인덱스가 하나 감소했기 때문에 위로 이동한다고 봐야된다 ! (왼쪽 역시 마찬가지)

그림 안그리고 머리속으로 생각했을 때 여기서 계속 막혔다... 코드의 조건이 너무 많아지는게 아닌가 엄청 고민했는데 알고보니 내가 멍충한것이었음 😇

 

 

코드

import sys
sys.stdin = open("input.txt")

# direction 설정 (위, 오, 왼)
dr = [-1, 0, 0]
dc = [0, 1, -1]

T = 10
for tc in range(1, T+1):
    t = int(input())
    # 양 끝에 벽을 세워주기 위해 0 컬럼 추가
    a = [[0] + list(map(int, input().split())) + [0] for _ in range(100)]

    # c: 도착점 column idx 구하기
    for j in range(102):
        if a[99][j] == 2:
            c = j

    # 방향 위로 초기화
    d = 0  # 0: 위, 1: 오, 2: 왼
    r = 99
    while True:
        # 반복문 계속 돌리다가 row 인덱스가 0 이 되면 끝내고 리턴
        if r == 0:
            break

        # 왼쪽에 1이 있으면 왼쪽으로 계속 가다가 0 나오면 반복문 종료
        if a[r][c-1]:
            d = 2
            while True:
                r += dr[d]
                c += dc[d]
                if a[r][c-1] == 0:
                    break

        # 오른쪽에 1이 있으면 오른쪽으로 계속 가다가 0 나오면 반복문 종료
        elif a[r][c+1]:
            d = 1
            while True:
                r += dr[d]
                c += dc[d]
                if a[r][c+1] == 0:
                    break

        # 양옆에 1 하나도 없으면 계속 직진(i.e. d=0) 또는
        # 왼쪽이든 오른쪽이든 가다가 next col에서 0이면 d=0(위)로 체인지
        d = 0
        r += dr[d]
        c += dc[d]

    print("#{} {}".format(t, c-1))
댓글