문제
손님이 도착하는 대로 빈 방을 배정하고 있다.
호텔 정문으로부터 걷는 거리가 가장 짧도록 방을 배정하는 프로그램을 작성하고자 한다.
호텔은 직사각형 모양이라고 가정하자. 각 층에 W개의 방이 잇는 h층 건물이다. 엘레베이터는 가장 왼쪽에 있다. 이런 형태의 호텔을 HxW 형태 호텔이라고 부른다.
호텔 정문은 1층 엘레베이터 바로 앞에 있다. 정문에서 엘레베이터까지의 거리는 무시하고 인접한 두방 사이의 거리는 모두 1이다.
방 번호는 YXX 또는 YYXX형태이며 Y나 YY는 층 수 XX는 엘리베이터에서부터 세웠을 때의 번호를 나타낸다.
손님은 엘레베이터를 타고 이동하는 거리는 신경쓰지 않는다.
다만 걷는 거리가 같을 때에는 아래층의 방을 더 선호한다.
초기에는 모든 방이 비어있고 N번째로 도착한 손님에게 배정될 방 번호를 계산하는 프로그래믕ㄹ 작성하라
입력
첫째 줄에 테스트 케이스가 주어진다.
각 테스트 케이스는 H, W, N 세정수를 입력한다.
출력
N번째 손님이 배어받은 방번호를 출력한다.
접근
엘레베이터를 타고 가는 것은 거리에 합산하지 않고 거리가 같을 때는 아래층을 선호하기 때문에 1층부터 마지막층까지 있는 1호 객실을 채우고 그 다음 2호객실을 채우는 식으로 접근하였다.
구현
호텔의 정보를 입력받아 빈 객실을 hotel에 표현하였다.
세로축 0은 엘레베이터다.
H, W, N = map(int, input().split())
hotel = [[0 for _ in range(W+1)] for _ in range(H+1)]
idx는 손님들의 번호를 나타내며 cy, cx는 N번째 손님의 위치를 반환한다.
객실을 채울 때마다 idx를 증가시키고 idx가 N이된다면 손님의 위치를 반환하도록 한다.
idx = 0
cy = cx = 0
for x in range(1, W+1):
for y in range(1, H+1):
idx += 1
hotel[y][x] = 1
if idx == N:
cy = y
cx = x
break
if cy != 0 and cx != 0:
break
N번째 손님의 객실번호를 반환해야한다. cy의 경우 바로 문자형으로 변환만 해주면 되지만 cx의 경우 1일 때 앞에 0을 채워줘야한다. XX는 무조건 2자리이기 때문에 rjust()를 통해 2자리로 맞춰주고 앞에 0을 붙인다.
answer = ''
answer += str(cy)
answer += (str(cx).rjust(2,'0'))
print(answer)
전체 코드
test_case = int(input())
for _ in range(test_case):
H, W, N = map(int, input().split())
hotel = [[0 for _ in range(W+1)] for _ in range(H+1)]
idx = 0
cy = cx = 0
for x in range(1, W+1):
for y in range(1, H+1):
idx += 1
hotel[y][x] = 1
if idx == N:
cy = y
cx = x
break
if cy != 0 and cx != 0:
break
answer = ''
answer += str(cy)
answer += (str(cx).rjust(2,'0'))
print(answer)
'알고리즘 풀이 > 백준' 카테고리의 다른 글
[백준 2775] 부녀회장이 될테야 (0) | 2021.02.19 |
---|---|
[백준 2292] 벌집 (0) | 2021.02.19 |
[백준 1085] 직사각형에서 탈출 (0) | 2021.02.19 |
[백준 11724] 연결 요소의 개수 (0) | 2021.02.18 |
[백준 1003] 피보나치 함수 (0) | 2021.02.18 |