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. 생각 정리
무엇보다 문제를 자세하게 읽고 조건을 찬찬히 적용하는 것이 중요하다고 다시금 깨닳은 문제다.
대부분 문제는 입력을 어떻게 잘 처리하는가 보다는 어떤 알고리즘으로, 어떻게 잘 풀어가는가는지가 더욱 중요시되는 것 같다. 하지만 때로는 이번 문제처럼 입력에서 강력한 입력 제한 없이, 입력을 다뤄야 하는 문제도 많다. 파싱 계열 문제도 이러한 유형에 속하는 것 같다.
'CS > 알고리즘 & 문제풀이' 카테고리의 다른 글
[Python] 백준 2572 보드게임 (0) | 2021.09.21 |
---|---|
[Python] 백준 12787 지금 밥이 문제냐 (0) | 2021.09.20 |
[Python] 백준 6568 귀도 반 로썸은 크리스마스날 심심하다고 파이썬을 만들었다 (0) | 2021.09.19 |
[Python] 백준 5052 전화번호 목록 (0) | 2021.09.15 |
[Python] 백준 9655 돌 게임 (0) | 2021.09.12 |
댓글