본문 바로가기

알고리즘

[SWEA] 1289. 양세기 (JAVA)

[문제]

https://swexpertacademy.com/main/code/problem/problemDetail.do?contestProbId=AV18_yw6I9MCFAZN

 

SW Expert Academy

SW 프로그래밍 역량 강화에 도움이 되는 다양한 학습 컨텐츠를 확인하세요!

swexpertacademy.com

이전에 셌던 번호들의 각 자리수에서 0에서 9까지의 모든 숫자를 보는 것은 최소 몇 번 양을 센 시점일까?
예를 들어 N = 1295이라고 하자.
첫 번째로 N = 1295번 양을 센다. 현재 본 숫자는 1, 2, 5, 9이다.
두 번째로 2N = 2590번 양을 센다. 현재 본 숫자는 0, 2, 5, 9이다.
현재까지 본 숫자는 0, 1, 2, 5, 9이다.
세 번째로 3N = 3885번 양을 센다. 현재 본 숫자는 3, 5, 8이다.
현재까지 본 숫자는 0, 1, 2, 3, 5, 8, 9이다.
네 번째로 4N = 5180번 양을 센다. 현재 본 숫자는 0, 1, 5, 8이다.
현재까지 본 숫자는 0, 1, 2, 3, 5, 8, 9이다.
다섯 번째로 5N = 6475번 양을 센다. 현재 본 숫자는 4, 5, 6, 7이다.
현재까지 본 숫자는 0, 1, 2, 3, 4, 5, 6, 7, 8, 9이다.
5N번 양을 세면 0에서 9까지 모든 숫자를 보게 되므로 민석이는 양 세기를 멈춘다.

 

[풀이]

N을 문자열로 입력 받았다.

크기가 10인 num 배열을 생성해 문자열 N에 포함된 문자를 int형으로 바꾼 뒤 그 숫자를 인덱스로 하여 해당 인덱스의 num 배열 값을 true로 바꿔주었다.

이 방법으로 현재 본 숫자를 기록하였다.

이때 num 배열값이 모두 true가 되면 0부터 9까지의 수를 모두 보게 되는 것이다.

 

[코드]

package A0222;

import java.io.*;

public class SWEA_양세기 {

	static String N;
	static int n;
	
	static boolean isAllTrue(boolean[] arr) { // 0에서 9까지 모든 숫자를 보게 되는지 확인
		for(int i=0;i<arr.length;i++) {
			if(arr[i]!=true) return false;
		}
		return true;
	}
	
	public static void main(String[] args) throws Exception {
		
		//System.setIn(new FileInputStream("input_1288.txt")); 
		BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
		int T = Integer.parseInt(br.readLine());
		
		for(int tc=1;tc<=T;tc++) {
			boolean[] num = new boolean[10];
			N = br.readLine();
			int cnt=1;
			n = Integer.parseInt(N);
			int k=1;
			while(true) {
				int m=0;
				m=n*k;
				N = Integer.toString(m);
				for(int i=0;i<N.length();i++) {
					num[N.charAt(i)-'0']=true;
				}
				if(isAllTrue(num)) break;
				k++;
				cnt++;
			}
			
			System.out.println("#"+tc+" "+cnt*n);
		}
	}
}

[느낀점] 

1N, 2N, 3N 이렇게 변화하는 값을 처리하는 방법을 생각해내는게 어려웠다. 지금 내가 쓴 방법 말고 다른 좋은 방법이 분명히 있을 것 같은데,, 찾아봐야겠다.

char 형을 int형과 비교할 때 '0'을 빼면 된다는 사실을 자꾸 까먹는다 ㅜㅜ 잊지말자!

마지막 정답을 출력할 때 cnt만 출력하면 되는 줄 알고 자꾸 답이 안맞아서 고민을 조금 했는데, 역시 문제를 잘 읽어야 되겠다.