[BOJ/백준] 16114 화살표 연산자

오늘은 간만에 난이도를 살짝 올려 실버인 문제에 대해 리뷰해보겠습니다.

https://www.acmicpc.net/problem/16114

두 개의 수를 입력 받아 정의된 알고리즘에 대한 수행 결과를 출력하는 문제인데요.

두 수 X, N은 각각 x의 초기값과 화살표의 길이를 의미합니다.

첫 번째 예제 입력인 10 4를 이해해보면

X = 10, N = 4 이기 때문에, 시작값은 10, 감소 연산자는 두 번 적용되었으므로, 한 번에 2씩 줄어들게 됩니다.

8, 6, 4, 2 를 출력하게 될 테니, 우리의 프로그램은 4를 출력하면 됩니다.

두 번째 예제 입력인 -5 5를 이해해보면,

X = -5, N = 5 이기 때문에, N이 홀수 이므로, 정상적인 연산이 아니기 때문에 ERROR를 출력하면 됩니다.

세 번째 예제 입력인 3 0을 이해해보면, N = 0으로 x의 값이 항상 3이므로 프로그램이 종료되지 못하고 3을 무한히 출력하게 되어, 우리의 프로그램은 INFINITE를 출력하면 됩니다.

주의할 점은 n == 1인 경우는 화살표 연산자가 아닌 단항 연산자인 경우로, x의 값에 따라 while문이 얼마나 반복될지를 별도로 처리해주어야 하는데요.

x < 0인 경우, 문제의 0 < -x는 항상 만족되게 되므로, ‘INFINITE’

x >= 0인 경우, 문제의 0 < -x는 항상 불만족하게 되므로, 0을 출력하면 됩니다.

그 외에, n이 0 인 경우와 홀수인 경우를 처리하면 되고, 아닌 경우는 연산을 통해 값을 구하시면 됩니다.

n이 홀수인 경우는 무조건 불가능하다라고 생각하기 쉽기 때문에, n == 1 인 케이스는 완전히 다른 로직을 수행해야 한다는 점을 놓치기 쉬운 문제인 것 같습니다. 예제 케이스에서는 이런 예시를 주지 않는 경우도 흔하기 때문에, 문제를 꼼꼼히 읽어 코너 케이스를 잘 정의하는 것이 중요하다는 생각이 드네요.

x, n = list(map(int, input().split()))

if x < 0 and n == 1:
    print("INFINITE")
elif x >= 0 and n == 1:
    print("0")
elif n % 2 == 1:
    print("ERROR")
elif x <= 0:
    print("0")
elif n == 0:
    print("INFINITE")
else:
    n = n // 2
    print((x + n - 1) // n - 1)

게시됨

카테고리

작성자

댓글

답글 남기기

이메일 주소는 공개되지 않습니다. 필수 필드는 *로 표시됩니다