Notice
Recent Posts
Recent Comments
Link
| 일 | 월 | 화 | 수 | 목 | 금 | 토 |
|---|---|---|---|---|---|---|
| 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 |
Tags
- 백준 2012
- 백준 십자카드 문제
- 백준 자리배정
- 백준18352
- 백준
- 백준 1713
- 백준 지구 온난화
- 백준 13901
- 백준 4803
- 백준 주사위 쌓기
- 백준2823
- 알고리즘
- 백준 트리
- 눈높이개발
- 백준 최소비용 구하기
- 백준18230
- 백준 유턴 싫어
- 백준 등수매기기
- 예쁜타일링
- 파이썬
- 백준 10157
- 백준 로봇
- 백준2116
- Python
- 백준 특정거리의도시찾기
- 백준 2659
- 14247
- 백준 후보 추천하기
- 백준13164
- 백준 5212
Archives
- Today
- Total
개발 기록
[알고리즘|파이썬] 백준 10157 자리배정 본문
문제 링크: 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])'알고리즘' 카테고리의 다른 글
| [알고리즘|파이썬] 백준 1713 후보 추천하기 (0) | 2025.02.13 |
|---|---|
| [알고리즘|파이썬] 백준 5212 지구 온난화 (0) | 2025.02.12 |
| [알고리즘|파이썬] 백준 13164 행복 유치원 (0) | 2025.02.10 |
| [알고리즘|파이썬] 백준 18230 2xN 예쁜 타일링 (0) | 2025.02.09 |
| [알고리즘|파이썬] 백준 14247 나무 자르기 (0) | 2025.02.08 |