728x90
https://www.acmicpc.net/problem/22251
생각
- 처음에는 자릿수의 숫자를 바꾸어가면서 새로운 숫자를 만드는 방식을 생각했다.
- 그러나 반대로 1층부터 N층까지 현재 숫자에서 가능한 숫자를 만드는 방법 (역순)이 수월하다고 판단하였다.
- 따라서 각 숫자에 해당하는 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
'알고리즘 문제 > 완전탐색' 카테고리의 다른 글
[개쉬운 풀이] 백준 15683 감시 CPP (11일차) (0) | 2024.12.02 |
---|---|
[개쉬운 풀이] 백준 1027 고층 건물 (2) | 2024.09.05 |
[개쉬운 풀이] 백준 2116 주사위 쌓기 (2) | 2024.03.05 |