백준(BOJ) 문제 풀이

백준 10250번 문제(ACM 호텔) 파이썬(Python) 풀이 [로밍맨]

로밍맨 2025. 1. 16. 20:30
728x90
반응형

문제 링크

https://www.acmicpc.net/problem/10250

 

이 문제는 상당히 쉬운 문제이면서도 함정(?)이 있는 문제입니다.

다른 모든 층들에서는 주어진 n 에 대하여 h 로 나눈 뒤, 몫에다가 1을 더한 값이 방 번호가 되고, 나머지가 층이 되는데,

가장 높은 층에 대해서는 몫이 방 번호가 되고, 나머지가 0이 될텐데, 이 경우에 h 값이 층이 됩니다.

이러한 패턴을 파악하게 되면, 코드는 어렵지 않게 작성할 수가 있습니다.

n 이 h 로 나누어 떨어지는 경우와 그렇지 않은 경우로 나누어서 풀면 간단하게 다음과 같이 풀립니다.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
import sys
 
def solve():
    h, w, n = map(int, sys.stdin.readline().rstrip().split())
    if n % h == 0:
        q = n // h
        print(h * 100 + q)
    else:
        q = n // h
        r = n % h
        print(r * 100 + q + 1)
 
= int(sys.stdin.readline().rstrip())
for _ in range(t):
    solve()
cs

 

하지만 이런 경우 좀 더 곰곰이 생각해보면, 분기를 없앨 수 있는 규칙을 찾을 수 있습니다.

n 에서 1을 뺀 값에 대하여 몫과 나머지를 구하고, 몫에다가 1을 더한 값이 방 번호, 나머지에다가 1 더한 값이 층이 된다는 것을 알 수 있습니다.

이러한 규칙을 이용하여 다음과 같이 정답 코드를 작성할 수 있습니다.

1
2
3
4
5
6
7
8
9
10
11
12
import sys
 
def solve():
    h, w, n = map(int, sys.stdin.readline().rstrip().split())
    q = (n - 1// h
    r = (n - 1) % h
    print((r + 1* 100 + q + 1)
 
= int(sys.stdin.readline().rstrip())
for _ in range(t):
    solve()
 
cs

 

 

728x90

 

제가 이러한 규칙을 찾을 수 있었던 이유는 경험 덕분입니다. 이전에도 이런 비슷한 경우를 본 적이 있었기 때문입니다.

 

풀이 영상에서도 간단하게 이야기 했지만, 둘 중에 어느 코드가 더 낫냐고 묻는다면 그 답변은 "it depends" 가 될 것입니다.

상황에 따라 다르다는 것이죠.

 

두 번째 코드는 더 간결하고 분기문도 없습니다. 따라서 더 빠르게 실행될 것입니다. 즉, 컴퓨터 입장에서 더 좋아하는 코드입니다. 그러면 두 번째 코드가 더 좋은 코드일까요?

만일 이 코드를 작성하고 당신은 이 회사를 퇴사해다고 생각해봅시다. 다른 부분에 대해서는 문서화를 해두었지만, 뛰어난 프로그래머인 당신은 이러한 간단한 이치(규칙)는 누구나 쉽게 이해할 수 있다고 생각하고 이 코드가 왜 저렇게 되었는지에 대한 문서는 남기지 않았다고 해보겠습니다.

새롭게 이 코드를 담당하게 된 개발자는 이런 경험이 부족하여 저 코드가 도저히 무슨 뜻인지 이해가 되지 않을 수 있습니다. 따라서 이 코드를 유지보수하는 것을 포기하고 legacy 로 분류하게 됩니다.

좀 극단적이긴 하지만, 충분히 가능한 시나리오이고, 실제로 현실 세계에서 여전히 많이 발생하는 일입니다.

 

따라서 훌륭한 개발자라면, 두 가지 방안을 모두 두고 스스로 처한 상황에 따라 적절한 코드를 선택할 수 있어야 합니다.

 

풀이는 아래 영상을 참고 바랍니다.

https://www.youtube.com/watch?v=LfJYKfRFT3s

 

저작권 라이선스: CC BY (출처만 표시하면 자유롭게 이용 가능)

728x90
반응형