본문 바로가기
CS/알고리즘 & 문제풀이

[Python] 백준 1338 알 수 없는 번호

by mintropy 2021. 9. 18.

1. 접근 방법

입력을 '잘' 처리했다면 문제는 매우 간단하다.

정답 가능성인 수를 하나 선택하고, 그러한 가능성이 있는 수가 2개 이상인지, 아니면 해당 범위에 속하지 않는지를 확인하면 끝난다. 이 내용만 있다면 문제 난이도는 실버 이하로 책정되어도 괜찮을 것 같다.

하지만, 더욱 중요한 부분이 많이 남아있다.

 

 

2. 해결 코드

  • 파이썬 코드
st, end = map(int, input().split())
if st > end:
    st, end = end, st
x, y = map(int, input().split())
if x < 0:
    x *= -1

# 나머지가 나누는 수 보다 크거나 같을 때
if y >= x or y < 0:
    print('Unknwon Number')
else:
    # 만족하는 수 찾기
    m = (st // x) * x + y
    if m < st:
        m += x
    # 없는 경우
    if m > end:
        print('Unknwon Number')
    elif (st <= m <= end):        
        # 하나 더 존재할 수 있는 경우
        if (st <= m + x <= end):
            print('Unknwon Number')
        else:
            print(m)
  • 해결 아이디어

이 문제는 입력에 대한 처리가 많이 필요하다

1) 수가 있는 범위가 주어질 때, 어떤 수가 더 큰지 알 수 없다.

    따라서 범위를 입력받고, 시작 범위 왼쪽, 오른쪽을 잘 구분해야 한다.

2) 나누는 수와 나머지에 대한 제한조건 역시 없다. 이는 다음과 같은 내용을 확인해야 한다

2-1) 나누는 수의 경우 제한이 필요하지는 않지만, 음수인 경우 양수로 변환하여 계산해도 문제되지 않는다

2-2) 나머지는 문제 조건에 의해 0 <= y < |x|이지만, 입력 조건에는 해당 부분이 없다. 따라서 음수이거나 x의 절댓값 이상인경우를 확인해야 한다.

사실 확인해야 하는 부분은 얼마 되지 않지만, 너무 가볍게 여겨 제대로 확인하지 않은 부분이 더 많았던 것 같다.

이후의 풀이는 st(구간의 왼쪽) 이하의 조건을 만족하는 가장 큰 수를 선택하여 x만큼 더해가면서 확인하는 작업을 했다.

나는 불가능할 때 출력을 복사해서 붙여 넣었는데, 따라 치다가 오타가 나는 경우가 많은 것 같다. (Unknwon) 문자열 출력이면 해당 출력을 그대로 복사해서 쓰는게 더 좋을듯 하다.

 

 

3. 생각 정리

무엇보다 문제를 자세하게 읽고 조건을 찬찬히 적용하는 것이 중요하다고 다시금 깨닳은 문제다.

대부분 문제는 입력을 어떻게 잘 처리하는가 보다는 어떤 알고리즘으로, 어떻게 잘 풀어가는가는지가 더욱 중요시되는 것 같다. 하지만 때로는 이번 문제처럼 입력에서 강력한 입력 제한 없이, 입력을 다뤄야 하는 문제도 많다. 파싱 계열 문제도 이러한 유형에 속하는 것 같다.

댓글