백준 알고리즘 정리 (문자열 - 30089번)

황제연·2024년 3월 25일
0

알고리즘

목록 보기
15/169
post-thumbnail
문제번호제목난이도
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();
    }

}

고민의 시간과 해결 방법:

  1. 생각보다 까다로운 문제였다. 처음에는 투포인터 방식을 사용해서 해결하려 했으나, 테스트 케이스는 통과했으나, 제출을 통과하지 못하였다.
  2. 따라서 투포인터 방식을 버리고 다른 방법을 생각했는데, 앞과 뒤를 비교하는 방법이다.
  3. T동안 순회하면서 문자열을 입력받는다.
  4. 만들고자 하는 문자열은 펠린드롬 형태이다. 따라서 앞문자와 뒷문자를비교했을 때, 같아야지 펠린드롬 형태가 될 수 있다
  5. 앞에서 쭉 다르다가 어느 지점에서 앞과 뒤를 비교했을 때 같아지는 지점이 있다.
  6. 이것을 찾기 위해 이중 순회를 하기로 계획하였다
  7. 먼저 바깥쪽 순회는 j=0부터 문자열 길이만큼 순회를 한다. 이때 같아지는 지점을 발견하면 출력하고 종료하도로고 find라는 boolean 변수를 선언하였다.
  8. 안쪽 순회에서는 현재 찾고자하는 기준이 되는 j와 그 지점부터 순회해서 뒤 문자와 비교했을 때 문자가 다른지 비교한다.
  9. 다르다면 기준이 되는 j를 증가시켜서 다시 비교해야 하므로 find=false; 후, break로 탈출한다
  10. 만약 안쪽 순회 진행동안 앞과 뒤가 다른 부분을 발견하지 않으면 find는 true일 것이고 그 지점의 바로 이전 지점부터 펠린드롬 형태를 만족하지 않으므로, 0까지 순회를 통해 input 문자열에 append한다
  11. 이후 바깥쪽 순회를 break 탈출하고, 이후 T 순회에서 남은 문자열에 대한 순회 출력을 위해 "\n"을 추가로 append한 뒤, 해당 문자열을 출력한다.

문제 링크:

30089 - 새로운 문자열 만들기

profile
Software Developer

0개의 댓글