본문 바로가기
대딩/백준BOJ풀이

[백준 161141번] 화살표 연산자 풀이

by 경아ㅏ 2021. 9. 25.
 

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;
}

 

댓글