프로그래머스에서 제공하는 문제들 중 해시함수를 연습하기 위한 문제를 풀었다.
문제 링크 : https://programmers.co.kr/learn/courses/30/lessons/42576
문제 설명
풀이 과정
해시맵을 이용해 풀어보기로 하였으며 전체적인 키와 값은 사람 이름 String과 동명이인 숫자 Integer로 정했다.
우선 참가자와 완주자 두 해시 맵을 만들기로 결정했다. 두 맵에 키와 값을 대입하는 과정에서 코드가 완전히 똑같이 진행된다는 사실을 발견해 addValue라는 메소드를 새로 만들어 중복되는 코드를 줄여보게 되었다.
static void addValue(HashMap<String, Integer> map, String index) {
if (map.containsKey(index))
map.put(index, map.get(index) + 1);
else
map.put(index, 1);
}
처음에는 참가자를 완주자보다 더 먼저 맵에 추가했지만 추가작업 후 해답을 구하고자 계산식을 생각해보니 참가자 배열을 돌며 완주자 맵에서 각 인덱스값을 비교하면 훨씬 절차를 단축시킬 수 있겠다는 생각이 들었다.
이 과정에서 위의 메소드는 중복되는 코드가 없어졌기 때문에 더이상 필요가 없어져 삭제하였고, 완주에 실패한 사람은 단 한명이기 때문에 참가자 배열을 돌며 containsKey메소드를 활용해 답을 찾는 중 해답을 발견하면 break를 통해 반복을 빠져나가도록 조치했다.
for (String index : participant) {
if (compl.containsKey(index)) {
if (compl.get(index) > 1)
compl.put(index, compl.get(index) - 1);
else
compl.remove(index);
continue;
}
answer = index;
break;
}
맵에서 해당 키를 찾을 때 동명이인이 여러 명 있다면 정답을 정확하게 찾을 수 없게 되기 때문에 값을 하나씩 지우도록 하였으며 한 명 남았을 때는 해당 키를 완주자 맵에서 지우도록 했다.
이 과정에서 continue를 넣어주지 않는다면 바로 아래 코드인 answer변수에 인덱스 넣기 부분으로 넘어가기 때문에 꼭 넣어주어야 오류가 발생하지 않는다.
최종 코드
import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.OutputStreamWriter;
import java.util.HashMap;
import java.util.StringTokenizer;
public class CantCompletionPlayer {
public static void main(String[] args) {
init();
}
static void init() {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(System.out));
String input1 = "", input2 = "";
StringTokenizer st;
int index = 0;
try {
input1 = br.readLine();
st = new StringTokenizer(input1);
String[] participant = new String[st.countTokens()];
while (st.hasMoreTokens())
participant[index++] = st.nextToken();
index = 0;
input2 = br.readLine();
st = new StringTokenizer(input2);
String[] completion = new String[st.countTokens()];
while (st.hasMoreTokens())
completion[index++] = st.nextToken();
bw.write(solution(participant, completion));
bw.close();
} catch (IOException e) {
e.printStackTrace();
}
}
static String solution(String[] participant, String[] completion) {
String answer = "";
HashMap<String, Integer> compl = new HashMap<>();
for (String index : completion) {
if (compl.containsKey(index))
compl.put(index, compl.get(index) + 1);
else
compl.put(index, 1);
}
for (String index : participant) {
if (compl.containsKey(index)) {
if (compl.get(index) > 1)
compl.put(index, compl.get(index) - 1);
else
compl.remove(index);
continue;
}
answer = index;
break;
}
return answer;
}
}
채점 결과