눈을 깜빡일 때마다 문자열이 변한다. 변하는 방법은 다음과 같다.
1. 문자열이 같은 길이로 나뉜다. (홀수 길이이면 뒤의 문자열이 1 짧다.)
2. 뒤의 문자열이 역순으로 앞의 문자열 사이사이에 추가된다.
Ex) abcdefg → abcd / efg → agbfced
X번 눈을 깜빡일 때 최종 문자열을 출력하면 된다.
문자열의 변환 방법으로 역순으로 진행하면 된다.
1. 홀수 번째 문자들이 앞으로 압축된다. abcde → ace...
2. 짝수 번째 문자들은 뒤로 압축된다. 이때 순서가 뒤집힌다. abcde → ...db
Ex) abcdefg → acegfdb
문자열을 변환하다가 N번째 변환에서 첫번째 문자열과 같아지면 N을 주기로 문자열 변환이 반복된다는 것이다. 이를 통해 더 빠르게 문제를 해결할 수 있다.
Map<Integer, String> map = new HashMap<>();
int X = Integer.parseInt(reader.readLine());
String string = reader.readLine();
map.put(0, string);
for (int x = 1; x <= X; x++) {
StringBuilder pre = new StringBuilder();
for (int i = 0; i < string.length(); i += 2) pre.append(string.charAt(i));
StringBuilder post = new StringBuilder();
for (int i = 1; i < string.length(); i += 2) post.append(string.charAt(i));
string = pre.append(post.reverse()).toString();
if (map.get(0).equals(string)) {
string = map.get(X % x);
break;
}
map.put(x, string);
}
result.append(string);