알고리즘

[알고리즘|파이썬] 백준 10157 자리배정

따오잉 2025. 2. 11. 00:13

문제 링크: https://www.acmicpc.net/problem/10157

 

📌 문제 탐색하기

시간 제한: 1초
메모리 제한: 256 MB

 

✏️ 구해야 하는 정답

문제

가로 C, 세로 R인 배열에 (1, 1)을 시작으로 시계 방향으로 1부터 C*R 까지 채워 넣어 자리 표를 만들게 된다.

이때 주어진 대기번호 K의 좌표를 구해야한다.

조건

- 5 ≤ C, R ≤ 1,000

- 1 ≤ K ≤ 100,000,000

- C*R 을 넘는 숫자에 대해서는 0 출력

 


📌 풀이하기 

예시

C = 4

R = 3

표를 펼쳐보면 이렇게 표현할 수 있다. R과 C만큼 돌면서 좌표를 (x, y)이라고 했을때 각각 (x, y+1), (x+1, y) 로 표현할 수 있게 된다.

이 좌표 리스트를 만들어 주어진 크기의 배치도를 만들고, 구해야 하는 k의 x, y 값을 출력하면 된다.

이때 주의할 점은 k는 1부터 시작하고, (x, y) 리스트의 인덱스는 0부터 시작하기 때문에 출력할때 k-1의 x, y 값을 출력해주어야 한다.

 


📌 코드 설계하기

1. c, r, k input 값을 받는다.

2. (x, y) 좌표를 담을 list를 생성한다.

3. c, r 만큼 돌면서 (x, y) 좌표에 x+1 또는 y+1 을 하도록 하여 list에 담는다.

4. arr[k-1][0], arr[k-1][1] 출력

4-1. k > c*r or k < 1 일 경우 0 출력

 


📌 시도 회차 수정 사항

1회차: 런타임 에러 (IndexError)

c, r = map(int, input().split())
k = int(input())

arr = list()
curr = (1, 0)

curr_r = r
curr_c = c - 1

r_flag = True
c_flag = True

while curr_r >= 0 and curr_c >= 0:
    for _ in range(1, curr_r + 1):
        if r_flag:
            curr = (curr[0], curr[1] + 1)
        else:
            curr = (curr[0], curr[1] - 1)
        arr.append(curr)

    for _ in range(1, curr_c + 1):
        if c_flag:
            curr = (curr[0] + 1, curr[1])
        else:
            curr = (curr[0] - 1, curr[1])
        arr.append(curr)
    r_flag = not r_flag
    c_flag = not c_flag
    curr_r -= 1
    curr_c -= 1

if k > c*r:
    print(0)
else:
    print(arr[k-1][0], arr[k-1][1])

k 가 c*r 범위를 넘는 경우에는 0을 출력하도록 예외 처리를 해두었지만, k 가 0보다 더 작은 경우에 대해서는 예외처리를 해두지 않아 index error가 났다. 

if k > c*r:
    print(0)
elif k < 1:
    print(0)
else:
    print(arr[k-1][0], arr[k-1][1])

예외 케이스 처리를 추가하여 해결하였다.


📌 정답 코드

c, r = map(int, input().split())
k = int(input())

arr = list()
curr = (1, 0)

curr_r = r
curr_c = c - 1

r_flag = True
c_flag = True

while curr_r >= 0 and curr_c >= 0:
    for _ in range(1, curr_r + 1):
        if r_flag:
            curr = (curr[0], curr[1] + 1)
        else:
            curr = (curr[0], curr[1] - 1)
        arr.append(curr)

    for _ in range(1, curr_c + 1):
        if c_flag:
            curr = (curr[0] + 1, curr[1])
        else:
            curr = (curr[0] - 1, curr[1])
        arr.append(curr)
    r_flag = not r_flag
    c_flag = not c_flag
    curr_r -= 1
    curr_c -= 1

if k > c*r:
    print(0)
elif k < 1:
    print(0)
else:
    print(arr[k-1][0], arr[k-1][1])