반응형
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, "");
}
*더 나은 내용을 위한 지적, 조언은 언제나 환영합니다.
'Algorithm > Brute Force' 카테고리의 다른 글
(C++) - 프로그래머스(위클리 챌린지) : 5주차_모음사전 (0) | 2022.06.30 |
---|---|
(C++) - 백준(BOJ) 12919 : A와 B 2 (0) | 2022.06.30 |
(C++) - 백준(BOJ) 9081 : 단어 맞추기 (0) | 2022.06.28 |
(C++) - 백준(BOJ) 15658 : 연산자 끼워넣기 (2) (0) | 2022.06.25 |
(C++) - 백준(BOJ) 6987 : 월드컵 (0) | 2022.06.22 |