문제설명
입력 & 출력
나의 풀이
import java.util.*;
class Solution {
public String solution(String[] participant, String[] completion) {
HashMap<String,Integer> map = new HashMap<>();
StringBuilder sb = new StringBuilder();
for(int i = 0 ; i < participant.length ; i++){
String name = participant[i];
if(map.get(name) != null){
map.put(name, map.get(name) + 1);
}else{
map.put(name,1);
}
}
for(int i = 0 ; i < completion.length ; i++){
String name = completion[i];
if(map.get(name) != null){
map.put(name,map.get(name) - 1);
}
}
for (String key : map.keySet()) {
if (map.get(key) != 0) {
sb.append(key);
}
}
return sb.toString();
}
}
이번 문제는 HashMap을 활용할 수 있는 문제입니다. 전체 참가자 배열과 완주자 배열이 주어지고, 완주하지 못한 사람의 이름을 반환하면 되는 문제입니다.
처음에는 HashSet을 사용하여 코드를 작성했지만 중복된 이름이 존재하는 경우 HashSet의 특성상 중복을 허용하지 않기에 적절하지 않아 HashMap으로 풀어봤습니다.
먼저 HashMap을 선언하고, 각 완주자를 map에 담아줍니다. 이때 HashMap은 Key를 조회할 때 키값이 없으면 NULL을 반환하기 때문에 NULL체크를 해야합니다.
만약 전체 참가자를 접근할 때 해당 참가자가 map에 없으면 key를 참가자의 이름으로, value를 1로 put 해줍니다.
그리고 만약 동일이름의 참가자가 존재한다면 get() 메서드로 해당 키를 가진 참가자의 값을 가져와 해당 값에 1을 더해준 값을 넣어줍니다.
즉 동일이름이 있다면 그 값에 1을 더해줍니다.
그러면 다음과 같이 HashMap이 형성되게 됩니다.
- ["marina", "josipa", "nikola", "vinko", "filipa"], ["josipa", "filipa", "marina", "nikola"]
- {marina=1, filipa=1, nikola=1, josipa=1, vinko=1}
- ["mislav", "stanko", "mislav", "ana"], ["stanko", "ana", "mislav"]
- {ana=1, mislav=2, stanko=1}
그리고 문제의 목적은 완주하지 못한 참가자를 찾는 것 이기 때문에 참가자 배열인 completion 배열만큼 반복문을 돌려주고, 완주자 completion 배열의 요소를 접근하여 기존의 map에서 존재한다면 vaule값을 -1을 해줍니다.
- ["marina", "josipa", "nikola", "vinko", "filipa"], ["josipa", "filipa", "marina", "nikola"]
- {marina=0, filipa=0, nikola=0, josipa=0, vinko=1}
- ["mislav", "stanko", "mislav", "ana"], ["stanko", "ana", "mislav"]
- {ana=0, mislav=1, stanko=0}
위와 같이 map이 형성되는 데 값이 1인 참가자가 완주를 하지 못한 참가자가 됩니다.
마지막으로 향상된 for문과 keySet() 메서드를 사용하여 각 참가자의 키를 가져오고 get() 메서드와 함께 사용하여 값을 가져와 해당 값이 0이 아닌 즉 완주하지 못한 참가자를 sb에 append()하여 넣어줍니다.
refactoring ✅
import java.util.*;
class Solution {
public String solution(String[] participant, String[] completion) {
String answer = "";
HashMap<String,Integer> map = new HashMap<>();
StringBuilder sb = new StringBuilder();
for(String name : participant){
map.put(name, map.getOrDefault(name, 0) + 1);
}
for(String name : completion){
map.put(name,map.get(name) - 1);
}
for(String key : map.keySet()){
if(map.get(key) != 0){
sb.append(key);
}
}
return sb.toString();
}
}
전체적인 코드의 맥락은 "나의 풀이"와 동일합니다. 그러나 NULL체크를 하는 부분이 없는 것을 볼 수 있습니다.
이는 HashMap의 getOrDefault() 메서드가 제공하는 "기본값" 때문입니다.
getOrDefault 메서드를 사용하면 특정 키에 대한 값이 존재하지 않을 때 지정한 기본값을 반환합니다. 따라서 null 체크를 할 필요 없이 키가 존재하지 않을 경우의 값을 쉽게 처리할 수 있습니다.
참고 ❗
[JAVA] 입출력, BufferedReader, StringTokenizer, StringBuilder 알아보기
Java로 코딩테스트를 보거나 입력을 사용해야 할 때 Scanner 클래스를 사용하면 편리하지만 속도가 느리다는 단점이 있습니다. 그렇기 때문에 속도가 빠른 BufferReader 클래스를 사용을 하면 시간복
pixx.tistory.com
[JAVA] HashMap 이란 ❓ (1/2)
Java에서 데이터를 효율적으로 저장하고 빠르게 검색하기 위해 다양한 컬렉션 클래스가 제공됩니다. 그중에서도 HashMap은 키-값 쌍을 저장하고 관리하는 데 있어 매우 유용한 데이터 구조
pixx.tistory.com
'Coding Test > 프로그래머스' 카테고리의 다른 글
[프로그래머스] Lv.1 소수 만들기 (브루트 포스 알고리즘, Java) (1) | 2024.06.14 |
---|---|
[프로그래머스] Lv.2 n^2 배열 자르기 (2차원 배열 ➡️ 1차원 배열 변환 행열 접근 공식,Java) (1) | 2024.06.13 |
[프로그래머스] Lv2. 전화번호 목록 (HashSet, startsWith, Java) (0) | 2024.06.11 |
[프로그래머스] Lv.2 영어 끝말잇기 (contains(), charAt(), ArrayList, Java) (0) | 2024.06.10 |
[프로그래머스] Lv.1 [1차] 비밀지도 (toBinaryString(), StringBuilder,Java) (0) | 2024.06.09 |