[백준] 15652 : N과 M (5) - JAVA [자바]

2025. 4. 9. 16:48·PS/BAEKJOON

안녕하세요.

오늘은 N과 M (5) 문제를 풀어보도록 하겠습니다.

 

    📌 접근

    N개의 수를 정수 배열에 저장하여 오름차순으로 정렬하고, (사전순으로 만들어야 하기 때문입니다.)

    정렬한 배열에서 하나씩 중복없이 골라서 총  M개의 조합을 완성시키면 됩니다.

     

    저는 dfs를 사용한 백트래킹을 이용하여 구현하였습니다.

    (길이를 depth만큼 만들면 되기 때무네. . .🫠)

     

    풀이에서 주의해야할 점은, 

    dfs 재귀호출 전에는 visited = true로,

    dfs 재귀호출 후에는 visited = false로 값을 넣어줘야 올바른 탐색을 할 수 있습니당.

     

    💻 풀이

    // hyeblee
    import java.io.*;
    import java.util.*;
    
    public class Main {
    
      public final static int MAX_SIZE = 8;
    
      public static int N, M;
      public static int[] nums = new int[MAX_SIZE];
      public static boolean[] visited = new boolean[MAX_SIZE];
      public static StringBuilder result = new StringBuilder("");
    
      public static void dfs(int depth, String str) {
        if (depth == M) {
          result.append(str + "\n");
        }
        for (int i = 0; i < N; i++) {
          if (!visited[i]) {
            visited[i] = true;
            dfs(depth + 1, str + nums[i] + " ");
            visited[i] = false;
          }
        }
      }
    
    
      public static void main(String[] args) throws IOException {
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        StringTokenizer st = new StringTokenizer(br.readLine());
        N = Integer.parseInt(st.nextToken());
        M = Integer.parseInt(st.nextToken());
        nums = new int[N];
        st = new StringTokenizer(br.readLine());
        for (int i = 0; i < N; i++) {
          nums[i] = Integer.parseInt(st.nextToken());
        }
        Arrays.sort(nums);
        dfs(0, "");
        System.out.println(result);
      }
    }

     

    🤔 고민했던 점 & 어려웠던 부분

     

    첫 풀이에서 숫자를 문자열 배열로 정렬하여 올바르게 정렬되지 않았다.

    나중에 result에 쓰기 쉽게 문자열 배열로 숫자를 받은 것이 문제였다.

     

    1 -> 10 -> 3 ❌ (문자열 정렬)

    1 -> 3 -> 10 ⭕(숫자 정렬)

     

    int 배열 정렬과 String 배열 정렬은 다른 결과를 나타낸다 ❕

     

     

     

     

    'PS > BAEKJOON' 카테고리의 다른 글

    [백준] 1916 : 최소비용 구하기 - JAVA [자바]  (0) 2025.06.19
    [백준] 9465 : 스티커 - JAVA [자바]  (1) 2025.06.18
    [백준] 15652 : N과 M (4) - JAVA [자바]  (1) 2025.04.08
    [백준] 16954 : 움직이는 미로 탈출 - JAVA [자바]  (0) 2025.04.06
    [백준] 2668 : 숫자고르기 - JAVA [자바]  (0) 2025.04.05
    'PS/BAEKJOON' 카테고리의 다른 글
    • [백준] 1916 : 최소비용 구하기 - JAVA [자바]
    • [백준] 9465 : 스티커 - JAVA [자바]
    • [백준] 15652 : N과 M (4) - JAVA [자바]
    • [백준] 16954 : 움직이는 미로 탈출 - JAVA [자바]
    hyeblee
    hyeblee
    감자감자
    • hyeblee
      hyeblee
      hyeblee
    • 전체
      오늘
      어제
      • 분류 전체보기
        • PS
          • Programmers
          • BAEKJOON
          • CODETREE
        • ALGORITHM
        • JAVA
        • CS
          • 면접을 위한 CS전공지식
        • SPRING
        • 회고
    • 블로그 메뉴

      • 홈
      • 태그
      • 방명록
    • 링크

      • 깃허브
    • 공지사항

    • 인기 글

    • 태그

      알고리즘
      플레이데이터 백엔드 부트캠프
      java #스프링부트 #자바버전 #자바 버전 충돌 #jvm
      java
      반닫힌 구간
      숨바꼭질3
      backjoon
      상한값
      BOJ
      arrays.sort #collections.sort #list.sort #객체정렬 #배열정렬 #timsort #dual pivot quicksort #정렬 #자바
      구간 칠하기
      15652
      흐른 시간 계산
      왔다 갔던 구역2
      dfs
      java #deque #자바 #덱
      플레이데이터 백엔드
      플레이데이터 백엔드 후기
      spring #스프링 #스프링부트 #springboot #please sign in
      흐른 일수 계산
      백트래킹
      탐색
      BFS
      플레이데이터 백엔드 부트캠프 후기
      자바
      하한값
      백준
      날짜와 시간 계산
      spring #springboot #스프링 #스프링부트
      16954
    • 최근 댓글

    • 최근 글

    • hELLO· Designed By정상우.v4.10.3
    hyeblee
    [백준] 15652 : N과 M (5) - JAVA [자바]
    상단으로

    티스토리툴바