티스토리 뷰
문제
10157번: 자리배정
첫 줄에는 공연장의 격자 크기를 나타내는 정수 C와 R이 하나의 공백을 사이에 두고 차례대로 주어진다. 두 값의 범위는 5 ≤ C, R ≤ 1,000이다. 그 다음 줄에는 어떤 관객의 대기번호 K가 주어진다.
www.acmicpc.net
풀이
이번 시즌 풀었던 코테문제와 상당히 유사했던 문제 (미리 풀어볼걸)
이 문제는 달팽이수열의 기본적인 문제인데, 달팽이 수열이란 순서대로 빙글빙글 돌며 채운 행렬을 뜻한다.
1~6까지 위 방향 (R-0개)
7~12까지 오른쪽 방향 (C-1개)
13~17까지 아래 방향 (R-1개)
18~22까지 왼쪽 방향 (C-2개)
23~26까지 위 방향 (R-2개)
...
이런식으로 반복되는 규칙을 갖고 있다.
R, C가 순서대로 반복되고, i가 2번에 1씩 증가한다.
문제에서는 인풋으로 받는 숫자 K의 좌표를 리턴해야했다.
먼저 처음 한번을 제외하고는 R-i, C-i에서 i가 2번씩 쓰이기 때문에 K가 R보다 작거나 큰 경우와,
K가 R * C 의 범위를 벗어난 경우에도 예외 처리를 해줬다.
그 후에는 포문으로 계속 돌리면 시간초과가 날 것 같아서 각 모서리를 찾기위해 규칙을 찾아 더해줬다.
(예. 11을 찾아야하면 그 라인의 모서리인 12찾은 후 왼쪽으로 1 가기 (12의 좌표에서 x좌표 -1 해주기))
cur_num는 모서리값을 저장했고
c는 boolean 타입으로 c차례인지, r차례인지
rev는 -1 or 1로 (위/오른쪽)인지 (아래/왼쪽)인지를 판단했다.
코드 정리를 안해서 코드가 좀 더럽긴 하지만.. 해결완료!
import sys
C, R = map(int, sys.stdin.readline().split(" "))
K = int(sys.stdin.readline())
if K > C * R:
print(0)
elif K <= R:
print(1, K)
else:
cur_num = R
cur_coord = [1, R]
index = 1
c = True
rev = 1
reverse = True
while cur_num < K:
if c:
cur_num += (C - index)
cur_coord = [cur_coord[0] + rev * (C - index), cur_coord[1]]
rev *= -1
c = False
else:
cur_num += (R - index)
c = True
cur_coord = [cur_coord[0], cur_coord[1] + rev * (R - index)]
index += 1
reverse = not reverse
if cur_num == K:
print(cur_coord[0], cur_coord[1])
else:
diff = K - cur_num
if c:
if reverse:
cur_coord = [cur_coord[0], cur_coord[1] + diff]
else:
cur_coord = [cur_coord[0], cur_coord[1] - diff]
else:
if reverse:
cur_coord = [cur_coord[0] + diff, cur_coord[1]]
else:
cur_coord = [cur_coord[0] - diff, cur_coord[1]]
print(cur_coord[0], cur_coord[1])
- Total
- Today
- Yesterday
- flutter simultor
- Kotlin
- 백준 2003
- 코틀린 뷰페이저
- 코틀린
- 코틀린 뷰바인딩
- 카카오톡으로 로그인 오류
- 투포인터 알고리즘
- 코틀린 리스트뷰
- 소수 구하기 파이썬
- 백준
- 코틀린 데이터바인딩
- 전화번호목록 파이썬
- TextFormField keyboard
- 투포인터 알고리즘 파이썬
- 안드로이드
- 백준 1644
- 카카오 키해시
- 안드로이드 카카오톡으로 로그인
- 카카오 기출
- 코틀린 바텀네비게이션
- counting sort
- kotlin fragment
- 백준알고리즘
- 안드로이드 키해시
- 데이터바인딩 뷰바인딩 차이
- 파이썬 최대공약수
- 시뮬레이터 키보드
- 프로그래머스
- 백준 1806
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 |