SWEA 1288 새로운 불면증 치료법
문제 정보
- 문제 출처 : SW Expert Academy
- 문제 번호 : 1288
- 문제 제목 : 새로운 불면증 치료법
- 문제 난이도 : D2
- 풀이 언어 : Java
문제
양을 N, 2N, 3N, … 과 같은 방식으로 숫자를 증가 시켜가며 세면서 숫자들에 포함된 각각의 숫자(0부터 9까지)가 최소 한 번씩 나타나는 시점은 최소 몇 번 양을 센 시점인지 구하는 문제
접근
반복문을 사용하여 N, 2N, 3N, … 을 계산해 어떤 숫자들이 나타났는지를 기록하는 방식으로 문제를 풀었다.
풀이
- 테스트 케이스의 수를 입력받습니다.
- 1부터 테스트 케이스 수(T)까지 각 테스트 케이스에 대해 반복합니다.
- 각 테스트 케이스의 숫자 N을 입력 받습니다.
- 0부터 9까지의 숫자가 나타났는지 여부를 추적하기 위한 boolean 배열을 생성합니다.
- 현재 반복 횟수를 추적하는 변수를 0으로 초기화합니다.
- 현재 계산 중인 숫자를 N으로 초기화합니다.
- 모든 숫자가 발견될 때까지 무한 반복합니다.
- 현재 숫자를 문자열로 변환합니다.
- 현재 숫자의 각 자리수에 대해 반복하면서 해당 자리수의 숫자가 나타났음을 배열에 표시합니다.
- 0부터 9까지 각 숫자에 대해 반복하면서 특정 숫자가 발견되지 않았다면 모든 숫자가 발견되었는지 추적하는 변수를 false로 설정하고 반복을 중단합니다.
- 모든 숫자가 발견되었다면 반복을 중단합니다.
- 반복 횟수를 증가시킵니다.
- 다음 숫자로 이동하기 위해 N의 다음 배수를 계산합니다.
- 현재 테스트 케이스 번호와 모든 숫자가 발견된 숫자를 출력합니다.
후기
푸는데 시간이 조금 걸렸던 문제다. 비슷한 문제들을 더 풀어볼 계획이다.
코드
Java
import java.util.Scanner;
import java.io.FileInputStream;
class Solution
{
public static void main(String args[]) throws Exception
{
Scanner sc = new Scanner(System.in);
int T;
T=sc.nextInt();
for(int test_case = 1; test_case <= T; test_case++)
{
int N = sc.nextInt();
boolean[] seen = new boolean[10];
int count = 0;
int number = N;
while (true) {
String current = Integer.toString(number);
for (int i = 0; i < current.length(); i++) {
seen[current.charAt(i) - '0'] = true;
}
boolean allSeen = true;
for (int i = 0; i < 10; i++) {
if (!seen[i]) {
allSeen = false;
break;
}
}
if (allSeen) {
break;
}
count++;
number = N * (count + 1);
}
System.out.println("#" + test_case + " " + number);
}
}
}
Java