728x90
접근
처음에 2차원 배열을 생각하고 접근해봤는데 각각의 알파벳들을 검사할때 마다 count가 올라갔다. 그래서 두개의 문자열을 따로 순회하면서 카운팅을 하는 방법으로 생각을 바꿔봤다.
애너그램 → 두 영어 단어가 철자의 순서를 뒤바꾸어 같아질 수 있을 때
eg. dared ↔ bread
위의 경우 제거해야하는 최소 개수 2개 즉 공통된 단어빼고 전부 삭제하면 된다.
A: “dared” : {’a’ : 1, ‘d’ : 2, ‘e’ : 1, ‘r’ : 1}
B: “bread” : {’a’ : 1, ‘b’ : 1, ‘d’ : 1, ‘e’ : 1, ‘r’ : 1}
숫자가 공통으로 있는 단어는 카운트하지 않고 숫자가 없거나, 개수에 차이가 나는 알파벳은 카운트한다.
즉 위의 예시는 b(알파벳이 없음)과 d(갯수 차이가 남)으로 최소 두개이다.
풀이
package learnString;
import java.util.Scanner;
/*
* countA[...]++는 countA 배열의 해당 인덱스에 있는 값을 1씩 증가시킨다.
* countB도 같다.
* */
class Main
{
public static void main (String[] args) {
Scanner sc = new Scanner(System.in);
String a = sc.next();
String b = sc.next();
// 각각 단어의 알파벳 구성 구하기
int[] countA = new int[26]; //eg. dared: [1. 0, 0, 2, ..] => abcd 기준 a는 1개 b, c 없고 d 2개
int[] countB = new int[26];
for (int i = 0; i < a.length(); i++) {
// 카운트배열(강사님 명칭)
// 1. a.charAt(i) 는 a문자열의 i번째 문자를 반환함
// 2. -a 를 하는것은 a로부터 상대적 위치를 구하는것. 예를 들어 a는 0번째, b는 1번째, c는 2번째가 됨.
// 3. count[...]++는 해당 알파벳 문자가 등장할 때마다 카운트를 1씩 증가시킴
countA[a.charAt(i) - 'a']++;
}
// b문자열도 똑같이 구해준다.
for (int i = 0; i < b.length(); i++) {
countB[b.charAt(i) - 'a']++;
}
// 답 구하기
int ans = 0;
for (int i = 0; i < 26; i++) {
if (countA[i] > countB[i]) {
ans += countA[i] - countB[i];
} else if (countA[i] < countB[i]) {
ans += countB[i] - countA[i];
}
}
System.out.println(ans);
}
}
리펙토링
통과는 되지만 반복되는 기능이 많아서 리펙토링을 진행해봤다.
package learnString;
import java.util.Scanner;
class Main
{
// 카운트 하는 부분 따로 메소드로 만들기
public static int[] getAlphabetCount(String str) {
int[] count = new int[26];
for (int i = 0; i < str.length(); i++) {
count[str.charAt(i) - 'a']++;
}
return count;
}
public static void main (String[] args) {
Scanner sc = new Scanner(System.in);
String a = sc.next();
String b = sc.next();
int[] countA = getAlphabetCount(a);
int[] countB = getAlphabetCount(b);
int ans = 0;
for (int i = 0; i < 26; i++) {
// 대소구분을 절댓값으로 비교
ans += Math.abs(countA[i] - countB[i]);
}
System.out.println(ans);
}
}
반응형
'coding test' 카테고리의 다른 글
문자열 - 백준 1543번 문서검색 (0) | 2024.03.06 |
---|---|
문자열 - 백준 1157번 단어 공부 (0) | 2024.03.05 |
자바 문자열 관련 문제 (0) | 2024.02.29 |
2차원 배열 - 프로그래머스 교점에 별찍기 (1) | 2024.02.19 |
그래프 순회 (1) | 2024.01.31 |