[HackerRank] Palindrome Index

아르당·2024년 4월 12일
0

HackerRank

목록 보기
74/109
post-thumbnail

문제를 이해하고 있다면 바로 풀이를 보면 됨
전체 코드로 바로 넘어가도 됨
마음대로 번역해서 오역이 있을 수 있음

Problem

ascii[a-z] 범위 안에 소문자의 문자열이 주어지고, 문자열을 팰린드롬으로 만들기 위해 제거할 수 있는 문자의 인덱스를 결정해라. 하나보다 많은 해결책이 있을지도 모르지만, 아무 것이나 사용할 수 있다. 만약 그 단어가 이미 팰린드롬이거나 해결책이 없다면, -1을 반환해라. 그렇지 않으면, 제거할 문자의 인덱스를 반환해라.

Example

s = "bcbc"

인덱스 0의 b 또는 인덱스 3의 c를 제거한다.

Function Description

palindromeIndex 함수를 완성해라.
palindromeIndex 함수는 아래와 같은 매개변수를 가지고 있다.

  • String s: 분적해야할 문자열

Returns

  • int: 제거할 문자의 인덱스 또는 -1

Constraints

  • 1 <= q <= 20
  • 1 <= s의 길이 <= 10^5 + 5
  • 모든 문자들은 ascii[a-z] 범위 안에 있다.

Solved

two pointer를 두 번 사용해서 문제를 해결했다. 첫 번째는 문자가 같지 않은 인덱스를 찾기 위해 사용했고, 두 번째는 왼쪽 문자와 오른쪽 문자 중에 어떤 인덱스를 반환하기 위해 사용했다.

먼저 정수형 변수 left와 right를 선언하고 각각 0과 문자열의 길이를 할당한다.

int left = 0;
int right = s.length() - 1;

while문을 통해 문자가 같지 않은 인덱스를 찾는다.

while(left < right){
	if(s.charAt(left) != s.charAt(right)){
		break;
	}

	left++;
	right--;
}

이때 break에 걸리지 않고 while문을 빠져나오게 된다면 제거할 문자가 없는 것으로 판단하고 -1을 반환한다.

if(left >= right){
	return -1;
}

그리고 왼쪽 문자와 오른쪽 문자 중에 제거할 문자를 찾아야한다. 정수형 변수 i와 j를 선언하고, 각각 left와 right를 할당한다. 그리고 left를 증가시키거나 right를 감소시킨다. 왜냐하면 이미 문자가 다른 인덱스를 찾았으며 한쪽의 값을 변경하여 한쪽을 반환하기 위함이다.

int i = left;
int j = right;
left++; // 또는 right--;

다시 while문을 사용해서 인덱스를 반환한다.


while(left < right){
	if(s.charAt(left) != s.charAt(right)){
		return j; // right를 감소 시킬 경우 return i;
	}

	left++;
	right--;
}

return i; // right를 감소 시킬 경우 return j;

All Code

public static int palindromeIndex(String s) {

	int left = 0;
	int right = s.length() - 1;

	while(left < right){
		if(s.charAt(left) != s.charAt(right)){
			break;
		}

		left++;
		right--;
	}

	if(left >= right){
		return -1;
	}

	int i = left;
	int j = right;
	right--;

	while(left < right){
		if(s.charAt(left) != s.charAt(right)){
			return i;
		}

		left++;
		right--;
	}

	return j;
}
profile
내 마음대로 코드 작성하는 세상

0개의 댓글