문제를 푸는 과정을 떠올리는 것은 쉬웠지만, 코드로 구현하는 것이 어려웠다. 🥲
1. 1~3으로 이루어진 수열 만들기
private static void findSequence(String sequence) {
if (sequence.length() == N) {
System.out.println(sequence);
System.exit(0);
}
for (int i = 1; i <= 3; i++) {
if (isGood(sequence + i)) {
findSequence(sequence + i);
}
}
}
2. 좋은 수열인지 확인하기
지금까지 좋은 수열이었지만, 문자가 추가되면 나쁜 수열이 될 수 있다. 따라서 매번 좋은 수열 여부를 확인하는 것이 필요하다.
수열은 마지만 인덱스를 기준으로 길이를 1씩 늘려가며 비교한다. 이때 left와 right가 같다면, 해당 수열은 나쁜 수열이 된다.
private static boolean isGood(String sequence) {
for (int i = 1; i <= sequence.length() / 2; i++) {
String front = sequence.substring(sequence.length() - i * 2, sequence.length() - i);
String back = sequence.substring(sequence.length() - i, sequence.length());
if (front.equals(back)) {
return false;
}
}
return true;
}
subString
함수를 이용하여 잘랐다. subString 알아보기
간단해서 바로 간단히 정리하고 넘어간다.
String substring(int index)
index는 0부터 시작하고, 문자열의 앞에서 부터 몇번째 위치를 지정하는 값이다. 해당 index부터 문자열의 마지막 값까지 호출한다.String str = "0123456789"; str.substring(5); // 56789
String substring(int beginIndex, int endIndex)
시작 지점과 끝 점을 지정하여 호출할 수 있다.String str = "0123456789"; str.substring(2, 5); // 2345
3. 고려할 것
package Algorithm.P2661;
import java.io.BufferedReader;
import java.io.FileInputStream;
import java.io.IOException;
import java.io.InputStreamReader;
public class P2661 {
static int N;
static StringBuilder sb;
static String result;
public static void main(String[] args) throws IOException {
System.setIn(new FileInputStream("src/Algorithm/P2661/input.txt"));
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
sb = new StringBuilder();
N = Integer.parseInt(br.readLine());
result = "";
findSequence(result);
}
private static void findSequence(String sequence) {
if (sequence.length() == N) {
System.out.println(sequence);
System.exit(0);
}
for (int i = 1; i <= 3; i++) {
if (isGood(sequence + i)) {
findSequence(sequence + i);
}
}
}
private static boolean isGood(String sequence) {
for (int i = 1; i <= sequence.length() / 2; i++) {
String front = sequence.substring(sequence.length() - i * 2, sequence.length() - i);
String back = sequence.substring(sequence.length() - i, sequence.length());
if (front.equals(back)) {
return false;
}
}
return true;
}
}