Dlise
시원한 냉장고
Dlise
전체 방문자
오늘
어제
  • 시원한 냉장고 (136)
    • Java (31)
      • Java (26)
      • Spring (5)
    • Algorithm & PS (25)
      • Algorithm (14)
      • Problem Solving (11)
    • Network (12)
    • Database (2)
    • Data Structure (4)
    • OOP & CleanCode (5)
    • Web (0)
    • Git (2)
    • AI (2)
    • Project (1)
      • Discord Bot (1)
    • Error (19)
    • Tools (5)
    • 수학 (5)
      • 확률과 통계(기초) (5)
    • 컴퓨터 구조 (3)
    • 활동 (20)
      • 행사 & 여행 (10)
      • 자격증 (4)
      • 회고 (6)
      • 기타 (0)

블로그 메뉴

  • 홈
  • 태그
  • 방명록

공지사항

인기 글

태그

  • 네트워크
  • java
  • 통계학
  • 가장쉬운알고리즘책
  • 백준
  • 중위 표기법
  • 열혈강의자료구조
  • 후위 표기법
  • spring security in action second edition
  • CleanCode

최근 댓글

최근 글

티스토리

hELLO · Designed By 정상우.
Dlise

시원한 냉장고

Algorithm & PS/Algorithm

알고리듬 - 순열

2023. 11. 24. 18:11

프로그래머스 2단계에 순열을 활용하는 완전탐색 문제가 보여서 이에 대한 전반적인 내용을 정리하고자 한다.

 

순열(Permutation)

순열이란 서로 다른 n개 중 r개를 골라 순서를 고려해 나열한 경우의 수이다.

순열의 계산은 아래와 같이 한다.

 

 

 

순열의 개수 계산 구현

식만 알고 있으면 순열의 수 계산을 구현하는 것은 어렵지 않다.

public class Main {
    public static void main(String[] args) {
        System.out.println(calculatePermutation(10, 3));
    }

    static int calculatePermutation(int n, int r) {
        int sum = 1;
        for(int i = 0; i < r; i++)
            sum *= n--;
        return sum;
    }
}

 

 

순열 경우 구현

이번엔 숫자 입력 값에 따라 순열의 모든 경우를 출력하는 코드를 구현해 보자.

예를 들어 3을 입력하면 아래와 같이 동작한다. 

 

구현은 DFS를 활용했다. 코드와 결과는 아래와 같다.

import java.util.Arrays;

public class Main {
    public static void main(String[] args) {
        int input = 3;
        boolean[] visited = new boolean[input];
        int[] permutation = new int[input];
        printPermutation(input, 0, permutation, visited);
    }

    static void printPermutation(int n, int count, int[] permutation, boolean[] visited) {
        if(count == n) {
            System.out.println(Arrays.toString(permutation));
            return;
        }

        for(int i = 0; i < n; i++) {
            if(!visited[i]) {
                visited[i] = true;
                permutation[count] = i + 1;
                printPermutation(n, count + 1, permutation, visited);
                visited[i] = false;
            }
        }
    }
}


아래는 input = 5일 때의 결과이다. 올바르게 동작함을 확인할 수 있다.

보고 있자니 어지러워서 접어 둔다.

더보기

 

input은 3에서 5로 2만큼 증가했는데 출력 개수는 6에서 120으로 114만큼 증가했다.

O(n!)의 시간복잡도를 가지기 때문에 순열을 활용하는 완전탐색 문제는 대부분 n의 값이 작다.

 

막상 구현하고 보니 할만하다는 생각이 들었다. 지레 어렵겠거니 생각한 것에 대한 아쉬움이 있다.

'Algorithm & PS > Algorithm' 카테고리의 다른 글

알고리듬 - Next Permutation  (0) 2024.02.15
알고리듬 - 맨해튼 거리, 유클리드 거리  (0) 2023.11.26
알고리듬 - 순위 매기기  (0) 2023.09.16
알고리듬 - 최대 공약수 & 최소 공배수 구하기(유클리드 호제법)  (0) 2023.08.30
알고리듬 - 소수 구하기(에라토스테네스의 체)  (0) 2023.08.30
    'Algorithm & PS/Algorithm' 카테고리의 다른 글
    • 알고리듬 - Next Permutation
    • 알고리듬 - 맨해튼 거리, 유클리드 거리
    • 알고리듬 - 순위 매기기
    • 알고리듬 - 최대 공약수 & 최소 공배수 구하기(유클리드 호제법)
    Dlise
    Dlise

    티스토리툴바