보글보글 개발일지
article thumbnail
Published 2023. 3. 14. 15:59
[백준/15649][Java] N과 M(1) 알고리즘
반응형

문제

 

15649번: N과 M (1)

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

www.acmicpc.net

가장 기본적인 백트래킹 문제이다. 

func라는 함수의 역할은, k번째 수를 정하는 것이다.

k번째 수를 정하고, k+1의 수를 재귀적으로 정해준다.

코드

package algo0314;

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

public class B15649_N과M1 {
	static int n, m;
	static int[] arr;
	static boolean[] visited;
    static StringBuilder sb = new StringBuilder();

	static void func(int k) {
		if (k == m) {
			for (int i = 0; i < m; i++) {
				sb.append(arr[i] + " ");
			}
			sb.append('\n');
		} else {
			for (int i = 0; i < n; i++) {
				if (!visited[i]) {
					visited[i] = true;
					arr[k] = i + 1;
					func(k + 1);
					visited[i] = false;
				}
			}
		}
	}

	public static void main(String[] args) throws IOException {
		// TODO Auto-generated method stub
		BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
		StringTokenizer st = new StringTokenizer(br.readLine());
		n = Integer.parseInt(st.nextToken());
		m = Integer.parseInt(st.nextToken());
		arr = new int[n];
		visited = new boolean[n];
		func(0);
        System.out.println(sb);

	}

}

 

StringBuilder을 쓰고 안 쓰냐에 따른 시간 차이

처음 제출한게 System.out.println를 사용해 하나씩 출력한 것이고, 두번째로 제출한게

    static StringBuilder sb = new StringBuilder();

 를 사용해서 한번에 출력한 것인데 출력 속도 차이가 10배 이상 나는 것을 확인할 수 있다.

웬만하면 StringBuilder을 사용하기로 하자..

반응형

'알고리즘' 카테고리의 다른 글

[백준/11724][Java] 연결요소의 개수  (0) 2023.03.16
[백준/15650][Java] N과 M(2)  (2) 2023.03.14
[백준/9742][Java] 순열  (0) 2023.03.14
[백준/12891][Java] DNA 비밀번호  (0) 2023.03.11
[백준/2018][Java] 수들의 합 5  (0) 2023.03.11
profile

보글보글 개발일지

@보글

포스팅이 좋았다면 "좋아요❤️" 또는 "구독👍🏻" 해주세요!