yha97 2023. 6. 14. 09:45

날짜 : 2023. 06. 14

사용 언어 : python

 

문제

https://www.acmicpc.net/problem/10157

 

 

코드

import sys

r, c = map(int, sys.stdin.readline().split())  # 그래프 크기 (90도 회전했다고 가정 후 입력)
k = int(sys.stdin.readline())  # 대기번호
if k > (c * r) :  # 불가능
    print(0)
    exit()

graph = [[0] * c for _ in range(r)]
dx = [0, 1, 0, -1]  # 시계방향 : 동->남->서->북
dy = [1, 0, -1, 0]
dir = 0  # 기본방향
now = [0, -1]   # 배정할 위치
res = 0  # 대기번호

while res < k:
    res += 1
    # print(res, now)
    while True:
        nx = now[0] + dx[dir]  # 다음위치
        ny = now[1] + dy[dir]
        if nx in range(r) and ny in range(c):  # 범위 포함
            if graph[nx][ny] == 0:
                graph[nx][ny] = res
                now = [nx, ny]  # 위치 갱신
                break
            else:
                dir = (dir + 1) % 4
        else:  # 범위 이탈 -> 시계방향 전환
            dir = (dir + 1) % 4
print(now[0]+1, now[1]+1)

 

 

풀이

- 기본 문제는 일반적인 좌표평면처럼 입력받았기 때문에, 계산을 편하게 하기 위해 90도 시계방향으로 회전시킨 것을 전제로 입력받았다.(문제에서는 c, r => 풀이를 위해 r, c)

- 그 다음 시계방향으로 회전하기 때문에 동 -> 남 -> 북 -> 서 형식으로 이동시킬 dx, dy 리스트를 만들고 dir 변수를 통해 진행방향을 설정

- while문을 통해 현재 이동방향을 증가시키고, 이동할 그래프 좌표가 이미 선점했거나, 범위를 이탈한 경우 방향을 전환, 아니라면(graph 값이 0) 방향을 전환하지 않고, now값과 graph의 해당 인덱스의 값을 갱신하는 방식으로 진행했다.

 

 

알게된 점

- 90도 돌리는 과정에서 맨 처음에 c, r을 입력받는데 계속 이상한 값이 나왔다.

- 그래서 태블릿에 그려서 풀어보니 r, c로 입력받아야 하는 것을 확인, 바로 풀렸다.

 

 

참고 사이트