코딩 테스트(JAVA)/백준

[백준 15651번] N과 M(3)

Lea Hwang 2022. 5. 3. 13:30

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

 

15651번: N과 M (3)

한 줄에 하나씩 문제의 조건을 만족하는 수열을 출력한다. 중복되는 수열을 여러 번 출력하면 안되며, 각 수열은 공백으로 구분해서 출력해야 한다. 수열은 사전 순으로 증가하는 순서로 출력해

www.acmicpc.net

 

문제

자연수 N과 M이 주어졌을 때, 아래 조건을 만족하는 길이가 M인 수열을 모두 구하는 프로그램을 작성하시오.

  • 1부터 N까지 자연수 중에서 M개를 고른 수열
  • 같은 수를 여러 번 골라도 된다.

입력

첫째 줄에 자연수 N과 M이 주어진다. (1 ≤ M ≤ N ≤ 7)

출력

한 줄에 하나씩 문제의 조건을 만족하는 수열을 출력한다. 중복되는 수열을 여러 번 출력하면 안되며, 각 수열은 공백으로 구분해서 출력해야 한다.

수열은 사전 순으로 증가하는 순서로 출력해야 한다.

예제 입력 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

 

 

문제 분석

중복 있음
순서 있음
→ 중복 순열

 

 

실패 코드

import java.util.Scanner;

public class Main {
	static int[] pm;
	static int n,m;
	public void DFS(int L) {
		if(L == m) {
			for(int x : pm) System.out.print(x + " ");
			System.out.println();
		}else {
			for(int i=1; i<=n; i++) {
				pm[L] = i;
				DFS(L+1);
			}
		}
	}

	public static void main(String[] args) { 
		Main T = new Main();
		Scanner kb = new Scanner(System.in);
		n = kb.nextInt();
		m = kb.nextInt();
		pm = new int[m];
		T.DFS(0);
	}

}

 

 

드디어 시간초과가 나왔습니다....

원인 :  System.out.print(); 

 

출력을 StringBuilder로 수정해서 코드 구현을 해보겠습니다.

 

 

성공 코드

import java.util.Scanner;

public class Main {
	static int[] pm;
	static int n,m;
	static StringBuilder sb = new StringBuilder();
	public void DFS(int L) {
		if(L == m) {
			for(int x : pm) sb.append(x + " ");
			sb.append('\n');
		}else {
			for(int i=1; i<=n; i++) {
				pm[L] = i;
				DFS(L+1);
			}
		}
	}

	public static void main(String[] args) { 
		Main T = new Main();
		Scanner kb = new Scanner(System.in);
		n = kb.nextInt();
		m = kb.nextInt();
		pm = new int[m];
		T.DFS(0);
		System.out.print(sb);
	}

}

 


 

 

자바의 정석에서 StringBuffer클래스와 StringBuilder클래스를 정리한 포스팅입니다.

StringBuffer클래스와 StringBuilder클래스

 

StringBuffer클래스와 StringBuilder클래스

자바의 정석 Chapter 소제목 9. java.lang패키지와 유용한 클래스 1.1.3 StringBuffer클래스와 StringBuilder클래스 알고리즘 문제를 풀거나 남들이 적어둔 코드를 보다 보면 문자열을 String이 아닌 StringBu..

lealea.tistory.com

 

 

인프런 중복순열 문제입니다.

중복순열

 

중복순열

1부터 N까지 번호가 적힌 구슬이 있습니다. 이 중 중복을 허락하여 M번을 뽑아 일렬로 나열 하는 방법을 모두 출력합니다. ▣ 입력설명 첫 번째 줄에 자연수 N(3<=N<=10)과 M(2<=M<=N) 이 주어집니다. ▣

lealea.tistory.com

 

 

백트래킹 기본 문제인, N과 M 시리즈 (1), (2)입니다. 시리즈는 한 번에 다 보시는 것을 추천합니다.

[백준 15649번] N과 M(1)

 

[백준 15649번] N과 M(1)

https://www.acmicpc.net/problem/15649 15649번: N과 M (1) 한 줄에 하나씩 문제의 조건을 만족하는 수열을 출력한다. 중복되는 수열을 여러 번 출력하면 안되며, 각 수열은 공백으로 구분해서 출력해야 한다.

lealea.tistory.com

[백준 15650번] N과 M(2)

 

[백준 15650번] N과 M(2)

https://www.acmicpc.net/problem/15650 15650번: N과 M (2) 한 줄에 하나씩 문제의 조건을 만족하는 수열을 출력한다. 중복되는 수열을 여러 번 출력하면 안되며, 각 수열은 공백으로 구분해서 출력해야 한다.

lealea.tistory.com

 

'코딩 테스트(JAVA) > 백준' 카테고리의 다른 글

[백준 1182번] 부분수열의 합  (0) 2022.05.05
[백준 15652번] N과 M(4)  (0) 2022.05.03
[백준 15650번] N과 M(2)  (0) 2022.05.03
[백준 15649번] N과 M(1)  (0) 2022.05.03
[백준 14888번] 연산자 끼워넣기  (0) 2022.04.27