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

2025. 4. 8. 12:36·PS/BAEKJOON

안녕하세요.

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

 

 

 

    📌 접근

    길이가 M인 수열을 만들면 되므로 dfs를 사용하였습니다.

    길이 M 달성 시, result에 결과를 추가하고 재귀를 종료하게 됩니다..

     

    dfs는 이전에 추가한 숫자를 알 수 있게 before를,

    현재 만든 문자열을 뜻하는 str를 인자로 갖게 구조를 만들었습니다.

     

    💻 풀이

    // hyeblee
    import java.io.*;
    import java.util.*;
    
    
    public class Main {
    	public static int N, M;
    	public static StringBuilder result = new StringBuilder("");
    
    	public static void dfs(int depth, String str, int before) {
    		if (depth == M) {
    			result.append(str + "\n");
    			return;
    		}
    		for (int i = 1; i <= N; i++) {
    			if (before <= i)
    				dfs(depth + 1, str + i + " ", i);
    		}
    	}
    
    	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());
    		dfs(0, "", 0);
    		System.out.println(result);
    	}
    }

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

     

    1 1 2 와 1 2 1이 같은 조합이라는 것을 생각하지 못했다. 그래서

     

    1 1 3 -> 1 2 2 가 나와야하는데

    1 1 3 -> 1 2 1 이 나왔다.

     

    어떻게 해결할까 고민하다가, dfs에 before 인자를 추가했다.

    다음에 추가할 숫자는 이전에 추가한 숫자보다 크거나 같기 때문이다.

     

     

    하지만 dfs에 현재의 결과를 뜻하는 str를 계속 들고다니는 것보다,

    (함수에 인자가 3개나 되니까. . .)

    int 배열을 사용하여 풀이하는게 더 깔끔한 것 같다.

     

    개선한 코드

    // 개선한 코드
    import java.io.*;
    import java.util.*;
    
    public class Main {
    	public static int N, M;
    	public static int[] nums;
    
    	public static void dfs(int depth, int before) {
    		if (depth == M) {
    			for (int v : nums) {
    				System.out.print(v + " ");
    			}
    			System.out.println();
    			return;
    		}
    		for (int i = before; i <= N; i++) {
    			nums[depth] = i;
    			dfs(depth + 1, i);
    		}
    	}
    
    	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[M];
    		dfs(0, 1);
    	}
    }

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

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

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

      • 깃허브
    • 공지사항

    • 인기 글

    • 태그

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

    • 최근 글

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

    티스토리툴바