python/문제

[백준/10250]ACM 호텔

allen15590 2021. 1. 30. 02:00
728x90

◯문제 링크

 

[백준/10250]ACM 호텔

 

◯코드 미리보기

T = int(input())


for i in range (T):
    H,W,N = map(int,input().split( ))
    Y=1
    X=1
    #H:층,W:방번호,N:몇번째 손님
    FullH = H
    while(1):
        if FullH > N :
            Y = N - (FullH - H)
            print("%d%02d"%(Y,X))
            break
        elif FullH == N:
            Y = H
            print("%d%02d"%(Y,X))
            break
        X += 1
        FullH += H

 

 

 

설명

예전에 글이 긴 문제는 그 핵심을 먼저 파악해야 한다고 배웠었다. 그래서 글을 꼼꼼히 읽으면서 맥락부터 파악하려고 노력했다. 그래서 알아낸것이 층들이 먼저 증가하고 층이 꼭대기 층까지 도달하면 방숫자를 하나 증가시킨다는 것이다.

그래서 떠오른 생각이 print를 할 때 Y,X를 따로따로 계산하고 출력할 때만 붙여주면 되겠다는 것이었다.

 

T = int(input())

먼저 문제에서 제시하는 Test횟수를 입력받는다.

 

for i in range(T)

제시받은 T만큼 코드를 반복시킨다.

H,W,N = map(int,input().split( ))
Y=1
X=1
FullH = H

H,W,N은 문제에서 제시된 변수들로, 각각 호텔의 층, 호텔의 방번호, .N번째 손님을 의미한다. 

Y와 X는 문제에서 제시되어있는 YYXX에서 따왔는데, Y는 층을 의미하고 X는 방번호를 의미한다.

CaseBreak는 반복문에서 탈출을 위해 사용한 변수인데, 나중에 해당 부분이 나오면 설명하겠다.

FullH는 H의 값을 계속 증가시키기 위한 변수이다. 사실 이전에 풀었던 문제들에서 while(1)무한루프와 if문을 활용한 조건 반복을 많이 사용했어서 자연스럽게 또 사용하게 되었다. 반복이 걱정되긴했는데, 일단 시간제한이 걸리면 그 때 가서 코드를 수정하자는 마인드였다. 

 

    while(1):
        if FullH > N :
            Y = N - (FullH - H)
            print("%d%02d"%(Y,X))
            break
        elif FullH == N:
            Y = H
            print("%d%02d"%(Y,X))
            break
        X += 1
        FullH += H

이렇게 위에 제시된 변수들을 활용해서 방을 찾는 코드르 짯다.

첫번재 if문부터 설명하자면 FullH가 N보다 커질 때 실행되는 코드이다.

일단 Y값을 구한다. FullH가 N보다 커져서 코드가 실행되는 것이기 때문에 일단 이전에 저장되있는 FullH의 값을 불러오기 위해서 H를 빼주었다. 그리고 그 숫자를 N(N번째 손님)에서 빼준다. 이렇게 하면 이전에 사람이 다 찬 방들이 있는 칸들은 다 빠지고 손님이 들어갈 층이 나오게 된다. FullH를 늘리면서 X값도 1칸씩 늘리면은 방번호가 하나씩 증가하게 된다. 이렇게 구해진 Y와 X를 %d를 활용해서 출력하면 된다. 주의할 점은 X는 두자리로 출력해야 하기 때문에 %02d로 사용해 주어야 한다는 것이다. 

하지만 문제가 하나 있다. 바로 FullH와 N의 같을 경우에는 값이 0이되서 층이 0으로 출력된다는 것이다.

그래서 elif로 조건을 하나 더 세워서 값이 같을 경우를 따로 계산하였다. 위의 부분이랑 다른 것은 표시해야 하는 방이 꼭대기 층이기 때문에 Y값에 H를 넣어주어야 한다. print값은 기존과 동일하다.

 

 

 

이렇게 내 코드는 끝이 났다. 이제부터는 내 친구의 코드인데, 내가 짠 코드보다 간단한 코드라서 올려본다.

Height = 0
Width = 0
Number = 0

for i in range(int(input())):
    Height, Width, Number = map(int, input().split())
    Count = 0
    while(Number > Height):
        if(Number > Height):
            Number -= Height
            Count += 1
    print(Number, end='')
    print("%02d"%(Count+1))

내 코드와는 가장 중요한 점이 다른데, 나는 층이 손님의 수를 넘을 때까지 계속해서 더했다면(일종의 등차수열), 친구는  몇번째 손님인지에서 층을 계속해서 뺏다는 것이다. 결과적으로 더 짧은 코드가 나왔다.

 

배운 것

⩥문자열 포매팅을 사용할 때 자릿수까지 고려해서 출력하는 방법을 배웠다(%02d)

 

728x90