제목에 써있는 그대로 조금 햇갈렸던 문제이다.
문제를 푸는데 있어서 이 문제야말로 구현이 어려운 것이 아니라 규칙을 찾는 컴퓨팅적 사고 및 논리력이 필요한 문제가 아닌가 싶다.
즉, 문제를 제대로 이해하고 반례까지 없도록 잘 만드는 것이 관건이다.
나는 일부만 제대로 하고, 반례가 생기도록 처음에 만들어서 고생했다.
나의 첫 시도(잘못된 코드)는 다음과 같다:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
|
# 틀렸다고 나오는 코드
# 1 1 1 ==> 답 101 ==> 출력 102
a = int(input())
for i in range(a): # 몇 개의 출력물을 원하는가
H, W, N = map(int, input().split()) #입력
hundred = int(N % H) #몇 층인지 찾기(백의 자리수 시작)
decimal = int(N // H) + 1 #몇 호인지 찾기(일의 자리수 시작)
if (hundred == 0): # 예를 들어, N층인데 나머지가 0이면, N을 출력한다.
hundred = H
if(len(str(decimal)) == 1): # 일의 자리수 시작해서 십의자리까지 넘어가지 않으면(==> 1~9이면)
print(f"{hundred}0{decimal}") # 0을 십의 자리수에 출력한다.
else:
print(f"{hundred}{decimal}") # 십의자리수까지 출력한다.
else:
if(len(str(decimal)) == 1):
print(f"{hundred}0{decimal}")
else:
print(f"{hundred}{decimal}")
|
cs |
이 코드의 반례는 1 1 1이다. 101이라는 숫자가 나와야 하는데 decimal = int(N//H)+1을 해버렸기 때문에 틀려버렸다.
추가적으로, if~else문을 통해서 print문을 복잡하게 짠 것도 가독성이 떨어지며 속도에도 별로 좋지 않다.
고민을 하고 인터넷을 검색한 결과 다음과 같은 코드가 깔끔하다는 것을 깨닫게 되었다.
1
2
3
4
5
6
7
8
9
10
11
12
|
a = int(input())
for i in range(a):
H, W, N = map(int, input().split())
hundred = N % H
if (hundred == 0):
hundred = H * 100
decimal = N // H
else:
hundred = (N % H) * 100
decimal = N // H + 1
print(hundred + decimal)
|
cs |
딱 봐도 깔끔하다. 특히, 내가 위에서 틀린 부분이 확연히 보인다.
decimal이라고 되어있는 부분은 hundred변수가 0일 때와 아닐 때에 따라서 다르게 처리가 되도록 해야한다.
이 문제의 경우, 구현의 문제나 파이썬이라는 공부에 있어서의 문제라기보다 논리적 해결의 차원에 문제로 분석할 수 있다 (물론 매우 간단한 문제이지만...).
이런 형태의 문제가 있음을 인지하고, 끊임없이 컴퓨팅적 사고를 기를 필요성을 다시 한 번 느끼게 된다.
'코딩 문제풀이 및 연습 > Python 연습' 카테고리의 다른 글
[백준] 2747_피보나치 수 파이썬 (0) | 2021.07.27 |
---|---|
[백준] 1032_명령 프롬프트 파이썬 (너무 어렵게 생각하지 말자) (0) | 2021.07.27 |
[백준] 4153_직각삼각형 파이썬 (0) | 2021.07.24 |
[백준] 1247_부호 파이썬 (sys.stdin.readline()으로 풀어야 하는 문제) (0) | 2021.07.23 |
[백준] 11718번 그대로 출력하기 파이썬 (에러처리) (0) | 2021.07.23 |