본문 바로가기

Coding Test/Problem Number

[Java] N과 M 6 [15655번]

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

  • 예제 입력1
3 1
4 5 2
  • 예제 출력1
2
4
5
  • 예제 입력2
4 2
9 8 7 1
  • 예제 출력2
1 7
1 8
1 9
7 8
7 9
8 9
  • 예제 입력3
4 4
1231 1232 1233 1234
  • 예제 출력3
1231 1232 1233 1234

  • 문제 접근
    • 이번에는 앞의 인덱스의 숫자와 자기 자신을 출력하지 않음
      • 앞의 인덱스 숫자 ⇒ (7 1), (8 7) 등
      • 자기 자신 ⇒ (1 1) (7 7) 등
  • 문제 해결
    • 재귀 호출 시 현재 i + 1의 값 전달
  • 기존 풀이 [메모리 : 14176 KB / 시간 : 124ms]
static StringBuilder sb = new StringBuilder();
static int numCount, length;
static int[] arr;
static List<Integer> numList = new ArrayList<>();

public static void main(String[] args) throws IOException{
    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];

    st = new StringTokenizer(br.readLine());
    for (int i = 0; i < numCount; i++) numList.add(Integer.parseInt(st.nextToken()));
    Collections.sort(numList);

    DFS(0, 0);

    System.out.println(sb);
}

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

    for(int i = start; i < numCount; i++){
        arr[depth] = numList.get(i);
        DFS(i + 1, depth + 1);
    }
}

 

  • Stream 풀이 [메모리 : 14528 KB / 시간 : 136ms]
static StringBuilder sb = new StringBuilder();
static int numCount, length;
static int[] arr;
static List<Integer> numList = new ArrayList<>();

public static void main(String[] args) throws IOException{
    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];

    input = Arrays.stream(br.readLine().split(" ")).mapToInt(Integer::parseInt).toArray();
    for (int i = 0; i < numCount; i++) numList.add(input[i]);
    Collections.sort(numList);

    DFS(0, 0);

    System.out.println(sb);
}

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

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

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

[Java] N과 M 8 [15657번]  (0) 2024.07.22
[Java] N과 M 7 [15656번]  (0) 2024.07.22
[Java] N과 M 5 [15654번]  (0) 2024.07.22
[Java] N과 M 4 [15652번]  (0) 2024.07.22
[Java] N과 M 3 [15651번]  (0) 2024.07.22