티스토리 뷰

알고리즘/BOJ

[백준] 17497 계산기

세진짱 2019. 11. 8. 14:22

 

생각을 결국 떠올리지 못한 문제다!!

한번 2진수로 생각을 해보자

N -> 0까지 갈 예정이다

그럼 내가 0번째 비트가 1이라면 사라지게 할 방법이 없다

그래서 뒤로 한칸 밀어버려야한다(곱하기)

만약 1번째 비트가 1이라면 결국 2라는 값이 포함된다는 말이고

2를 빼면 된다는 말이다(빼기)

만약 0,1비트가 다 0이면 계속 앞으로 땡겨오자(나누기)

 

그럼 결론적으로 10^13 => 2^45승 정도의 비트를 이런식으로 다 처리하면 된다

N부터 거꾸로 보기때문에 반대로 연산자를 담아주자

 

0번째 비트가 1인경우,0인경우를 다 생각해보면 어떻게해도 99번을 넘지 않는다

신기하고 쉬워보이지만 나에게는 처음에 어려운 문제였따..!!

 

소스코드

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
#include <iostream>
#include <algorithm>
#include <vector>
using namespace std;
#define ll long long
ll n;
vector<char> vt;
int main(){
    scanf(" %lld",&n);
    while(n){
        if(n&1) {
            vt.push_back('/'); n*=2;
        }
        else if(n&2){
            vt.push_back('+'); n-=2;
        }
        else {
            vt.push_back('*'); n/=2;
        }
    }
    if(vt.size() >99) puts("-1");
    else {
        printf("%d\n",(int)vt.size());
        for(int i=(int)vt.size()-1; i>=0;i--printf("[%c] ",vt[i]);
    } 
}
 
 

'알고리즘 > BOJ' 카테고리의 다른 글

[백준] 17499 수열과 시프트 쿼리  (0) 2019.11.08
[백준] 17498 폴짝 게임  (0) 2019.11.08
[백준] 16438 원숭이 스포츠  (0) 2019.09.20
[백준] 16441 아기돼지와 늑대  (0) 2019.09.20
[백준] 16440 제이크와 케이크  (0) 2019.09.20
댓글
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
TAG
more
«   2024/05   »
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
글 보관함