문제
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();
}
'알고리즘 > 백준' 카테고리의 다른 글
백준_1863 : 스카이라인 쉬운거 - C++ (0) | 2023.08.05 |
---|---|
백준_7682 : 틱택토 - C++ (0) | 2023.08.04 |
백준_24042 : 횡단보도 - C++ (0) | 2023.07.19 |
백준_2667 : 단지 번호 붙이기 - C++ (0) | 2023.06.25 |
백준_2630 : 색종이 만들기 - C++ (0) | 2023.06.25 |