보글보글 개발일지
Published 2023. 3. 14. 15:38
[백준/9742][Java] 순열 알고리즘
반응형

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

 

9742번: 순열

입력은 여러 개의 테스트 케이스로 이루어져 있다. 각 테스트 케이스는 한 줄로 이루어져 있다. 첫 번째 문자열은 서로 다른 숫자와 알파벳으로 이루어져 있으며, 길이는 최대 10이다. 또한, 사전

www.acmicpc.net

백트래킹을 사용한 문제. 

테케 갯수가 정해져 있지 않기에 읽은 라인이 null일때까지 반복

package algo0314;

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

public class B9742_순열 {
	static char[] arr; //처음에 입력받은 배열
	static char[] arr2; //새로 만들어지는 수들 저장

	static int loc,cnt;
	//loc는 몇번째 수를 찾는건지, cnt는 그걸 카운팅 하기 위한 변수
	static boolean[] isUsed;
	private static void func(char[] arr, int k) { //현재까지 k개의 글자 선택
		if(k==arr.length) { //글자하나가 완성되었다면
			cnt++; //몇번째 배열인치 찾기
			if(cnt==loc) { //만약 찾아야하는 배열과 같다면
				for(int i=0;i<arr.length;i++) { //출력
					System.out.print(arr2[i]);
				}
				System.out.println();
			}
		}
		else { //글자하나가 아직 완성되지 않은 경우
			for(int i=0;i<arr.length;i++) { 
				if(!isUsed[i]) { //사용한 글자인지 확인
					isUsed[i] = true; //사용안했다면 사용했다고 체크
					arr2[k] = arr[i]; //k번째 글자에 i번째 글자를 저장
					func(arr,k+1); //k+1번째 글자 저장
					isUsed[i] = false; //다음 글자 생성을 위해 사용 안함으로 바꿔주기
				}
			}
		}
	}
	public static void main(String[] args) throws IOException{
		// TODO Auto-generated method stub
		BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
		String l = null;
		while((l=br.readLine())!=null) { //테케 갯수가 정해져 있지 않기에 읽은 라인이 null일때까지 반복
			cnt = 0; //카운팅 초기화
			StringTokenizer st = new StringTokenizer(l);
			String s = st.nextToken();
			arr = s.toCharArray();
			loc = Integer.parseInt(st.nextToken());
			isUsed=new boolean[arr.length];
			arr2 = new char[arr.length];
			System.out.print(s+" "+loc+" = "); //입력받은 것 출력
			func(arr,0); //함수 호출
			if(loc>cnt) { //없는 경우 출력문구
				System.out.println("No permutation");
			}
		}
	}

}
반응형

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

[백준/15650][Java] N과 M(2)  (2) 2023.03.14
[백준/15649][Java] N과 M(1)  (0) 2023.03.14
[백준/12891][Java] DNA 비밀번호  (0) 2023.03.11
[백준/2018][Java] 수들의 합 5  (0) 2023.03.11
[백준/11660][Java] 구간합 구하기 5  (0) 2023.03.11
profile

보글보글 개발일지

@보글

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