Notice
Recent Posts
Recent Comments
Link
«   2024/09   »
1 2 3 4 5 6 7
8 9 10 11 12 13 14
15 16 17 18 19 20 21
22 23 24 25 26 27 28
29 30
Archives
Today
Total
관리 메뉴

Life Engineering

[BOJ 2661] 좋은 수열 (Java) 본문

Problem Solving

[BOJ 2661] 좋은 수열 (Java)

흑개 2022. 1. 18. 14:33

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

 

2661번: 좋은수열

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

www.acmicpc.net

import java.util.*;

public class P2661 {
	static String ans="";
	static int[] nums= {1,2,3};
	static int N=-1;
	public static void main(String[] args) {
		Scanner sc=new Scanner(System.in);
		N=sc.nextInt();
		backtracking(0,"");
		System.out.println(ans);
	}
	public static boolean isGood(String s) {
		int len=s.length();
		boolean flag=true;
		for (int i=1; i<=len/2; i++) {
			String second=s.substring(len-i, len);
			String end=s.substring(len-(2*i),len-i);
			if (second.equals(end)) {
				flag=false;
				break;
			}
		}
		return flag;
	}
	public static void backtracking(int cnt, String s) {
		if (cnt==N) {
			ans=s;
			return;
		}
		for (int i=0; i<3; i++) {
			s=s.concat(Integer.toString(nums[i]));
			if (isGood(s)) {
				backtracking(cnt+1, s);
			}
			s=s.substring(0,s.length()-1);
			if (!ans.equals(""))
				break;
		}
	}
}

backtracking을 이용하는 문제.

promising을 조사하는 조건은 마지막 1개, 2개, 3개, ... 와 인접한 1개, 2개, 3개, ... 의 서브스트링이 동일한지 체크해주면 된다. 

다른 분들의 코드를 보니 backtracking 과정에서 더했던 수를 안 빼줘도 된다.

어차피 최소인 값을 구하는 거니까, (cnt==N) 이 부분에서 답을 출력하고 함수를 끝내줘도 되기 때문이다.