강의의 문제를 가져왔기 때문에 밝힙니다 !
임의로 추가, 수정, 삭제한 내용들이 있으니 정확한 이해를 위해서는 강의를 구매하시는 것을 추천드립니다 😅
출처 : 자바(Java) 알고리즘 문제풀이 : 코딩테스트 대비 (인프런 강의)
자바(Java) 알고리즘 문제풀이 : 코딩테스트 대비 - 인프런 | 강의
자바(Java)로 코딩테스트를 준비하시는 분을 위한 강좌입니다. 코딩테스트에서 가장 많이 출제되는 Top 10 Topic을 다루고 있습니다. 주제와 연동하여 기초문제부터 중급문제까지 단계적으로 구성
www.inflearn.com
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 |