@@@ 알고리즘/백준 스터디

1338(알 수 없는 번호) - 참고 해결

HTG 2021. 9. 16. 03:01
728x90

알 수 없는 번호

 

문제

당신은 한 개의 알 수 없는 수를 알아내야만 한다. "이런 젠장"

어쨌든 당신은 그 수를 알아내야만 한다. 당신에게 주어지는 정보는 다음과 같다.

  1. 그 수가 있을 수 있는 범위
  2. 그 수를 x로 나눈 나머지, 즉 그 수를 qx + y(0 ≤ y < |x|) 꼴로 나타냈을 때 y의 값

이때, 당신은 그 수가 무엇인지 추측해야 한다.

 

입력

첫 번째 줄에는 수가 있을 수 있는 범위의 양끝 값을 의미하는 두 개의 수가 주어진다.

두 번째 줄에는 나누는 수 x와 나머지 y가 주어진다.

주어지는 모든 수는 $-2^{31}이상 2^{31}- 1$ 이하의 정수이다.

 

출력

첫째 줄에 추측한 수를 출력한다. 만약 정확히 한 개로 추측할 수 없다면 Unknwon Number를 출력한다.


분명 맞다고 생각했는데 틀리길래 확인해보니 이런 경우들이 있었다.

그래서 해당 부분들을 해결하니 바로 해결

기본적인 아이디어는 해당하는 첫 숫자를 찾고 다음 숫자를 찾는 것.

첫 숫자는 범위의 시작에서 가장 가까운 것을 찾는 것.

범위의 시작에서 X로 나누어 나머지를 찾고 Y에서 해당 수를 빼서 차이를 구한다. 이는 찾는 수의 X로 나눈 나머지가 Y가 되게 하기 위함이다.

그리고 이를 범위의 시작에 더하면 해당 숫자는 X로 나누었을 때 Y가 나오게 된다.

그리고 다음 숫자를 구해서 두 번째 해당하는 숫자를 구한다.

그래서 두 숫자가 범위에 들어가나 안들어가나를 확인

 

1. 입력되는 범위가 l > r일 수 있습니다 (swap 필요)

2. y가 0 <= y < |x| 범위가 아닐 수 있습니다. (이 경우엔 Unknwon Number 출력)

3. Unknown이 아닌 "Unknwon"을 출력해야 합니다

import sys

st, ed = map(int,sys.stdin.readline().split())
# 1번 경우를 위해서
if st>ed:
    st, ed = ed, st

X, Y = map(int,sys.stdin.readline().split())
# X가 마이너스나 플러스나 상관 없으나 나의 방법에서 다음 수를 구하기 때문에 양수로 변환
X = abs(X)
# 2번 경우를 위해서
if 0<= Y < X:
    pass
else:
    print("Unknwon Number")
    exit()

# 처음 해당 숫자
first = st + Y - st % X 
# 두번째 해당 숫자
second = first + X

# 처음 숫자가 범위 안
if st <= first <= ed:
    # 처음 숫자와 두번째 숫자가 다있으면 못찾음
    if st <= second <= ed:
        ans = "Unknwon Number"
    else:
        ans = first
# 처음 숫자가 범위 안에 안들어오면
else:
    ans = "Unknwon Number"
print(ans)