본문 바로가기
SSAFY/Daily

20220214 APS 응용 순열

by Hunveloper 2022. 2. 14.
728x90

비교연산자

Comparable

  • 자신과 인자로 전달 받는 타 원소와 비교하여 정수 리턴
    • 음수 결과 : 타 원소가 크다 x.compareTo(other)
    • 0 결과 : 둘이 같다
    • 양수 결과 : 자신이 크다

Comparator

  • 비교 대상의 두 원소가 아닌 별도의 도우미 역할
  • 두 원소(o1, o2) 비교하여 정수 리턴
    • 음수 결과 : o2 원소가 크다
    • 0 경과 : 둘이 같다
    • 양수 결과 : o1 원소가 크다

순열 (Permutation)

  • 서로 다른 것들 중 몇 개를 뽑아서 한 줄로 나열하는 것
  • 서로 다른 n개 중 r개를 택하는 순열은 nPr

순열을 생성하는 방법

  1. 반복문을 통한 순열 생성 : 순열의 갯수가 적을때, 순열의 길이가 변동이 없을때
  2. 재귀 호출을 통한 순열 생성 : boolean[ ] 사용
  3. 비트마스킹을 통한 순열 생성 : 정수와 비트연산자를 사용
  4. 현 순열에서 사전 순으로 다음 순열 생성 ( NextPermutation )
    • 배열을 오름차순으로 정렬한 후 시작
    • 아래 과정을 반복하여 사전 순으로 다음으로 큰 순열 생성
      1. 뒤쪽부터 탐색하며 교환위치 ( i-1 ) 찾기 ( i:꼭대기 )
      2. 뒤쪽부터 탐색하며 교환위치 ( i-1 )와 교환할 큰 값 위치 ( j ) 찾기
      3. 두 위치 값 ( i-1, j ) 교환
      4. 꼭대기위치 ( i ) 부터 맨 뒤까지 오름차순 정렬
package com.ssafy.bit;
import java.lang.reflect.Array;
import java.util.Arrays;
import java.util.Scanner;
public class NextPermutationTest {
static int N, input[];
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
N=sc.nextInt();
input = new int[N];
for(int i=0;i<N;i++)
input[i]=sc.nextInt();
// 1. 오름차순 정렬
Arrays.sort(input);
do {
// 순열 출력
System.out.println(Arrays.toString(input));
}while(np());
}
private static boolean np() {
// 1. 교환위치 찾기
int i = N-1;
while(i>0 && input[i-1]>=input[i])
--i;
if(i==0)
return false;
// 2. 교환위치에 교환할 값 찾기
int j = N-1;
while(input[i-1]>=input[j])
--j;
// 3. 교환위치와 교환할 값 교환하기
swap(i-1, j);
// 4. 교환위치 뒤(꼭대기)부터 맨 뒤까지 만들수 있는 가장 작은 순열 생성 (오름차순정렬)
int k=N-1;
while(i<k)
swap(i++, k--);
return true;
}
public static void swap(int i, int j) {
int temp=input[i];
input[i]=input[j];
input[j]=temp;
}
}

비트 연산자

  • & : 비트단위로 AND 연산
  • | : 비트단위로 OR 연산
  • ^ : 비트단위로 XOR 연산 ( 같으면 0, 다르면 1 )
  • ~ : 단항 연산자로서 피연산자의 모든 비트를 반전
  • << : 피연산자의 비트 열을 왼쪽으로 이동
  • >> : 피연산자의 비트 열을 오른쪽으로 이동 ( 부호비트로 좌측을 채움 )
  • >>> : 피연산자의 비트 열을 오른쪽으로 이동 ( 0으로 좌측을 채움 )
728x90
728x90

'SSAFY > Daily' 카테고리의 다른 글

20220217 APS 응용 백트래킹, 그래프  (0) 2022.02.21
20220215 APS 응용, 조합, 탐욕기법  (0) 2022.02.15
20220210 트리, BFS, DFS  (0) 2022.02.10
20220208 LinkedList  (0) 2022.02.10
20220207 APS 기본  (0) 2022.02.10

댓글