문제 링크
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)
t = 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)
t = int(sys.stdin.readline().rstrip())
for _ in range(t):
solve()
|
cs |
제가 이러한 규칙을 찾을 수 있었던 이유는 경험 덕분입니다. 이전에도 이런 비슷한 경우를 본 적이 있었기 때문입니다.
풀이 영상에서도 간단하게 이야기 했지만, 둘 중에 어느 코드가 더 낫냐고 묻는다면 그 답변은 "it depends" 가 될 것입니다.
상황에 따라 다르다는 것이죠.
두 번째 코드는 더 간결하고 분기문도 없습니다. 따라서 더 빠르게 실행될 것입니다. 즉, 컴퓨터 입장에서 더 좋아하는 코드입니다. 그러면 두 번째 코드가 더 좋은 코드일까요?
만일 이 코드를 작성하고 당신은 이 회사를 퇴사해다고 생각해봅시다. 다른 부분에 대해서는 문서화를 해두었지만, 뛰어난 프로그래머인 당신은 이러한 간단한 이치(규칙)는 누구나 쉽게 이해할 수 있다고 생각하고 이 코드가 왜 저렇게 되었는지에 대한 문서는 남기지 않았다고 해보겠습니다.
새롭게 이 코드를 담당하게 된 개발자는 이런 경험이 부족하여 저 코드가 도저히 무슨 뜻인지 이해가 되지 않을 수 있습니다. 따라서 이 코드를 유지보수하는 것을 포기하고 legacy 로 분류하게 됩니다.
좀 극단적이긴 하지만, 충분히 가능한 시나리오이고, 실제로 현실 세계에서 여전히 많이 발생하는 일입니다.
따라서 훌륭한 개발자라면, 두 가지 방안을 모두 두고 스스로 처한 상황에 따라 적절한 코드를 선택할 수 있어야 합니다.
풀이는 아래 영상을 참고 바랍니다.
https://www.youtube.com/watch?v=LfJYKfRFT3s
저작권 라이선스: CC BY (출처만 표시하면 자유롭게 이용 가능)
'백준(BOJ) 문제 풀이' 카테고리의 다른 글
백준 31403번 문제(A + B - C) 파이썬(Python) 풀이 [로밍맨] (0) | 2025.01.04 |
---|---|
백준 27866번 문제(문자와 문자열) 파이썬(Python) 풀이 [로밍맨] (0) | 2024.11.18 |
백준 25083번 문제(새싹) 파이썬(Python) 풀이 [로밍맨] (94) | 2023.12.01 |
백준 2588번 문제(곱셈) 파이썬(Python) 풀이 [로밍맨] (0) | 2023.11.13 |
백준 10430번 문제(나머지) 파이썬(Python) 풀이 [로밍맨] (0) | 2023.06.09 |