알고리즘/백준

백준_22251 : 빌런 호석 - C++

맏리믓 2023. 8. 7. 15:02

문제

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

 

22251번: 빌런 호석

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

www.acmicpc.net


문제 해석

- N(최대 층수), K(표기 자릿수), P(최대 변경 가능 횟수), X(현재 층수) 가 주어진다.

- 이 때 현재 층수 K 를 최대 변경 가능 횟수인 P 만큼 변경해 몇개의 다른 숫자로 변경 가능 한지 찾아내면 되는 문제이다.


문제 풀이

- 우선 전자시계식 숫자는 사람은 알아 보기 쉽지만 컴퓨터는 판별이 어려우니 이를 배열화 하여 저장 하여야 한다.

 . 이를테면 0 -> 1, 1, 1, 0, 1, 1, 1 이런 식으로 표시등 7개에 번호를 붙여 점등시 1 아닐시 0 으로 표시 하는 것이다.

 

- 이렇게 되면 변화(반전) 시켜야 할 횟수를 구하기 쉬워 진다.

 . 예를 들어

  0 -> 1, 1, 1, 0, 1, 1, 1

  1 -> 0, 0, 1, 0, 0, 1, 0 이라면 각 표시등이 다른 개수를 구하면 반전 시켜야 할 횟수가 된다.(예시에선 4개를 바꾸어야 함)

 

- 여기까지 왔다면 이후에 답을 구하는 방법은 간단하다.

 . 1층부터 N 층까지를 모두 체크 하며 X 와의 차이를 구해 그 수가 P 보다 작거나 같은 층수를 구해 주면 된다.


코드

#include <iostream>
using namespace std;

int N, K, P, X;
int ans = 0;
int number[10][7] = {
    {1, 1, 1, 0, 1, 1, 1},
    {0, 0, 1, 0, 0, 1, 0},
    {1, 0, 1, 1, 1, 0, 1},
    {1, 0, 1, 1, 0, 1, 1},
    {0, 1, 1, 1, 0, 1, 0},
    {1, 1, 0, 1, 0, 1, 1},
    {1, 1, 0, 1, 1, 1, 1},
    {1, 0, 1, 0, 0, 1, 0},
    {1, 1, 1, 1, 1, 1, 1},
    {1, 1, 1, 1, 0, 1, 1}
};

int checkDif(int a){
    int result = 0;
    int tmpFloar = X;
    for(int i = 0; i < K; i++){
        int tmpX = tmpFloar % 10;
        int tmpA = a % 10;
        for(int i = 0; i < 7; i++){
            if(number[tmpX][i] != number[tmpA][i]){
                result += 1;
            }
        }
        tmpFloar /= 10;
        a /= 10;
    }
    return result;
}

void solution(){
    cin >> N >> K >> P >> X;
    for(int i = 1; i <= N; i++){
        int dif = checkDif(i);
        if(dif <= P && dif != 0){
            ans += 1;
        }
    }
    cout << ans;
}

int main(){
    ios_base::sync_with_stdio(false);
    cin.tie(0);
    cout.tie(0);

    solution();
}