본문 바로가기
코딩/백준-자바

[자바] 백준 2661번: 좋은수열

by 철없는민물장어 2023. 1. 19.
728x90
반응형

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

 

2661번: 좋은수열

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

www.acmicpc.net

 

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

public class P2661 {

	static boolean isFinish = false;

	public static void main(String[] args) throws NumberFormatException, IOException {

		BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
		int n = Integer.parseInt(br.readLine());

		StringBuffer sb = new StringBuffer();
		perm(sb, 0, n);
	}

	static boolean isGoodNum(StringBuffer sb) {
		// StringBuffer sb = new StringBuffer(String.valueOf(n));
		boolean isG = true;

		for (int i = 1; i <= sb.length() / 2 && isG; i++) {
			int a = sb.length() - i;
			int b = sb.length() - 2 * i;

			boolean flag = true;
			for (int j = 0; j < i; j++) {

				if (sb.charAt(a + j) != sb.charAt(b + j)) {
					flag = false;
				}

			}
			if (flag == true) {
				isG = false;
				break;
			}
		}

		return isG;
	}

	static void perm(StringBuffer sb, int i, int n) {
		if (i == n) {
			if (!isFinish) {
				System.out.println(sb);
				isFinish = true;
			}
			return;
		}

		else {
			for (int k = 1; k <= 3 && !isFinish; k++) {
				sb.append(k);
				if (isGoodNum(sb)) {
					perm(sb, i + 1, n);
				}
				sb.deleteCharAt(i);
			}
		}

	}
}

현재 수열이 좋은수열인지 판단하는 함수 boolean isGoodNum(StringBuffer sb)가 있다.

StringBuffer형태의 숫자를 인자로 받아서,

수열의 끝에서부터 i자릿수의 수열 짝을 만들어 같은 수열이 반복되는지 확인한다.

좋은 수열이라면 true를, 아니라면 false를 리턴한다.

 

perm함수에서는

각 단계마다 sb에 한 숫자씩 덧붙인다.

숫자를 덧붙였을 때 해당 sb가 좋은 수열이라면

perm(sb,i+1,n)을 호출해 다음 단계를 수행한다.

 

728x90
반응형

댓글