알고리즘
백준 22251번 빌런 호석 (JAVA)
박카스마시며코딩
2023. 10. 4. 21:10
https://www.acmicpc.net/problem/22251
22251번: 빌런 호석
LED를 2개까지 바꿀 수 있을 때, 5층에서 3층, 6층, 8층, 그리고 9층으로 바꿔버릴 수 있다.
www.acmicpc.net
저는 구현과 dfs를 통해 문제를 해결하였습니다.
먼저 각각의 숫자를 7세그먼트로 표현했을 때 어디가 불이 나는지를 boolean배열로 표현하였습니다.
그리고 dfs로 각각의 자리의 숫자를 변경해보면서 boolean[]이 얼마나 차이나는지를 확인하고 이 값을 p와 비교하여 dfs를 진행 여부를 판단하여 문제를 해결하였습니다.
package BOJ.etc;
import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.util.StringTokenizer;
import java.util.function.Function;
public class BOJ_22251 {
private static final boolean[][] NUMBER = {
{true, true, true, false, true, true, true}, // 0
{false, false, true, false, true, false, false}, // 1
{false, true, true, true, false, true, true}, // 2
{false, true, true, true, true, true, false}, // 3
{true, false, true, true, true, false, false}, // 4
{true, true, false, true, true, true, false}, // 5
{true, true, false, true, true, true, true}, // 6
{false, true, true, false, true, false, false}, // 7
{true, true, true, true, true, true, true}, // 8
{true, true, true, true, true, true, false} // 9
};
public static void main(String[] args) throws Exception {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
StringTokenizer st = new StringTokenizer(br.readLine());
Function<String, Integer> stoi = Integer::parseInt;
int n = stoi.apply(st.nextToken());
int k = stoi.apply(st.nextToken());
int p = stoi.apply(st.nextToken());
int x = stoi.apply(st.nextToken());
int result = cal(0, x, k, p, n) - 1;
System.out.println(result);
}
private static int cal(int depth, int now, int digit, int p, int maxFloor) {
if(depth == digit && now >= 1 && now <= maxFloor){
return 1;
}
if(depth == digit){
return 0;
}
int result = 0;
int standard = 10;
for (int i = 0; i < digit - depth-1; i++) {
standard *= 10;
}
int num = now % standard / (standard / 10);
int tempNum = (now / standard) * standard + now % (standard / 10);
for(int i = 0 ; i < 10 ; i++){
int diffCnt = 0;
for(int j = 0 ; j < 7 ; j++){
if(NUMBER[i][j] != NUMBER[num][j]){
diffCnt++;
}
}
if(diffCnt > p){
continue;
}
int next = (tempNum + i * standard / 10);
result += cal(depth+1,next,digit,p-diffCnt,maxFloor);
}
return result;
}
}