[백준 161141번] 화살표 연산자 풀이
16114번: 화살표 연산자
첫 줄에 변수 x의 초기값을 뜻하는 정수 X와 화살표의 길이를 뜻하는 정수 N(-100 ≤ X ≤ 100, 0 ≤ N ≤ 10)이 주어진다.
www.acmicpc.net
X의 입력 값의 범위와 N의 입력 값의 범위를 고려하여 각 상황에 따른 출력 값을 나눠볼 수 있다.
N == 1(단항 연산자) | N != 1 && N%2 == 1 | N == 0 | N != 0 && N%2 == 0 | |
X > 0 | 0 | ERROR | INFINITE | X를 연산횟수(N/2)로 나눈 몫의 올림 - 1 |
X < 0 | INFINITE | ERROR | 0 | 0 |
X = 0 | 0 | ERROR | 0 | 0 |
먼저, N != 1 && N%2 == 1 인 경우, <-----X, <---X와 같이 단항 연산자(-)에 감소연산자(--) 짝수개가 붙은 형태이므로 ERROR를 출력해야 한다. X가 양수이고 N==0인 경우 (0 < X)는 항상 true가 되므로, 무한대의 연산을 수행하고 따라서 INFINITE를 출력해야 한다. X가 음수이고 N==1인 경우 -X는 항상 양수이므로, (0 < -X) 역시 무한대의 연산을 수행한다.
출력 값이 ERROR, 0, INFINITE가 아닌 경우는 X가 양수이면서 N이 0이 아닌 짝수일 경우 뿐이다.
예를 들어 X=10이고 N=4 인 경우, while (0 < ----X) {} 에서 출력이 몇번 이루어지는지 세어 보면 2(N/2)씩 X의 값이 감소하여 8, 6, 4, 2로 4번 이루어 진다. 다른 예시로 X=9이고 N=6인 경우, 3(N/2)씩 X의 값이 감소하여 6, 3 총 2번의 출력이 이루어진다.
이는 X를 연산횟수(N/2)로 나눈 몫을 올림하여 -1을 뺀 값으로 계산할 수 있다.
일반적으로, A를 K로 나눈 몫의 올림은 (A+K-1)/K로 구할 수 있기 떄문에, A에 X를, K에 (N/2)를 대입하여 (X+N/2-1)/(N/2)이고, 이에 -1을 하여 최종 출력 횟수는 (X+N/2-1)/(N/2)-1 이다.
#include <iostream>
#include <cstdio>
#include <algorithm>
#include <cstring>
#include <vector>
#include <cmath>
using namespace std;
int main() {
int X, N;
scanf("%d %d", &X, &N);
if (N!= 1 && N%2 == 1)
printf("ERROR\n");
else if ((0 > X && N == 1) || (X > 0 && N == 0))
printf("INFINITE\n");
else if (X > 0 && N != 0 && N%2 == 0) {
int nOp = N/2;
printf("%d\n", (X+nOp-1)/nOp-1);
}
else printf("0\n");
return 0;
}