프로그래머스 알고리즘 (java)
완주하지 못한 선수
코드 리뷰
맨처음 문제를 보고 참가선수를 리스트에 넣고 완주한 사람 다 리무브로 지워 마지막 남는 선수를 리턴시켰습니다.. 그런데 효율성 태스트에서 통과가 안됬습니다. 그후 고민하다 둘다 리스트에 담고 sort
해서 인덱스 끼리 비교 다른 string
일 때 return
시켜 해결했습니다.
public String solution(String[] participant, String[] completion) {
String answer = "";
List<String> runUsers = new ArrayList<>(Arrays.asList(participant));
List<String> finishUsers = new ArrayList<>(Arrays.asList(completion));
runUsers.sort(String::compareTo);
finishUsers.sort(String::compareTo);
for (int i = 0; i < finishUsers.size(); i++) {
if (!finishUsers.get(i).equals(runUsers.get(i))) {
return runUsers.get(i);
}
}
return runUsers.get(runUsers.size() - 1);
}
하지만 문제를 보니 hashMap
을 쓰는 문제였습니다. 그래서 다시 풀었습니다.
public String solution2(String[] participant, String[] completion) {
String answer = "";
HashMap<String, Integer> hashMap = new HashMap<>();
for (String s : participant) {
if (!hashMap.containsKey(s)) {
hashMap.put(s, 0);
}
hashMap.put(s, hashMap.get(s) + 1);
}
for (String s : completion) {
hashMap.put(s, hashMap.get(s) - 1);
}
for (String s : hashMap.keySet()) {
if (hashMap.get(s) != 0) {
return s;
}
}
return answer;
}
다른 풀이를 보고 참고한 사항
hashMap
을 쓸 때 value가 없을 때 조건이 문제라 if문으로 분기 했는데.getOrDefault()
메소드가 있는 것을 알게 되었습니다.
이 코드가
for (String s : participant) {
if (!hashMap.containsKey(s)) {
hashMap.put(s, 0);
}
hashMap.put(s, hashMap.get(s) + 1);
}
아래 코드로 줄어듬
for (String s : participant) {
hashMap.put(s, hashMap.getOrDefault(s, 0) + 1);
}