[백준,BOJ 15652] N과 M(4) (JAVA 구현,추가풀이)

2020. 11. 17. 15:25·CodingTest/백준 온라인 저지(BOJ)
반응형

-내 생각

  백준 온라인 저지에서 단계별 풀어보기 탭의 백트래킹 카테고리에 있는 마지막 N과 M문제이다. 이번 문제가 가지는 앞선 문제들과의 차이점은 우선 중복을 허용하며, 각 자리의 숫자들은 자신보다 앞에 있는(먼저 오는) 숫자보다 크거나 같아야 한다는 조건이 있다. 그렇기 때문에 처음 봤을 때 N과 M(3) 문제에서 조건만 추가해주면 될 것 같다고 생각했으며, 시간제한이 1초이기 때문에 마찬가지로 BufferedWriter클래스와 BufferedReader클래스를 사용해주었다.

 

-해법

  추가된 한 줄의 조건문은 코드를 보면서 이해해 보자.

import java.io.*;
import java.util.*;

public class Main {
	static int m,n;
	static int list[];
	static BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(System.out));
	static void dfs(int cnt) throws IOException {
		
		
		if(cnt == m) {
			for(int i=0;i<m;i++) {
				bw.write(String.valueOf(list[i])+" ");			
				}
			bw.newLine();
			return;
		}
		
		for(int i =1;i<=n;i++) {
			if(cnt!=0 && list[cnt-1]>i) continue; //추가 된 조건부
            //이 부분을 제외하고는 N과 M(3)문제와 동일하다.
            // cnt!=0인 이유는 자신보다 앞의 숫자가 있는 경우는 2번째 자리 숫자부터이기 때문이다.
			list[cnt]=i;		
			dfs(cnt+1);			
		}	
	}
	
	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());
		
		
		list = new int [m];
		dfs(0);
		br.close();
		bw.flush();
		bw.close();
	}
	
}

 


  앞선 N과 M (2), N과 M (3)을 합친 듯한 문제이다. 그렇기에 풀이 역시 두 가지 문제를 고려해 추가했던 부분을 작성해주면 된다.

import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.OutputStreamWriter;
import java.util.StringTokenizer;

class Main {
	static BufferedReader br;
	static BufferedWriter bw;
	static int n,m;	
    
	static void dfs(int[] a,int v,int cnt) throws IOException {
		if(cnt == m) {
			for(int i=0;i<m;i++) {
				bw.write(String.valueOf(a[i]+" "));
			}
			bw.newLine();
			
			return;
		}
		
		// 중복을 고려하지 않기 위해 check배열을 사용하지 않고,
        // 앞선 숫자 뒤에 오는 숫자는 자신보다 크거나 같은 숫자들이 위치해야 하므로 인자를 하나 더 넘겨준다.
        // 넘겨받은 인자부터 반복문을 수행하면 해결.
		for(int i=v;i<=n;i++) {		
				a[cnt] = i;
				dfs(a,i,cnt+1);			
		}
	}
	
	public static void main(String[] args) throws IOException  {
		br = new BufferedReader(new InputStreamReader(System.in));
		bw = new BufferedWriter(new OutputStreamWriter(System.out));
		StringTokenizer st = new StringTokenizer(br.readLine());
		
		n = Integer.parseInt(st.nextToken());
		m = Integer.parseInt(st.nextToken());
		
		int a[] = new int[m];
		
		
		dfs(a,1,0);
		
		bw.flush();
		bw.close();
		br.close();
		
	}
}
저작자표시 (새창열림)
'CodingTest/백준 온라인 저지(BOJ)' 카테고리의 다른 글
  • [백준,BOJ 2580] 스도쿠 (JAVA 구현,추가풀이)
  • [백준,BOJ 9663] N-Queen (JAVA 구현,추가풀이)
  • [백준,BOJ 15649] N과 M(2) (JAVA 구현,추가풀이)
  • [백준,BOJ 2206] 벽 부수고 이동하기(JAVA 구현,추가풀이)
뜸부깅
뜸부깅
코딩에 대한 여러 개인적인 생각을 정리하고 공부를 하는 공간입니다!!
  • 뜸부깅
    코오오딩
    뜸부깅
  • 전체
    오늘
    어제
    • Note (429)
      • Skill (31)
        • Java & Spring (9)
        • Javascript & HTML & CSS (0)
        • React (0)
        • Next.js (22)
      • CodingTest (389)
        • 백준 온라인 저지(BOJ) (140)
        • 프로그래머스(Programmers) (79)
        • LeetCode (170)
      • Algorithm & Data Structure (6)
      • [Project] 포트폴리오 (3)
        • Front end (3)
        • Back end (0)
  • 블로그 메뉴

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

  • 공지사항

  • 인기 글

  • 태그

    백준7576자바
    BOJ
    백준2751
    TypeScript
    component-scan
    자바
    next 14
    알고리즘
    백준1427
    백준7576
    boj1427
    boj2108
    백준1260
    Easy
    프로그래머스
    백준
    leetcode 2236
    Java
    medium
    meidum
  • 최근 댓글

  • 최근 글

  • hELLO· Designed By정상우.v4.10.3
뜸부깅
[백준,BOJ 15652] N과 M(4) (JAVA 구현,추가풀이)
상단으로

티스토리툴바