수많은 마라톤 선수들이 마라톤에 참여하였습니다. 단 한 명의 선수를 제외하고는 모든 선수가 마라톤을 완주하였습니다.
마라톤에 참여한 선수들의 이름이 담긴 배열 participant와 완주한 선수들의 이름이 담긴 배열 completion이 주어질 때, 완주하지 못한 선수의 이름을 return 하도록 solution 함수를 작성해주세요.
제한사항
- 마라톤 경기에 참여한 선수의 수는 1명 이상 100,000명 이하입니다.
- completion의 길이는 participant의 길이보다 1 작습니다.
- 참가자의 이름은 1개 이상 20개 이하의 알파벳 소문자로 이루어져 있습니다.
- 참가자 중에는 동명이인이 있을 수 있습니다.
입출력 예
participantcompletionreturn
["leo", "kiki", "eden"] | ["eden", "kiki"] | "leo" |
["marina", "josipa", "nikola", "vinko", "filipa"] | ["josipa", "filipa", "marina", "nikola"] | "vinko" |
["mislav", "stanko", "mislav", "ana"] | ["stanko", "ana", "mislav"] | "mislav" |
출처: 프로그래머스
콜백함수로 두 배열에서 포함하고 있는(include) 요소를 걸러내면(filter) 공통 요소가 배열에 담기니까,
포함하고 있지 않은(!include) 요소를 걸러내는 방법으로 접근하려고 했다.
하지만, 3번째 배열의 경우 동명이인 즉 같은 이름을 가진 두 사람이 참가했을 경우에는 보다시피 참여하지 않은 한 명이
걸러내지지 못하는 것을 볼 수 있다.
제한사항에 있는 내용을 힌트삼아 두 배열을 비교시 한 명만 차이가 나므로,
두 배열을 정렬(sort)한 뒤 두 요소를 비교하면서 같지 않은 요소가 등장하면 바로 출력해내도록 하면서 접근한다.
위의 파란색 박스는 배열을 sort 했을 때, 어떻게 되는지 확인하기위해 console.log를 해본 것이다.
문자열 요소들이라 맨 앞 글자의 순서를 따라 정렬되는 것을 볼 수 있다.
맨 처음 for문을 돌릴 때, 크기가 작은 배열만큼만 횟수를 돌리니
첫 번째 경우와 두 번째 경우에는 아무 것도 나오지 않았다.
다시 생각해보니 완주못한 사람이 알파벳 순서상 맨 끝에 있게 되면 맨 끝자리는 비교하지 않고 for문을 끝내기 때문에,
동일한 인원만 비교하고 끝내서 다른 한 사람이 출력되지 못한 것이었다.
다시 참가자 인원 수만큼 for문을 돌리니 위와 같이 제대로 동작 !
* 그 외 대단한 해답들.
해시 방법에 입각해서 해답 코드를 생각해보면,
HashMap 생성할 때, 해시함수 put()
put HashMap.put("A", true); → HashMap["A"] = true;
... HashMap이라는 배열에 A번째 데이터에 true라는 값을 넣은 것과 똑같음
Hashmap의 값을 읽어올 때, 해시함수 get()
bool val = hashmap.get("A"); or bool val = hashmap["A"];
... A번째 인덱스에서 값을 읽어오는 것과 똑같음
Hashmap의 값을 읽어올 때, 예외처리까지 하는 해시함수 getOrDefault()
getOrDefault("A", false);
... A라는 키가 없다면 에러가 발생되기 때문에.
있다면 A의 값을 반환해주고, 없다면 디폴트 값으로 설정한 false를 반환해줘라
key가 없을 때의 예외처리를, 한 함수 내에서 처리하고 있다.
어떤 문제에서 해시를 써야할까?
String을 기반(기준)으로 정보를 기록하고 관리해야 될 때
ex) 완주하지 못한 선수
▶ 선수 이름 → 완주 여부
String → Hash
String Key: bool Value 를 갖는 해시맵을 정의하여 사용하면 문제를 쉽게 풀 수 있다.
ex) 신고 결과 받기
▶ 게시판 사용자 중 신고 당한 사람을 기준으로 신고자들의 목록을 관리해야할 때,
신고 당한 사람의 이름 → 신고 당한 사람들의 목록
String → Hash 사용
String Key : ArrayList<String> Value
ex) 위장
▶ 옷의 종류에 따라 몇 개의 옵션이 있는지 세야할 때,
종류가 정수가 아닌 얼굴 / 상의 / 하의 / 겉옷 등의 String이므로
String Key : Integer Value의 HashMap을 만든다.
1. Hash는 정수가 아닌 키를 갖고 있는 배열로 담을 수 없는 정보(값)를 담아 관리할 수 있다.
2. 대부분 그 Key가 String이다.
3. 최소한 위에서 언급한 put/ get/ getOrDefault 함수는 기억하자.
'KDT TIL Note > 알고리즘_스터디' 카테고리의 다른 글
[백준] 기본 탐색 - 기초 문제 (1543, 1568, 1302, 1668, 1236) (0) | 2022.11.17 |
---|---|
[백준] (정렬) 좌표 정렬하기 2, 단어 정렬, 좌표 압축 (0) | 2022.10.31 |