본문 바로가기

Algorithm/Brute Force

(C++) - 백준(BOJ) 22251 : 빌런 호석

반응형

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

 

22251번: 빌런 호석

LED를 2개까지 바꿀 수 있을 때, 5층에서 3층, 6층, 8층, 그리고 9층으로 바꿔버릴 수 있다.

www.acmicpc.net

전수조사 문제였습니다.

📕 풀이방법

📔 입력 및 초기화

시작 층 startFloor, 보여줄 화면의 자리수 display, 남은 bit 수 bitNum, 제한 수 limitNum, 어떤 수를 바꾸는데 바꿔야할 bit개수 convertBit를 선언 후 적절히 입력받습니다.

📔 풀이과정

1. startFloor가 11인데 display가 4라면 0011식으로 보여야 합니다. 사전처리를 해서 startFloor를 수정해줍니다.

2. dfs함수를 수행합니다. 

📔 정답출력

dfs함수의 결과를 출력합니다. 


📕 Code

#include <bits/stdc++.h>
using namespace std;
string startFloor, zeroCnt;
int display, bitNum, limitNum;
int convertBit[10][10] = {
    0, 4, 3, 3, 4, 3, 2, 3, 1, 2,
    4, 0, 5, 3, 2, 5, 6, 1, 5, 4,
    3, 5, 0, 2, 5, 4, 3, 4, 2, 3,
    3, 3, 2, 0, 3, 2, 3, 2, 2, 1,
    4, 2, 5, 3, 0, 3, 4, 3, 3, 2,
    3, 5, 4, 2, 3, 0, 1, 4, 2, 1,
    2, 6, 3, 3, 4, 1, 0, 5, 1, 2,
    3, 1, 4, 2, 3, 4, 5, 0, 4, 3,
    1, 5, 2, 2, 3, 2, 1, 4, 0, 1,
    2, 4, 3, 1, 2, 1, 2, 3, 1, 0,
};

int dfs(int depth, int leftBit, string madeStr){
    if(depth == display){
        int madeNum = stoi(madeStr);
        if(1 <= madeNum && madeNum <= limitNum && madeStr != startFloor) return 1;
        return 0;
    }
    int ret = 0;
    for(int i = 0; i < 10; i++){
        int diff = convertBit[i][startFloor[depth] - '0'];
        if(diff > leftBit) continue;
        ret += dfs(depth+1, leftBit - diff, madeStr + to_string(i));
    }
    return ret;
}

int main(){
    cin >> limitNum >> display >> bitNum >> startFloor;
    int diff = display - startFloor.size();
    for(int i = 0; i < display - startFloor.size(); i++){
        zeroCnt.push_back('0');
    }
    startFloor = zeroCnt + startFloor;
    cout << dfs(0, bitNum, "");
}

*더 나은 내용을 위한 지적, 조언은 언제나 환영합니다.