빌런 호석

hyeongjun Jo·2023년 3월 13일
0

Backjoon

목록 보기
24/24

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

문제

  • N - 바꿀 숫자의 최대값
  • K - 자리수
  • P - 바꿀 수 있는 LED 최대 값
  • X - 현재 층

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;
        }
    }
}

느낀점

처음 부터 지레 겁먹고 못풀겠다고 생각하지말고 일단 도전하면서 생각해보는 게 답이 될 수도!!

profile
DevOps Engineer

0개의 댓글