본문 바로가기
Problem Solving

[백준] 10250 ACM 호텔 python 알고리즘 문제

by DuncanKim 2022. 4. 20.
728x90

문제 10250. ACM 호텔

 

1. 나의 코드와 발상 과정 (오답)

## 오답 1.

t = int(input())
ans_list = []
for i in range(t):
    h, w, n = map(int,input().split())
    if n // h + 1 < 10 and n % h != 0 :
        answer = str(n % h) + '0' + str(n // h + 1)
    elif n // h + 1 < 10 and n % h == 0 :
        answer = str(h) + '0' + str(n // h)
    else :
        if h == 1 and n // h + 1 < 10:
            answer = str(h) + '0' + str(w)
        elif h == 1 and w >= 10:
            answer = str(h) + str(w)
        elif n // h + 1 >= 10 or h > 9 :
            answer = int(str(n % h) + str(n // h + 1))

        else : 
            answer = int(str(n % h) + '0' + str(n // h + 1))
    ans_list.append(answer)

for ans in ans_list:
    print(ans)




# 오답 2.
t = int(input())

sco_list = []
for i in range(t):
    h, w, n = map(int,input().split())
    sco_list.append([h, w, n])

ans_list = []
r_ans_list = []
for i in range(len(sco_list)):
    for j in range(sco_list[i][1]) :        
        for k in range(sco_list[i][0]):
            if j < 9 :
                ans_list.append(str(j+1) + '0' + str(k+1))
            else :
                ans_list.append(str(j+1) + str(k+1))
    r_ans_list.append(ans_list[int(sco_list[i][2])-1])
    ans_list = []

for i in range(t):
    print(r_ans_list[i])

 

이 문제는 정말 오래 고민했지만 풀지 못한 문제이다. (반례 때문에...)

층, 호수, 몇 번째 손님인지를 고려하여 그 손님이 머무를 방의 호수를 출력하라는 문제였다.

 

엘리베이터 거리와 제일 가까운 방을 선호하기 때문에 각층의 xx01호부터 차게 되어있다.

만약 3층에 3호까지 있는 건물이라면

101 - 201 - 301 - 102 - 202 - 302 ... - 303

이런식으로 사람이 들어차게 된다.

 

그러면, n에서 h를 나눈 몫을 가지고 호수를 정할 수 있을 것이다.

그런다음 층수와 호수를 문자열로 합을 해주면 될 것이다.

 

그런데 여기서 나는 오답에 썼듯 많은 반례들을 가지고 씨름하고 싸우고 왔다.

그랬더니 괴물 코드가 입력되어 버렸다. 

 

2. 고수님의 깔끔한 코딩

t = int(input())

for i in range(t):
    h, w, n = map(int, input().split())
    num = n//h + 1
    floor = n % h
    if n % h == 0: 
        num = n//h
        floor = h
    print(f'{floor*100+num}')

 

... 간결하게 호수를 찾으시고는 층수를 '나머지'를 활용해 찾고, 

n이 h의 배수일 때, 즉 9와 3일 때, 

num = n//h + 1 를 그때만 n//h으로 바꾸어주는 모습을 보인다. 

....

그러고는 층수에 100을 더하고, 그냥 넘버를 붙여버리는 식의 중간 '0' 해결도 해버렸다.

 

대단하다.

 

3. 아쉬운

정확한 수학 구현이 되지 않아 많이 헤맨것 같다.

시간이 많이 걸리더라도 하나하나 필요한 조건들을 모두 생각해내고,

그것을 적용하는 정석적인 논리적 접근법을 더 연습해야 할 것 같다.

 

728x90

댓글