본문 바로가기
알고리즘 일기

프로그래머스 : 종이접기 DP

by Beijing_KingGod 2019. 11. 30.

https://programmers.co.kr/learn/courses/30/lessons/62049

 

코딩테스트 연습 - 종이접기 | 프로그래머스

직사각형 종이를 n번 접으려고 합니다. 이때, 항상 오른쪽 절반을 왼쪽으로 접어 나갑니다. 다음은 n = 2인 경우의 예시입니다. 먼저 오른쪽 절반을 왼쪽으로 접습니다. 다시 오른쪽 절반을 왼쪽으로 접습니다. 종이를 모두 접은 후에는 종이를 전부 펼칩니다. 종이를 펼칠 때는 종이를 접은 방법의 역순으로 펼쳐서 처음 놓여있던 때와 같은 상태가 되도록 합니다. 위와 같이 두 번 접은 후 종이를 펼치면 아래 그림과 같이 종이에 접은 흔적이 생기게 됩니다. 위

programmers.co.kr

#include <string>
#include <vector>

using namespace std;
//1번
// 0
//2번
//0(1번) 0 1
//3번
//001(2번) 0 011
// 4번 
// 001 0 011(3번) 0 0011011
//5번
// 001 0 011 0 0011011(4번) 0 반대
vector<vector<int>> a; 
vector<int> solution(int n) {
    vector<int> temp;
    temp.push_back(0);
    a.push_back(temp);
    
    for(int i=1; i<n; i++){
        vector<int> input ;
        temp = a[i-1];
        input = temp;
        input.push_back(0);
        int t_size= temp.size();
        for(int j=t_size-1; j>=0; j--){
            if(temp[j]==0){
                input.push_back(1);
            }else{
                input.push_back(0);
            }
        }
        
        a.push_back(input);
    }
    return a.back();
}

bottom - up dp 로 풀었다.

 

그런데 비트 마스크로도 풀수도 있을꺼같다. (X)

-> 비트가 int 는 32 bit , longlong 은 64 bit 이기때문에

점점 비트 수가 n*2+1 형식으로 증가해서 비트수가 넘어가서 비트 마스크로는 풀수 없다.

 

아래는 비트마스크로 풀어본거..

n 이 증가하면 못풀지만 n 이 작으면 풀리는 거니까 ... 적어놈,,

#include <string>
#include <vector>
#include<algorithm>
#include<iostream>
using namespace std;

long long v[21][2];
// 1번 
// 1개
// 2번 3개 = 1*2 +1
// 3번 7개 = 3*2 +1
// 4번 15개 = 7*2+1

vector<int> solution(int n) {
    vector<int> answer;
    v[1][0] = 0;
    v[1][1] = 1;
    for(int i=2; i<=n; i++){
        long long now=v[i-1][0]; // 001
        long long next = 0;
        for(int j=0; j<v[i-1][1]; j++){
            next = next<<1;
            next|=now&1;
            now=now>>1;
        }
     
        long long temp = (((1<<v[i-1][1])-1)-next); // 1000 -1 --> 111 - 100 = 011
      
        v[i][0] = v[i-1][0]<<(v[i-1][1]+1) ; // 001 0 000
        v[i][0]|=temp; // 001 0 011
        v[i][1] = v[i-1][1]*2+1;
    }
    long long temp = v[n][0];
    for(long long i=0; i<v[n][1]; i++){
        answer.push_back(temp&1);
        temp>>=1;
    }

    reverse(answer.begin(),answer.end());
                    
    return answer;
}

 

'알고리즘 일기' 카테고리의 다른 글

1806번 : 부분합  (0) 2019.11.30
2003번: 수들의 합 2  (0) 2019.11.30
12100번 : 2048(easy) 비트마스크  (0) 2019.11.29
13460번 구슬 탈출2 비트 마스크  (0) 2019.11.29
1062번: 가르침  (0) 2019.11.27

댓글