| 문제번호 | 제목 | 난이도 |
|---|
| 30089 | 새로운 문자열 만들기 | 실버 4 |
30089번 새로운 문자열 만들기
해결코드:
import java.io.*;
import java.util.*;
public class Main {
public static void main(String[] args) throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(System.out));
int T = Integer.parseInt(br.readLine());
for (int i = 0; i < T; i++) {
StringBuilder input = new StringBuilder(br.readLine());
boolean find;
for (int j = 0; j < input.length(); j++) {
find = true;
for (int k = 0; j+k < input.length(); k++) {
if(input.charAt(j+k) != input.charAt(input.length()-1-k)){
find = false;
break;
}
}
if(find){
for (int k = j-1; k >= 0; k--) {
input.append(input.charAt(k));
}
break;
}
}
input.append("\n");
bw.write(input.toString());
}
br.close();
bw.close();
}
}
고민의 시간과 해결 방법:
- 생각보다 까다로운 문제였다. 처음에는 투포인터 방식을 사용해서 해결하려 했으나, 테스트 케이스는 통과했으나, 제출을 통과하지 못하였다.
- 따라서 투포인터 방식을 버리고 다른 방법을 생각했는데, 앞과 뒤를 비교하는 방법이다.
- T동안 순회하면서 문자열을 입력받는다.
- 만들고자 하는 문자열은 펠린드롬 형태이다. 따라서 앞문자와 뒷문자를비교했을 때, 같아야지 펠린드롬 형태가 될 수 있다
- 앞에서 쭉 다르다가 어느 지점에서 앞과 뒤를 비교했을 때 같아지는 지점이 있다.
- 이것을 찾기 위해 이중 순회를 하기로 계획하였다
- 먼저 바깥쪽 순회는 j=0부터 문자열 길이만큼 순회를 한다. 이때 같아지는 지점을 발견하면 출력하고 종료하도로고 find라는 boolean 변수를 선언하였다.
- 안쪽 순회에서는 현재 찾고자하는 기준이 되는 j와 그 지점부터 순회해서 뒤 문자와 비교했을 때 문자가 다른지 비교한다.
- 다르다면 기준이 되는 j를 증가시켜서 다시 비교해야 하므로 find=false; 후, break로 탈출한다
- 만약 안쪽 순회 진행동안 앞과 뒤가 다른 부분을 발견하지 않으면 find는 true일 것이고 그 지점의 바로 이전 지점부터 펠린드롬 형태를 만족하지 않으므로, 0까지 순회를 통해 input 문자열에 append한다
- 이후 바깥쪽 순회를 break 탈출하고, 이후 T 순회에서 남은 문자열에 대한 순회 출력을 위해 "\n"을 추가로 append한 뒤, 해당 문자열을 출력한다.
문제 링크:
30089 - 새로운 문자열 만들기