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

[JAVA]백준_2661_좋은순열

by 박 현 황 2021. 3. 7.

문제링크

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

 

2661번: 좋은수열

첫 번째 줄에 1, 2, 3으로만 이루어져 있는 길이가 N인 좋은 수열들 중에서 가장 작은 수를 나타내는 수열만 출력한다. 수열을 이루는 1, 2, 3들 사이에는 빈칸을 두지 않는다.

www.acmicpc.net

 

 

 

import java.util.Scanner;

public class Main {
	static int N;
	static String res="";
	static boolean isTrue;
	public static void main(String[] args) {
		Scanner sc = new Scanner(System.in);
		
		N = sc.nextInt();
		
		dfs("1",1); //1번째 위치에 1 넣기
		
		//System.out.println(result);
	}

	static void dfs(String res,int cnt) {//좋은 순열 인 것들만 넘어옴
		if(isTrue) return;
		if(cnt == N) {
			System.out.println(res);
			isTrue = true;
			return;
		}
		
		for(int i=1;i<=3;i++) {
			if(isPossible(res+i)) dfs(res+i,cnt+1);
		}
	}
	

	static boolean isPossible(String res) {
		//전체 길이의 반틈만 비교
		int div = res.length() /2;
		int beginIndex = res.length() -1; //전체index 바로 앞에꺼
		int endIndex = res.length(); //마지막 index
		for(int i=1;i<=div;i++) { //1부터 div길이까지 비교해주기
			if(res.substring(beginIndex-i, endIndex-i).equals(res.substring(beginIndex, endIndex))) return false;
			beginIndex -=1;
		}
		return true;
	}
}

 

백트래킹문제이다.

맨처음에 배열을 만들어서 풀려고 했는데 N = 80이라서 80자리 Integer는 비교를 못할 것 같았다.

그래서 String으로 비교하였다.

좋은 순열을 찾기위해서는 1개,2개,,,N개 까지 겹치는 순열?이 있는지 확인을 해봐야했다.

N개 까지는 할 필요 없고 N/2만큼만 진행해주면 된다

123123   -> 123 / 123 이렇게만 비교해주면 되기 때문이다.

그래서 여기까지는 쉽게 알아냈는데 자릿수마다 비교해주는거 구현하는게 힘들었당

포문 3개 돌릴려다가 이건 아닌거 같아서 구글에 검색해보았다

mygumi.tistory.com/213 이 분 글 보고 구현하는 법 배웠다.

 

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

[JAVA]백준_7576_토마토  (0) 2021.03.15
[JAVA]백준_14500_테트로미노  (0) 2021.03.14
[JAVA]백준_2667_단지번호붙이기  (0) 2021.03.06
[JAVA]백준_2023_신기한 소수  (0) 2021.03.05
[JAVA]백준_1092_배  (0) 2021.03.05