일단 씻고 나가자

1254번 : 팰린드롬 만들기 본문

Coding-Test/백준을 자바라

1254번 : 팰린드롬 만들기

일단 씻고 나가자 2023. 4. 3. 15:14

워~ 쉽다 이거이 다 쉽워~

 

문자열의 수정이나 삭제는 문법적인 주의도 요해야 함과 동시에 논리적인 흐름도 신경 써야 해서 어지러운 것 같다.

따라서 문자열의 수정 관련 클래스와 규칙성만 발견한다면 잘 해낼 수 있었던 문제.

 

물론 코딩 끈이 짧지만, 개인적인 철학으로는 '내가 이 문제를 푸는 방법을 그대로 코딩에 적용하자'라는 마인드가 있다.

다만 사람이 푸는 건 시각적으로 슥 보는 순간 뇌에서 여러 논리적인 흐름을 거쳐 답을 도출하므로,

내가 어떤 논리적은 흐름을 거쳐서 답을 도출해낼 수 있었는지에 대한 성찰과 설명이 필요하다.

 

다만 순간적인 판단으로 답을 내리는 건 적용해서도 안 되고 적용할 수도 없다.

예제 3번의 경우는 문자열의 크기가 워낙 작기 때문에 보기만 해도 직관적으로 답을 낼 수 있지만,

직관을 코딩할 순 없으니..

그래서 예제 4번처럼 문자열이 많아 사람도 한 번에 처리하기 힘든 크기일 때 내가 어떻게 답을 도출해낼 수 있는지 생각해보아야 한다.

 

첫 번째 생각한 아이디어로는 문자열의 가운데 글자 중심으로 양 사이드를 검사해가며 문자를 더하는 방법이다.

그럴듯해 보였지만, 해당 방법은 위 그림의 5번같은 케이스에서 애로사항이 생기게 된다. d에서 시작하여 왼쪽, 오른쪽으로 가면 bcdcb 까진 같아 다른 부분이 없어 보이지만

마지막 c와 a를 검사할 때 둘이 다르기 때문에 다른 문자를 더하여 팰린드롬을 만들 수 있는 케이스가 아닌, a를 중심으로 문자열 전체를 반복해야 하는 케이스가 되어버리기 때문이다. (윗 예시의 qerty와 같은 케이스)

따라서 해당 방법은 기각!!

 

그래서 생각의 전환을 해보았다. 어차피 팰린드롬이라면 첫 문자와 마지막 문자는 같을 것이고,

문자열을 검사한 후 같지 않다면 어쨌든 팰린드롬은 만들어야 하니까 첫 문자를 마지막에 붙여야 할 것이다.

그리고 다시 팰린드롬 검사, 만약 이번에도 아니라면

이번엔 두 번째 문자를 끝에서 두 번째 자리와 검사해보고 아니라면 추가.. 하면 되는 거 아닌가?는 생각으로 이어졌다.

오? 그럴 듯한데?

 

끝 - i 번째에 삽입이 반복된다고 해도 삽입되는 index는 원래 문자열의 끝부분이기 때문에 원본 문자열이 변형되지 않고 끝에만 이어붙이는 꼴이 된다.

 

해당 로직은 문제가 없어 보였고, 코드 구성으로 선택했다.

해당 로직을 구현하기 위해선 해당 문자열이 palindrome인지 검사하는 함수와,

만약 false라면 문자열의 특정 인덱스에 문자를 추가하는 로직, 그리고 방법이 필요하다.

따라서 palindrome인지 검사하는 isPalindrome 함수를 만들었고,

방식으로는 문자열의 처음과 마지막 끝에서 하나씩 비교하는 투 포인터 방식으로 구현했고,

특정 인덱스에 문자를 추가하는 방법으로는

StringBuilder 클래스의 .insert(int index, String string) 함수를 채택했다.

 

 

따라서 최종 코드는~~

 

올바른 철자는 palindrome 입니다 ^_^ 멍청해서 죄송합니다.

최근들어 코테 문제를 많이 접하다보니

문자열의 인덱스 접근, 수정은 물론이고 이런 양쪽에서 접근하여 비교하는 문제가 많은 것 같다.

재밌다! 수학 문제처럼 즐겁게 풀어보장

공부할 게 너무 아많다많다많아

'Coding-Test > 백준을 자바라' 카테고리의 다른 글

[Java] 백준 입출력 템플릿 form  (0) 2024.08.22
24174번 : 알고리즘 수업 - 힙 정렬 2  (0) 2023.03.22
1158번 : 요세푸스 문제  (1) 2023.03.17
26008번 : 해시 해킹  (0) 2023.03.16
10818번 : 최소, 최대  (2) 2023.03.15