강의의 문제를 가져왔기 때문에 밝힙니다 !
임의로 추가, 수정, 삭제한 내용들이 있으니 정확한 이해를 위해서는 강의를 구매하시는 것을 추천드립니다 😅
출처 : 자바(Java) 알고리즘 문제풀이 : 코딩테스트 대비 (인프런 강의)
1) 강의 보기 전의 풀이
일단 이전 강의에서 얻은 HashMap 의 getOrDeault() 메서드를 사용해서 두 개의 Map 을 설정해줬다.
그리고 Key 를 하나 가져와서 두 개의 Map 의 Value 를 모두 비교하는 방식으로 로직을 구성했고, boolean 값을 초기화해서 하나라도
값이 맞지 않는 경우, 문자열 "NO" 를 리턴하도록 했다. (하나라도 맞지 않는 경우는 더 이상 비교할 가치가 없으므로)
package study.section4;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.*;
public class Section0402 {
public static void main(String[] args) throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
String first = br.readLine();
String second = br.readLine();
String answer = solution(first, second);
System.out.println(answer);
}
private static String solution(String first, String second) {
Map<Character, Integer> map1 = new HashMap<>();
Map<Character, Integer> map2 = new HashMap<>();
char[] arr1 = first.toCharArray();
char[] arr2 = second.toCharArray();
if (arr1.length != arr2.length) {
return "NO";
}
for (char x : arr1) {
map1.put(x, map1.getOrDefault(x, 0) + 1);
}
for (char x : arr2) {
map2.put(x, map2.getOrDefault(x, 0) + 1);
}
// TODO
// A(2) a(1) b(1) C(1) e(2)
// a(1) A(2) b(1) C(1) e(2)
// 첫 번째 검증 -> 길이가 같은가 ? 배열 만들 때 이미 검증 완료
// 두 번째 검증 -> Key 와 Value 모두 같은가 ?
String answer = " ";
boolean check = false;
for (char key : map1.keySet()) {
Integer a = map1.get(key);
Integer b = map2.get(key);
if (a.equals(b)) {
check = true;
} else {
check = false;
break;
}
}
if (check) {
answer = "YES";
} else {
answer = "NO";
}
return answer;
}
}
// 첫 줄에 첫 번째 단어 입력
// 두 번째 줄에 두 번째 단어 입력
// 두 단어가 아나그램인지 판별하는 프로그램을 작성해라.
2. 강의에서 얻은 힌트
알고리즘에 대한 힌트라기 보다는, HashMap 의 containsKey() 메서드의 쓰임새에 대해 배웠다.
내 풀이에서는 값을 비교하기 위해 두 개의 Map 에서 같은 Key 를 통해 Value 를 셋팅하고, 이 두 개의 Value 를 비교하면서 같다면 true, 다르다면 아나그램이 아니므로 false 후 break 문으로 "NO" 를 리턴하도록 했는데, 강의에서는 containsKey() 를 통해 다른 알파벳이
있는 경우를 쉽게 찾아내는 방법을 적절히 사용해서 풀이했다.
private static String solution(String a, String b) {
String answer = "YES";
Map<Character, Integer> map1 = new HashMap<>();
for (char x : a.toCharArray()) {
map1.put(x, map1.getOrDefault(x, 0) + 1);
}
for (char x : b.toCharArray()) {
// 다른 키가 있거나 이미 Value 값이 모두 빠져서 0인 경우 바로 "NO" 리턴
if (!map1.containsKey(x) || map1.get(x) == 0) {
return "NO";
} else {
map1.put(x, map1.get(x) - 1);
}
}
return answer;
}
'알고리즘 정리' 카테고리의 다른 글
자바(Java) 알고리즘 문제풀이 올바른 괄호,괄호문자제거 [인프런 / Stack] (0) | 2022.07.17 |
---|---|
자바(Java) 알고리즘 문제풀이 매출액의 종류 [인프런 / Hash] (0) | 2022.07.11 |
자바(Java) 알고리즘 문제풀이 학급 회장 [인프런 / Hash] (0) | 2022.04.18 |
백준 12847번 꿀 아르바이트 (실버 4) (0) | 2022.04.16 |
백준 11728번 배열 합치기 (실버 5) (0) | 2022.04.16 |