제목에 써있는 그대로 조금 햇갈렸던 문제이다.

문제를 푸는데 있어서 이 문제야말로 구현이 어려운 것이 아니라 규칙을 찾는 컴퓨팅적 사고 및 논리력이 필요한 문제가 아닌가 싶다.

즉, 문제를 제대로 이해하고 반례까지 없도록 잘 만드는 것이 관건이다.

나는 일부만 제대로 하고, 반례가 생기도록 처음에 만들어서 고생했다.

 

나의 첫 시도(잘못된 코드)는 다음과 같다:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
# 틀렸다고 나오는 코드
# 1 1 1  ==>  답 101  ==>  출력 102
= 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
= 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일 때와 아닐 때에 따라서 다르게 처리가 되도록 해야한다.

 

이 문제의 경우, 구현의 문제나 파이썬이라는 공부에 있어서의 문제라기보다 논리적 해결의 차원에 문제로 분석할 수 있다 (물론 매우 간단한 문제이지만...).

이런 형태의 문제가 있음을 인지하고, 끊임없이 컴퓨팅적 사고를 기를 필요성을 다시 한 번 느끼게 된다.

 

 

문제출처: https://www.acmicpc.net/problem/10250

 

10250번: ACM 호텔

프로그램은 표준 입력에서 입력 데이터를 받는다. 프로그램의 입력은 T 개의 테스트 데이터로 이루어져 있는데 T 는 입력의 맨 첫 줄에 주어진다. 각 테스트 데이터는 한 행으로서 H, W, N, 세 정수

www.acmicpc.net

+ Recent posts