https://www.acmicpc.net/problem/22251
K 자리의 LED 숫자 중 P 개의 LED를 반전시켜 바뀐 숫자가 1 ~ N이 되도록 바꿀 수 있는 숫자의 총 개수
0 ~ 9 까지의 디지털 숫자의 배열을 미리 지정하고
현재 층의 숫자(5층)와 틀린 개수가 P를 넘지 않은 것(3층, 6층, 8층, 9층)의 개수를 구해야 함.
근데 숫자는 N(9층)이 넘지 않아야 하므로
=> 1 ~ N까지 반복하면서 반복하는 숫자와 입력으로 주어진 현재 층의 숫자에서 틀린 개수가 P를 넘지 않도록 하는 층의 개수를 세면 됨
0 ~ 9까지 디지털로 표현한 배열 저장
static int[][] digit = {
{1, 1, 1, 0, 1, 1, 1}, // 0
{0, 0, 1, 0, 0, 0, 1}, // 1
{0, 1, 1, 1, 1, 1, 0}, // 2
{0, 1, 1, 1, 0, 1, 1}, // 3
{1, 0, 1, 1, 0, 0, 1}, // 4
{1, 1, 0, 1, 0, 1, 1}, // 5
{1, 1, 0, 1, 1, 1, 1}, // 6
{0, 1, 1, 0, 0, 0, 1}, // 7
{1, 1, 1, 1, 1, 1, 1}, // 8
{1, 1, 1, 1, 0, 1, 1}, // 9
};
static int N, K, P, X, ans;
숫자를 디지털 배열로 바꾸는 함수
public static int[][] numToDigit(int num) {
int[][] makeFloor = new int[K][7];
for (int i = 0; i < K; i++) {
int cur = num % 10;
num /= 10;
makeFloor[K-i-1] = digit[cur];
}
return makeFloor;
}
입력으로 받은 현재 층을 디지털로 변환
// 현재 층을 디지털로 변환
int[][] currentFloor = numToDigit(X);
1 ~ N 까지 순회
for (int i = 1; i <= N; i++) {
// 1부터 N까지 틀린 개수 P를 안넘는 것 몇 개?
// rising
if(i == X) continue;
int[][] risingNum = numToDigit(i);
int diffNum = 0;
for (int j = 0; j < K; j++) {
for (int k = 0; k < 7; k++) {
if(currentFloor[j][k] != risingNum[j][k]) diffNum++;
}
}
if(diffNum <= P) ans++;
}
System.out.println(ans);
1 ~ N까지 순회하는 숫자(i
)의 디지털 배열이 현재 층 숫자(X
)의 디지털 배열과 틀린 개수 몇갠지 세고 P보다 적으면 ans++
package baekjoon._22251;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.StringTokenizer;
public class Main {
static int[][] digit = {
{1, 1, 1, 0, 1, 1, 1}, // 0
{0, 0, 1, 0, 0, 0, 1}, // 1
{0, 1, 1, 1, 1, 1, 0}, // 2
{0, 1, 1, 1, 0, 1, 1}, // 3
{1, 0, 1, 1, 0, 0, 1}, // 4
{1, 1, 0, 1, 0, 1, 1}, // 5
{1, 1, 0, 1, 1, 1, 1}, // 6
{0, 1, 1, 0, 0, 0, 1}, // 7
{1, 1, 1, 1, 1, 1, 1}, // 8
{1, 1, 1, 1, 0, 1, 1}, // 9
};
static int N, K, P, X, ans;
public static void input() {
FastReader fr = new FastReader();
N = fr.nextInt();
K = fr.nextInt();
P = fr.nextInt();
X = fr.nextInt();
}
public static void main(String[] args) {
input();
int[][] currentFloor = numToDigit(X);
// 현재 층을 디지털로 변환
for (int i = 1; i <= N; i++) {
// 1부터 N까지 틀린 개수 P를 안넘는 것 몇 개?
// rising
if(i == X) continue;
int[][] risingNum = numToDigit(i);
int diffNum = 0;
for (int j = 0; j < K; j++) {
for (int k = 0; k < 7; k++) {
if(currentFloor[j][k] != risingNum[j][k]) diffNum++;
}
}
if(diffNum <= P) ans++;
}
System.out.println(ans);
}
public static int[][] numToDigit(int num) {
int[][] makeFloor = new int[K][7];
for (int i = 0; i < K; i++) {
int cur = num % 10;
num /= 10;
makeFloor[K-i-1] = digit[cur];
}
// StringBuilder sb = new StringBuilder();
// for (int i = 0; i < K; i++) {
// for (int j = 0; j < 7; j++) {
// sb.append(makeFloor[i][j]);
// sb.append(" ");
// }
// sb.append("\n");
// }
//
// System.out.println(sb);
return makeFloor;
}
static class FastReader {
BufferedReader br;
StringTokenizer st;
public FastReader(){ br = new BufferedReader(new InputStreamReader(System.in));}
String next(){
while(st == null || !st.hasMoreTokens()){
try{
st = new StringTokenizer(br.readLine());
} catch (IOException e){
e.printStackTrace();
}
}
return st.nextToken();
}
int nextInt() { return Integer.parseInt(next()); }
long nextLong() { return Long.parseLong(next()); }
Double nextDouble() { return Double.parseDouble(next()); }
String nextLine(){
String str = "";
try{
str = br.readLine();
} catch(IOException e){
e.printStackTrace();
}
return str;
}
}
}
처음 부터 지레 겁먹고 못풀겠다고 생각하지말고 일단 도전하면서 생각해보는 게 답이 될 수도!!