[HackerRank] Anagram

아르당·2024년 4월 13일
0

HackerRank

목록 보기
75/109
post-thumbnail

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

Problem

두 단어가 서로의 애너그램인 경우, 그 문자들을 재배열해서 다른 단어를 형성할 수 있다.
문자열이 주어지고, 그것을 두개의 같은 길이의 연속된 부분 문자열로 나눈다. 두 부분 문자열을 서로 애너그램으로 만들기 위해 변경해야 하는 최소 문자 수를 결정해라.

Example

s = abccde

두 부분 'abc'와 'cde'로 나눠라. 모든 글자가 사용되고, 부분 문자열은 연속되며 길이가 같다. 이제 첫 번째 부분 문자열의 'a'와 'b'를 'd'와 'e'로 변경하면 'dec'와 'cde'로 만들 수 있다. 이 두 문자열은 애너그램이다. 두 번의 변경이 필요하다.

Function Description

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

  • String s: 하나의 문자열

Returns

  • int: 바꿔야 하는 문자열의 최소 수 또는 -1

Constraints

  • 1 <= q <= 100
  • 1 <= |s| <= 10^4
  • s는 오직 ascii[a-z] 범위 안의 문자만 존재한다.

Solved

먼저 주어진 문자열 s의 길이가 홀수면 -1을 리턴한다. 왜냐하면 문자열을 같은 일이로 나눠야하는데 홀수면 같은 길이로 나눌 수 없기 때문이다.

if(s.length() % 2 == 1){
	return -1;
}

바꿔야하는 문자의 수를 담을 changeCount를 선언하고 0을 할당한다. 그리고 문제에 주어진 anagram 메소드 밖에 int[]를 반환하는 getInputCount 메소드를 생성한다. getInputCount 메소드는 주어진 문자열에서 각 알파벳 개수를 구해줘야한다. 메소드를 통해 int 배열 s1과 s2를 생성하고 각각 s를 반으로 자른 문자열을 매개변수로 담아준다.

int changeCount = 0;
int[] s1 = getInputCount(s.substring(0, s.length() / 2));
int[] s2 = getInputCount(s.substring(s.length() / 2, s.length()));
public static int[] getInputCount(String input){
	int[] inputCount = new int[26];

	for(int i = 0; i < input.length(); i++){
		inputCount[input.charAt(i) - 'a']++;
	}

	return inputCount;
}

그리고 for문을 통해 순회한다. 이때 s1을 기준으로 s1의 해당 문자 수가 s2보다 많을때 changeCount에 더한다.

for(int i = 0; i < 26; i++){
	if(s1[i] > s2[i]){
		changeCount += s1[i] - s2[i];
	}
}

마지막으로 changeCount를 반환한다.

return changeCount;

All Code

public static int anagram(String s) {

	if(s.length() % 2 == 1){
		return -1;
	}

	int changeCount = 0;
	int[] s1 = getInputCount(s.substring(0, s.length() / 2));
	int[] s2 = getInputCount(s.substring(s.length() / 2, s.length()));

	for(int i = 0; i < 26; i++){
		if(s1[i] > s2[i]){
			changeCount += s1[i] - s2[i];
		}
	}

	return changeCount;
}

public static int[] getInputCount(String input){
	int[] inputCount = new int[26];

	for(int i = 0; i < input.length(); i++){
		inputCount[input.charAt(i) - 'a']++;
	}

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

0개의 댓글