본문 바로가기

Coding Test/Problem Number

[Java] N과 M 3 [15651번]

https://www.acmicpc.net/problem/15651

  • 예제 입력1
3 1
  • 예제 출력1
1
2
3
  • 예제 입력2
4 2
  • 예제 출력2
1 1
1 2
1 3
1 4
2 1
2 2
2 3
2 4
3 1
3 2
3 3
3 4
4 1
4 2
4 3
4 4
  • 예제 입력3
3 3
  • 예제 출력3
1 1 1
1 1 2
1 1 3
1 2 1
1 2 2
1 2 3
1 3 1
1 3 2
1 3 3
2 1 1
2 1 2
2 1 3
2 2 1
2 2 2
2 2 3
2 3 1
2 3 2
2 3 3
3 1 1
3 1 2
3 1 3
3 2 1
3 2 2
3 2 3
3 3 1
3 3 2
3 3 3

  • 문제 접근
    • 숫자 개수 N과 길이 M을 입력 받고, 1 ~ N까지, 1 ~ N까지 반복이 됨
  • 문제 해결
    • 예제 2번을 이중 반복문으로 생각하면 i = 1 ~ N까지, 그 다음 depth에서 다시 i = 1 ~ N까지 반복 됨
  • 기존 풀이 [메모리 : 68524KB / 시간 : 484ms]
static StringBuilder sb = new StringBuilder();
static int numCount, length;
static int[] arr;

public static void main(String[] args) throws Exception{
    BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
    StringTokenizer st = new StringTokenizer(br.readLine());
    numCount = Integer.parseInt(st.nextToken()); length = Integer.parseInt(st.nextToken());
    arr = new int[length];
    DFS(0);
    System.out.println(sb);
}

private static void DFS(int depth){
    if(depth == length){
        for(int num : arr)
            sb.append(num).append(" ");
        sb.append("\n");
        return;
    }

    for(int i = 1; i <= numCount; i++){
        arr[depth] = i;
        DFS(depth + 1);
    }
}
  • Stream 풀이 [메모리 : 155224KB / 664ms]
static StringBuilder sb = new StringBuilder();
static int numCount, length;
static int[] arr;

public static void main(String[] args) throws Exception{
    BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
    int[] input = Arrays.stream((br.readLine().split(" "))).mapToInt(Integer::parseInt).toArray();
    numCount = input[0]; length = input[1];
    arr = new int[length];
    DFS(0);
    System.out.println(sb);
}

private static void DFS(int depth){
    if(depth == length){
        Arrays.stream(arr).forEach(num -> sb.append(num).append(" "));
        sb.append("\n");
        return;
    }

    IntStream.range(1, numCount + 1)
            .forEach(i -> {
                arr[depth] = i;
                DFS(depth + 1);
            });
}

역시나 'N과 M 2'에 비해서 재귀 호출이 많아지고 출력이 많아지니 성능이 심각해지려고 함

'Coding Test > Problem Number' 카테고리의 다른 글

[Java] N과 M 5 [15654번]  (0) 2024.07.22
[Java] N과 M 4 [15652번]  (0) 2024.07.22
[Java] 좋은 단어 [3986번]  (0) 2024.07.22
[Java] N과 M 2 [15650번]  (0) 2024.07.22
[Java] N과 M 1 [15649번]  (0) 2024.07.21