반응형

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

 

17497번: 계산기

첫 번째 줄에 버튼을 누른 횟수 K (0 ≤ K ≤ 99) 를 출력합니다. 누른 횟수를 최소화 하지 않아도 됩니다. 단, 누른 횟수가 99번을 넘으면 안됩니다. 만약 99번 안에 N을 만드는 방법이 존재하지 않는

www.acmicpc.net

 

 

[ 문제풀이 ]

 

1. N에서부터 시작해 연산을 해주고 ans vector에 push 해줍니다.

 

2. 만약 N & 1일 경우 무조건 나눈 경우이므로 ans에 '/'를 push 하고 나누기 전 값인 N *= 2를 해줍니다.

 

3. 만약 N & 2일 경우 무조건 2를 더한 경우이므로 ans에 '+'를 push 하고 더하기 전 값이 N -= 2를 해줍니다.

 

4. 만약 2, 3 둘 다 아닐 경우 2를 곱한 경우이므로 ans에 '*'를 push 하고 곱하기 전 값인 N /= 2를 해줍니다.

 

5. N이 0이 되면 반복문을 탈출합니다.

 

6. ans에 추가된 연산자를 뒤에서부터 출력해 줍니다.

 

[ 소스코드 ]

 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
#include<iostream>
#include<vector>
#define ll long long
 
using namespace std;
 
ll N;
vector<char> ans;
 
int main()
{
    scanf("%lld"&N);
 
    while (N) {
        if (N & 1) {    //무조건 2로 나눈 경우
            ans.push_back('/');
            N *= 2;
        }
        else if (N & 2) {    //무조건 2를 더한 경우
            ans.push_back('+');
            N -= 2;
        }
        else {    //무조건 2를 곱한 경우
            ans.push_back('*');
            N /= 2;
        }
    }
 
    if (ans.size() > 99) {
        printf("-1");
    }
    else {
        printf("%d\n", ans.size());
        for (int i = ans.size() - 1; i >= 0; i--) {
            printf("[%c] ", ans[i]);
        }
    }
}
cs
반응형

+ Recent posts