삼성 SW Expert Academy
문제 1288. 새로운 불면증 치료법
링크
SW Expert Academy
SW 프로그래밍 역량 강화에 도움이 되는 다양한 학습 컨텐츠를 확인하세요!
swexpertacademy.com
조건
임의의 수 N의 배수들의 각 자리수에서 0~9 까지의 모든 숫자를 보는 시점이 몇배 일때인지 구하라.
ex)
N = 1295 라면
N x 1 = 1295 (현재 본 숫자는 1 2 5 9)
N x 2 = 2590 (현재 본 숫자는 0 1 2 5 9)
N x 3 = 3885 (현재 본 숫자는 0 1 2 3 5 8 9)
N x 4 = 5180 (현재 본 숫자는 0 1 2 3 5 8 9)
N x 5 = 6475 (현재 본 숫자는 0 1 2 3 4 5 6 7 8 9)
5배에서 0~9 까지의 모든 숫자를 보게된다.
입력
첫 줄에 테스트 케이스 갯수가 주어짐. 다음 줄부터 테스트 케이스 N이 주어짐.
단, N은 1이상 10^6이하 이다.
5
1
2
11
1295
1692
출력
'#테스트케이스번호 정답'의 형태로 출력
#1 10
#2 90
#3 110
#4 6475
#5 5076
예상분석
1) 크기가 10인 배열(arr)에 각 인덱스 값을 0으로 초기화한다.
2) N * i 를 (i는 1부터 시작) 구하고 해당 값의 각 자리수에 해당하는 수를 구한다.
2-1) (N * i)%10 을 반복하여 각 자리수에 해당하는 수를 구하는 방식이용
3) arr에 각 자리수에 해당하는 수를 인덱스 번호로 하여 해당 인덱스의 값을 1증가시킨다.
4) 위 과정을 i를 증가시켜가며 반복진행하다 arr의 모든 인덱스 값이 0이상이 되는 시점에 종료
5) 종료된 시점의 i값을 형태에 맞추어 출력한다.
6) 위 과정을 테스트 케이스의 갯수만큼 반복한다.
코드
import java.util.Arrays;
import java.util.Scanner;
import java.util.stream.IntStream;
class Solution
{
public static void main(String args[]) throws Exception {
Scanner sc = new Scanner(System.in);
int T = sc.nextInt();
for (int test_case = 1; test_case <= T; test_case++) {
int N = sc.nextInt();
int num,idx;
int[] arr = new int[10];
int i = 1;
while(true) {
num = N*i;
while (num > 0) {
idx = num%10;
arr[idx]++;
num /= 10;
}
if (!IntStream.of(arr).anyMatch(x -> x == 0)) {
System.out.println("#" + test_case + " " + N*i);
break;
}
i++;
}
}
}
}
위 코드로 pass는 받았지만 딱 봐도 너무 어렵게 접근했지 않았나 싶다.
나름대로 시간복잡도를 생각해서 IntStream을 사용해보았다. 하지만 이미 반복문 중첩이 많아서 효율이 많이 떨어지는 것같다.
실제로 pass한 다른 유저들의 기록을 보니 메모리면에서나 실행시간면에서나 많이 차이가 났다.
조금 더 나은 코드를 짜기 위해 노력해보아야겠다.
'코딩 테스트 > SW Expert Academy' 카테고리의 다른 글
[SW Expert Academy]문제 1986. 지그재그 숫자 (D2) (0) | 2022.07.01 |
---|---|
[SW Expert Academy]문제 1945. 간단한 소인수분해 (D2) (0) | 2022.06.30 |
[SW Expert Academy]문제 2047. 신문 헤드라인 (D1) (0) | 2022.06.30 |
[SW Expert Academy]문제 1545. 거꾸로 출력해 보아요 (D1) (0) | 2022.06.30 |
[SW Expert Academy]문제 2070. 큰 놈, 작은 놈, 같은 놈 (D1) (0) | 2022.06.27 |