22251 빌런 호석

DONGJIN IM·2022년 6월 30일
0

코딩 테스트

목록 보기
128/137

문제 이해


0 ~ 9까지의 숫자는 위처럼 표기할 수 있다.

이 때 꺼져 있는 버튼을 키거나 켜져 있는 버튼을 1개 끄는 것을 "1개가 반전되었다"라고 한다.

엘리베이터가 실제로 X층에 멈춰 있을 때, 1개 ~ P개를 반전시켜 X층과는 다른 숫자를 만드려고 한다. 이 때 만들 수 있는 다른 층의 경우의 수를 구하는 문제이다.


문제 풀이

바꿀 수 있는 수는 1이상 N이하이다.
X를 1 ~ N까지 숫자에 대해 몇 개를 반전시켜야 하며, 만약 반전시킨 개수가 P이하라면 답에 포함시키는 형식으로 문제를 풀었다.

0 ~ 9까지 불 켜져 있는 칸을 1 ~ 8로 표현하여 불이켜져 있는 부분을 1, 꺼져있는 부분을 0으로 취급하여 1개 숫자를 반전시킬 때 사용되는 불의 개수를 구했다.


코드

import java.io.*;
import java.util.*;


public class Main {
	static StringBuilder sb = new StringBuilder();
	
	static int N, K, P, X;
	static String real_K;
	static int[][] change = new int[10][10];
	static int ans = 0;
	
	static void fill() {
    //     1
    //  2     3
    //     4
    //  5     6
    //     7
    // 불의 위치는 위와 같이 결정했고, 서로 값이 다르면 반전시켜야하는 불이다
		int[][] arr = new int[10][8];
		arr[0][1] = 1;
		arr[0][2] = 1;
		arr[0][3] = 1;
		arr[0][5] = 1;
		arr[0][6] = 1;
		arr[0][7] = 1;
		
		arr[1][3] = 1;
		arr[1][6] = 1;
		
		Arrays.fill(arr[2], 1);
		arr[2][2] = 0;
		arr[2][6] = 0;
		
		Arrays.fill(arr[3], 1);
		arr[3][2] = 0;
		arr[3][5] = 0;
		
		Arrays.fill(arr[4], 1);
		arr[4][1] = 0;
		arr[4][5] = 0;
		arr[4][7] = 0;
		
		Arrays.fill(arr[5], 1);
		arr[5][3] = 0;
		arr[5][5] = 0;
		
		Arrays.fill(arr[6], 1);
		arr[6][3] = 0;
		
		arr[7][1] = 1;
		arr[7][3] = 1;
		arr[7][6] = 1;
		
		Arrays.fill(arr[8], 1);
		
		Arrays.fill(arr[9], 1);
		arr[9][5] = 0;
		
		for(int i =0;i<10;i++) {
			for(int j =i+1;j<10;j++) {
				for(int t =1;t<8;t++) {
					if(arr[i][t]!=arr[j][t]) {
						change[i][j]++;
					}
				}
			}
		}
	}

	static void rec() {
		
		for(int i = 1;i<=N;i++) {
			int tmp = 1000000;
			String tmp2 = Integer.toString(tmp+i).substring(7-K,7);
			int cha = 0;
			for(int j =0;j<K;j++) {
				cha += Math.max(
                      change[real_K.charAt(j)-'0'][tmp2.charAt(j)-'0'], 
                      change[tmp2.charAt(j)-'0'][real_K.charAt(j)-'0']);
                      // change[A][B] 중 A<B일 때만 값이 저장되어 있다
                      // 따라서, Math.max로 A<B인 경우만 선택한다.
			}
			
			if(cha>=1 && cha <=P) ans++;
		}
		
		
	}
	
	public static void main(String[] args) {

		FastReader sc = new FastReader();
		
		N = sc.nextInt(); // 1 ~ N층까지 존재
		K = sc.nextInt(); // K자리 수가 보임
		P = sc.nextInt(); // 최소1개 ~ 최대 P개를 반전
		X = sc.nextInt(); // 실제로는 X층에 멈춰 있음

		fill();
	
		int tmp = 1000000;
		real_K = Integer.toString(tmp+X).substring(7-K,7);
        // 5를 표현할 때 00005 등으로 표현해야 하므로 활용한 방법
        // 1000005로 만든 이후 원하는 부분만 뒤에서 뽑아내면 됨

		rec();
		System.out.println(ans);
	}
	
	static class FastReader // 빠른 입력을 위한 클래스
}

결과

  • 틀렸습니다 : 처음 풀 때 재귀함수로 문제를 해결했는데, 종료 조건을 잘못 설정해주어 원래 구하려던 값보다 더 많은 값을 반환했다.
profile
개념부터 확실히!

0개의 댓글

관련 채용 정보