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;
}
'ㄴ 알고리즘 > 백준BOJ풀이' 카테고리의 다른 글
[백준 2121번] 넷이 놀기 풀이 (0) | 2021.09.25 |
---|---|
[백준 2103번] 직교다각형 복원 풀이 (0) | 2021.09.25 |
[백준 1448번] 삼각형 만들기 풀이 (0) | 2021.09.25 |
[백준 16960번] 스위치와 램프 풀이 (0) | 2021.09.25 |
[백준 11558번] The Game of Death 풀이 (0) | 2021.09.25 |
댓글