[HackerRank] Funny String

아르당·2024년 1월 12일
0

HackerRank

목록 보기
65/109
post-thumbnail

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

Problem

이 챌린지에 문자열이 funny 또는 아닌지 판단해야한다. 문자열이 funny인지 판단하는 것은 문자열을 뒤집었을 때 abc -> cba가 되게 만드는 것이다. 각 문자열을 반복하면서 위치 0과 1, 1과 2 그리고 끝까지 문자의 ASCII 값의 절대값의 차이를 비교해라. 만약 절대값 차이의 리스트가 두 개의 문자열이 같다면 그것들은 funny이다.
주어진 문자열이 funny인지 판단해라. 만약 맞다면 Funny를 반환하고, 그렇지 않다면 Not Funny를 반환하라.

Example

s = 'lmnop'

문자의 서수 값은 [108, 109, 110, 111, 112]이다. s를 뒤집으면 'ponml'이고 서수는 [112, 111, 110, 109, 108]dlek. 두 문자열의 인접한 요소들의 절대값 차이는 [1, 1, 1, 1]이라서 답은 Funny이다.

Function Description

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

  • String s: 테스트할 문자열

Returns

  • String: Funny 또는 Not Funny

Constraints

  • 2 <= s의 길이 <= 10000

Solved

문자열의 양 끝에서 차를 비교하며 반복하면 쉽게 해결할 수 있고, 중간에 차이가 같지 않다면 반복문에서 빨리 빠져나올 수 있다.

먼저 문자열 s를 charArray로 변환하고, 양 끝의 인덱스를 담을 left와 right를 선언하고 각각 0과 s.length() - 1을 할당한다.

char[] charS = s.toCharArray();
int left = 0;
int right = s.length() - 1;

while문을 통해 left가 right보다 작을때만 반복해준다. 양 끝에서 비교하며 가운데로 오기때문에 끝까지 비교할 필요가 없다. 그리고 while문안에서 if문을 통해 left와 left + 1의 차의 절대값과 right와 right - 1의 차의 절대값을 비교한다. 같지 않다면 "Not Funny"를 반환한다. if문에 걸리지 않았다면 left를 증가시키고 right는 감소시킨다.

while(left < right){
	if(
		Math.abs(charS[left] - charS[left + 1])
	    !=
    	Math.abs(charS[right] - charS[right - 1])
    ){
		return "Not Funny";
	}

	left++;
	right--;
}

while문에서 빠져나왔다면 "Funny"를 반환한다.

return "Funny";

All Code

public static String funnyString(String s) {
	char[] charS = s.toCharArray();
	int left = 0;
	int right = s.length() - 1;

	while(left < right){
		if(
			Math.abs(charS[left] - charS[left + 1])
			!=
			Math.abs(charS[right] - charS[right - 1])
		){
			return "Not Funny";
		}

		left++;
		right--;
	}

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

0개의 댓글