본문 바로가기
알고리즘 문제/완전탐색

[개쉬운 풀이] 백준 22251 빌런 호석

by odaebum 2024. 9. 28.
728x90

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

생각

  1. 처음에는 자릿수의 숫자를 바꾸어가면서 새로운 숫자를 만드는 방식을 생각했다.
  2. 그러나 반대로 1층부터 N층까지 현재 숫자에서 가능한 숫자를 만드는 방법 (역순)이 수월하다고 판단하였다.
  3. 따라서 각 숫자에 해당하는 LED 배열을 만들어 놓고, 각 자릿수마다 가능한 숫자를 만든다.

풀이

1. 입력값을 받는다 : input()

2. 1층부터 N층까지 X층과 비교하며 가능한 숫자들을 answer에 카운팅한다. : sol()

3. X와 i번 숫자를 비교한다 : process()

4. 이때 K자리수 만큼 비교하며 각 자리수에 해당하는 7개의 LED를 비교하면서 cnt를 통해 카운트한다.

5. cnt값이 최대 P개보다 적거나 같다면, i번째 숫자는 가능한 경우이다.

 

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

// N : 층
// K : 자릿 수
// P : 반전 갯수
// X : 현재 층 
int N,K,P,X;
vector<int> numbers;

//각 숫자에 해당하는 LED 상태
const bool num[10][7] = {
	{1, 1, 1, 0, 1, 1, 1},//0
	{0, 0, 1, 0, 0, 1, 0},//1
	{1, 0, 1, 1, 1, 0, 1},//2
	{1, 0, 1, 1, 0, 1, 1},//3
	{0, 1, 1, 1, 0, 1, 0},//4
	{1, 1, 0, 1, 0, 1, 1},//5
	{1, 1, 0, 1, 1 ,1 ,1},//6
	{1, 0, 1, 0, 0, 1, 0},//7
	{1, 1, 1, 1, 1, 1, 1},//8
	{1, 1, 1, 1, 0, 1, 1}//9
};

void input(){
    cin >> N >> K >> P >> X;
    numbers = vector<int> (K);
}

//현재상태 X에서 바꿀 수 있는 숫자인지 판단
bool process(int tmp){
    int a = X;
    int b = tmp;
    int cnt = 0;
    //K자리의 수
    for(int i = 0; i < K; i++){
    	//다른 LED 검사
        for(int j = 0; j < 7; j++){
            if(num[a%10][j] != num[b%10][j]) cnt++;
        }
        a/=10;
        b/=10;
    }

    return cnt <= P;
}

void sol(){
    //1층부터 N층까지 바꿀 수 있는 층들 계산
    int answer = 0;
    for(int i = 1; i <= N; i++){
        if(i==X) continue;
        if(process(i)) answer++;
    }

    cout << answer << endl;
}

int main(){
    ios_base::sync_with_stdio(false);cin.tie(NULL);cout.tie(NULL);
    input();
    sol();
    return 0;
}
728x90