CS/알고리즘 & 문제풀이

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

mintropy 2021. 9. 18. 15:53

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. 생각 정리

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

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