[백준] 10250번 - ACM 호텔
참고: https://www.acmicpc.net/problem/10250
✔️ 문제
문제는 다음과 같다.
✔️ 풀이
T개의 테스트 케이스에서 12x6 크기 만큼의 호텔이 있을 때,
10번째로 도착한 손님은 402호를 배정받는다.
이는 101,201,301...102,202,302,402 이렇게
1층부터 6층까지 1호를 6번을 돌고,
1층부터 4층까지 2호를 4번 돌아서 배정받는 것이다.
이에 대해서 여러가지 코드를 작성해보았다.
import sys
T=int(input())
for _ in range(T):
h,w,n=map(int, sys.stdin.readline().split())
hotel=[[(i+1)*100+(j+1) for j in range(w)] for i in range(h)]
while count<n:
if y<h:
y+=1
elif y==h:
y=0
x+=1
count+=1
print(hotel[y][x])
처음에는 101호부터 받은 수만큼 2차원 배열로 저장해서
해당 인덱스에 있는 값을 가져오려고 했다.
이렇게 하니까 인덱스 에러가 발생했다.
import sys
T=int(input())
for _ in range(T):
count=0
x,y=1,1
h,w,n=map(int, sys.stdin.readline().split())
while count<n:
if y<h:
y+=1
elif y==h:
x+=1
y=1
count+=1
if len(str(x))==1:print(f'{y-1}0{x}')
else:print(f'{y-1}{x}')
두 번째는 인덱스가 아닌 바로 값을 출력하는 형태로
코드를 작성하였는데, 이는 메모장에 쓰면서 생각나게 되었다.
규칙을 알아내기 위해서 작성하던 중 n을 h로 나눈 나머지와
n을 h로 나눈 몫에 1을 더한다는 규칙을 발견했다.
이렇게 코드를 작성하게 되면 예제에 나온 반례는 맞게 되지만,
1
10 10 100
10 10 99
에 해당하는 반례에서 틀리게 되었었는데,
여러가지 반례를 질문 게시판에서 찾아보고
무엇이 틀렸는지에 대해서 살펴보기 시작했고
다양한 반례에 맞게끔 코드를 수정하였다.
import sys
T=int(input())
for _ in range(T):
h,w,n=map(int, sys.stdin.readline().split())
y=n%h
x=n//h
if y==0:
if len(str(x))==1:print(f'{h}0{x}')
else:print(f'{h}{x}')
elif len(str(x+1))==1:print(f'{y}0{x+1}')
else:print(f'{y}{x+1}')
이전 코드와 다른 것은 나머지가 0일때는
나눈 나머지가 출력이 되어서 찾아본 반례 중
1
6 12 6
에 해당하는 출력이 002로 나오는 것을 확인할 수 있었다.
즉, 나머지가 0일때 y에 넣게 되면 602가 나와야하는 것이
002로 출력되어서 실패하는 것이었다.
그래서 y가 0일때는 그대로 높이 h를 출력해주고
x가 한자릿수이면 0을 붙히고, 아니면 그대로 출력한다.
그리고 나머지는 똑같은 내용이고,
여기서 x가 9일때 09가 아닌 10이 출력되는 경우가 있기에
x+1에 해당하는 자릿수가 1일때만 0을 붙힌 x+1을 출력하면 된다.
제출한 코드가 280B 가량이었는데, 100 후반대의 코드 길이가
있는 것을 보고 코드 정리, 코드의 효율을 생각해볼 필요가 있는 듯하여
맞은 사람의 코드를 공부해보는 시간을 가졌다.
그 중, 두 번째 코드와 흐름이 비슷했던 코드를 발견할 수 있었는데
room=1
while n > h:
n-=h
room+=1
print(100*n+room)
작성한 두 번째 코드와의 차이점은 명확했다..
n이 높이보다 클 때동안 n에 높이 값을 빼주고
호실은 더해주어 호실은 101호부터 시작하는 3자릿수이기 때문에
해당 높이에 100을 곱하고 호실을 더하는 순으로..
너무 복잡하게 생각해도 안되는 듯 하다고 느끼게 되었다.
화이팅 💪