728x90
삼성 SW Expert Academy
문제 1288. 새로운 불면증 치료법
링크

https://swexpertacademy.com/main/code/problem/problemDetail.do?problemLevel=2&contestProbId=AV18_yw6I9MCFAZN&categoryId=AV18_yw6I9MCFAZN&categoryType=CODE&problemTitle=&orderBy=PASS_RATE&selectCodeLang=JAVA&select-1=2&pageSize=10&pageIndex=1 

 

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한 다른 유저들의 기록을 보니 메모리면에서나 실행시간면에서나 많이 차이가 났다.

조금 더 나은 코드를 짜기 위해 노력해보아야겠다.

728x90

+ Recent posts