today's alogrithm

[BOJ] 1254번 팰린드롬 만들기 - JAVA

UR'im 2021. 6. 17. 19:56

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

 

1254번: 팰린드롬 만들기

동호와 규완이는 212호에서 문자열에 대해 공부하고 있다. 규완이는 팰린드롬을 엄청나게 좋아한다. 팰린드롬이란 앞에서부터 읽으나 뒤에서부터 읽으나 같게 읽히는 문자열을 말한다. 동호는

www.acmicpc.net

 

오늘 풀어본 문제는 실버 티어 1,2 등급에 있는 문제인 팰린드롬 만들기~

첫 시도에 실패를 맛보고 좀 더 고민한뒤 풀어서 맞췄다.

바보같이 StringBuffer에다가 append를 이상하게 하고있었다.

import java.util.*;
class Main{
	public static void main (String[] args){
		Scanner sc = new Scanner(System.in);
		StringBuffer str = new StringBuffer(sc.next());
		for(int i = 0; i<str.length(); i++){
			if(str.charAt(i) != str.charAt(str.length()-1-i)){
				str.insert(str.length()-1-i, str.charAt(i)+"");
			}
		}
		System.out.println(str.length());
	}
}

짧은 말도 안되는 코드를 짜놨다.. 앞뒤로 비교하면서 insert했는데 생각해보니까 꼭 문장 뒤에 문자열을 붙이는 걸로 해야됬다.. 그래서 길이가 맞을 수 가 없는 방법,,

import java.util.*;
class Main{
	public static void main (String[] args){
		Scanner sc = new Scanner(System.in);
		StringBuffer str = new StringBuffer(sc.next());
		int leng = str.length();
		int cnt = 0;
		while(cnt < leng){
			boolean check = true;
			for(int i = 0; i+cnt < leng; i++){
				if(str.charAt(i+cnt) != str.charAt(str.length()-1-i)) {
					cnt += 1;
					check = false;
					break;
				}
			}
			if(check){
				System.out.println(str.length()+cnt);
				return;
			}
		}
	}
}

그리고 다시 짠 코드인데 마음에 안든다.. 코드를 줄이는 방법을 고민해봐야겟다..

첫번째 시도에서 틀리고 나서 어떻게 풀어야할까 고민하다가 aabba라는 문자열과 뒤집힌 문자열 abbaa를 비교하면서 체크하는 코드를 작성했다.

예를 들어 cnt = 0일때

a b b a a          
a a b b            

일치 하지 않으면 cnt에 1을 더해준다.

cnt =1 일때

  a b b a a        
a a b b a          

일치하지 않는 문자가 없기 때문에 결과에서 원래 문자열 + cnt해주면 팰린드롬이 되는 문자열의 최소 문자열의 길이를 찾을 수 있다.