본문 바로가기
알고리즘/백준 - 실버

백준 10974 순열

by 호롤롤로루야 2021. 12. 28.

백준 10974 순열

1. 문제 링크

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

 

10974번: 모든 순열

N이 주어졌을 때, 1부터 N까지의 수로 이루어진 순열을 사전순으로 출력하는 프로그램을 작성하시오.

www.acmicpc.net

 

2. 문제 해결에 대한 아이디어

  1. 문제의 테스트 케이스는 [1, 2, 3]에 대한 순열의 결과이다.
  2. visit 을 사용하여, 순열 결과 배열(int[] candidate)에 들어가는 숫자의 순서를 제어한다.
  3. 백트래킹으로 모든 순열을 구할 수 있으며, 테스트 케이스 기준으로 아래와 같이 동작한다. (depth를 인데스로 사용하고 있다.)
  4. 재귀의 depth별 결과는 아래와 같다.

 

3. 코드

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

public class Main {
    static int[] candidate; // 순열의 결과가 담길 배열
    static int[] nums;
    static boolean[] visit;
    static int N;

    public static void main(String[] args) throws IOException {
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        N = Integer.parseInt(br.readLine());

        nums = new int[N];
        visit = new boolean[N];
        candidate = new int[N];

        for (int i = 0; i < N; i++) {
            nums[i] = i + 1;
        }

        permutation(0);
    }

    static void permutation(int depth) {
        if (depth == N) {
            Arrays.stream(candidate).forEach(v -> System.out.print(v + " "));
            System.out.println();
            return;
        }

        // 항상 0부터 시작하여 visit[i]를 체크
        for (int i = 0; i < N; i++) {
            if (!visit[i]) {
                visit[i] = true;
                // depth 를 인덱스로 사용하는 것을 잊지말자
                candidate[depth] = nums[i];
                permutation(depth + 1);
                visit[i] = false;
            }
        }
    }
}

4. 채점 결과

5. 느낀 점

  1. 순열의 전형적인 문제였으며, 익숙해져야하는 유형이다.
  2. 재귀를 들어갔다 나오면서 visit 배열을 원래 상태로 만들어야한다.
  3. 순열 외에 중복순열, 중복조합, 조합 등의 문제는 위의 permutation 함수 코드를 응용해서 풀면 된다.

 

'알고리즘 > 백준 - 실버' 카테고리의 다른 글

백준 15650 N과 M (2)  (0) 2021.12.30
백준 15649 N과 M (1)  (0) 2021.12.29
백준 6603 로또  (0) 2021.12.27
백준 7576 토마토  (0) 2021.09.07
백준 1012 유기농 배추  (0) 2021.09.06

댓글