완주하지 못한 선수
x수많은 마라톤 선수들이 마라톤에 참여하였습니다. 단 한 명의 선수를 제외하고는 모든 선수가 마라톤을 완주하였습니다.
마라톤에 참여한 선수들의 이름이 담긴 배열 participant와 완주한 선수들의 이름이 담긴 배열 completion이 주어질 때, 완주하지 못한 선수의 이름을 return 하도록 solution 함수를 작성해주세요.
제한사항
마라톤 경기에 참여한 선수의 수는 1명 이상 100,000명 이하입니다.
completion의 길이는 participant의 길이보다 1 작습니다.
참가자의 이름은 1개 이상 20개 이하의 알파벳 소문자로 이루어져 있습니다.
참가자 중에는 동명이인이 있을 수 있습니다.
배열을 정렬해서 순서대로 비교해서 완주자 명단의 같은 인덱스 위치에 같은 이름이 없는 사람이 완주하지 못한 선수이다.
만약 for문이 끝날 때까지 이름이 일치하지 않는 사람이 나오지 않게 된다면 명단의 맨 마지막에 있는 사람이 완주하지 못한 선수이다.
x
import java.util.Arrays;
class Solution {
public String solution(String[] participant, String[] completion) {
Arrays.sort(participant);
Arrays.sort(completion);
//System.out.println(Arrays.toString(participant));
//System.out.println(Arrays.toString(completion));
for (int i = 0; i < completion.length; i++) {
if (!participant[i].equals(completion[i]))
return participant[i];
}
return participant[participant.length - 1];
}
}
그리고 다음은 문제를 보니 상위 카테고리가 해시이길래 해시맵을 이용해본 풀이이다.
key에 완주자 이름을, value에 동일인 수를 넣고 일치하는 이름이 있으면 맵에서 한 명씩 제거하고, 일치하지 않는 참가자의 이름을 반환했다.
xxxxxxxxxx
import java.util.HashMap;
class Solution {
public String solution(String[] participant, String[] completion) {
HashMap<String, Integer> map = new HashMap<String, Integer>();
String answer = "";
for (int i = 0; i < completion.length; i++) {
if (map.containsKey(completion[i]))
map.replace(completion[i], map.get(completion[i]) + 1);
else
map.put(completion[i], 1);
}
for (int i = 0; i < participant.length; i++) {
if (map.containsKey(participant[i])) {
if (map.get(participant[i]) > 1)
map.replace(participant[i], map.get(participant[i]) - 1);
else
map.remove(participant[i]);
} else {
return participant[i];
}
}
return answer;
}
}
처음 풀이만큼 깔끔하진 않지만 잘 돌아간다.
그런데 프로그래머스는 자바 7 기반이라 향상된 for문을 쓰지 못하는 것이 아쉽다. 향상된 포문을 이용했다면 좀 덜 조잡해보였을텐데 싶다.
'공부 > algorithm' 카테고리의 다른 글
[programmers] 더 맵게 (0) | 2018.11.01 |
---|---|
[programmers] 쇠막대기 (0) | 2018.10.29 |
[codility] Triangle (0) | 2018.07.14 |
[programmers] 올바른 괄호 (0) | 2018.06.05 |
[programmers] 같은 숫자는 싫어요 (0) | 2018.06.05 |
댓글