문제 설명
수많은 마라톤 선수들이 마라톤에 참여하였습니다. 단 한 명의 선수를 제외하고는 모든 선수가 마라톤을 완주하였습니다.마라톤에 참여한 선수들의 이름이 담긴 배열 participant와 완주한 선수들의 이름이 담긴 배열 completion이 주어질 때, 완주하지 못한 선수의 이름을 return 하도록 solution 함수를 작성해주세요.
제한 조건
마라톤 경기에 참여한 선수의 수는 1명 이상 100,000명 이하입니다.
completion의 길이는 participant의 길이보다 1 작습니다.
참가자의 이름은 1개 이상 20개 이하의 알파벳 소문자로 이루어져 있습니다.
참가자 중에는 동명이인이 있을 수 있습니다.
입출력 예
participant / completion / return
["leo", "kiki", "eden"]["eden", "kiki"] "leo"
["marina", "josipa", "nikola", "vinko", "filipa"]["josipa", "filipa", "marina", "nikola"] "vinko"
["mislav", "stanko", "mislav", "ana"]["stanko", "ana", "mislav"] "mislav"
입출력 예 설명
예제 #1
"leo"는 참여자 명단에는 있지만, 완주자 명단에는 없기 때문에 완주하지 못했습니다.예제 #2
"vinko"는 참여자 명단에는 있지만, 완주자 명단에는 없기 때문에 완주하지 못했습니다.예제 #3
"mislav"는 참여자 명단에는 두 명이 있지만, 완주자 명단에는 한 명밖에 없기 때문에 한명은 완주하지 못했습니다.
문제풀이
//실패케이스 function solution(participant, completion) { for(let i =0; i < completion.length; i++){ participant.splice( participant.indexOf( completion [i] ), //어디서부터 제거하거나 추가할건지 // 몇개의 데이터를 삭제할 건지 ) } return participant[0] }
function solution(participant, completion) { participant.sort() //참가자 명단을 오름차순으로 정렬 completion.sort() // 완주자 명단을 오름차순으로 정렬 for(let i =0; i<participant.length; i++){ if(participant[i] !== completion[i]){ //정렬된 참가자와 완주자 명단을 서로 비교했을 때 동일하지 않는 참가자의 이름을 찾음 return participant[i] } // console.log(participant[i],completion[i] ) } }
접근방법
1. 알파벳소문자이니 string타입으로 유추가 가능
2. 데이터가 여러개 겹칠 수 있다는 걸 인지하기
3. participant에서 명단을 삭제해본다.
4. 삭제했을 때 가장 마지막에 남은 사람의 이름을 리턴해주도록 한다.
5. 완주자 명단을 차례대로 가져와 본다. -> 반복문 사용
6. 배열에서 원하는 위치의 값을 삭제하고 싶을 때 사용하는 splice 활용
7. 첫번째 인자는 몇번째부터 삭제할 건지 index값을 넣어준다.
8. participant에서 해당 이름을 찾아 인덱스값을 뽑고 싶다면 indexOf를 사용!
9. 두번째 인자에는 몇개의 데이터를 삭제해줄건지 작성
10. 총 세번의 반복문이 중첩되는 현상때문에 효율성면에서 떨어짐
11. 더 빠른방법은?
12. 가나다 순으로 정렬을 해본다. 문자열에서만 작동하는 sort() 활용
13. participant와 completion를 0부터 시작해서 비교해본다.
14. 만약 둘의 교집합에 속하지 않는 사람이 있다면 리턴한다.
15. completion이 participant보다 하나 적음
16. if(participant[i] !== completion[i]) 조건문으로 같지 않다면 결과를 리턴하도록 함.
메소드 활용
function solution(participant, completion) { participant.sort() //참가자 명단을 오름차순으로 정렬 completion.sort() // 완주자 명단을 오름차순으로 정렬 return participant.filter((name,i) =>{ return name !== completion[i] })[0] }
1.거르고 새로운 배열에 담는다. filter
2.완주자명의 각각의 이름을 index로 가져올 수 있음!
3.현재 참가한 사람의 이름과 completion 인덱스값이 같지 않은사람만 리턴한다.
4.하지만 이방법은 문제의 취지와 맞지않음(해시문제임)function solution(participant, completion) { // 1. 참가자 명단에서 이름과 참가자의 수를 정리한다. const obj = {} for(let i =0; i<participant.length; i++){ // console.log(participant[i]) if(obj[ participant[i] ] === undefined){ obj[ participant[i] ] = 0; //일종의 상자가 생긴것임 } obj[participant[i]]++ } // 2. 참가자 명단에서 완주자 이름 수 만큼 제거한다. //완주자명단가져오기 for(let i=0; i<completion.length; i++){ obj[ completion[i] ]--; // console.log(completion[i] , obj) } // 3.참가자 명단에서 완주하지 못한 선수를 찾는다. for(let name in obj){ if(obj[name] > 0){ // console.log(name) return name } } }
5.키값 밸류값으로 이뤄져있는 자료구조 문법 문제임!!
6.obj[participant[i]]++
하면
NaN값을 출력한다.
7.undefined + 1 하니까 나온 것임
8.
9.완주한 사람 0으로 만들어줘야함
10.리팩토링function solution(participant, completion) { // 1. 참가자 명단에서 이름과 참가자의 수를 정리한다. const obj = {} for(let i =0; i<participant.length; i++){ if(!obj[ participant[i] ]){ //수정 obj[ participant[i] ] = 0; } obj[participant[i]]++ } for(let i=0; i<completion.length; i++){ obj[ completion[i] ]--; } for(let name in obj){ if(obj[name] ){ //수정 // console.log(name) return name } } }
- map.set
const map = new Map() const obj = {} // obj["1"]= 1; // obj["9"] = 9; // obj["3"] = 3; // obj.name = "cff" // obj // map.set("1",1) // map.set("9",9) // map.set("3",3) //순서보장됨 // map.set("name","ddd") // map.get("name") // const num = 100; const str = "str" const arr = ["a","b"] const obj2 = {name:"name"} const func = function (){} // obj[num] = 100; obj[str] = "name" obj[func] = "func" //문자열형태로 들어감 console.log(obj); // map.set(num,"num") map.set(arr,"arr"); map.set(obj2,"obj") map.set(func, "func") //map사용하면 원하는 원시타입 그대로 들어감 map.size //객체의 크기- 현재 몇개의 데이터를 가지고 있는지 map.forEach(el => { console.log(el) }) //이름만 같을 뿐 배열메소드 forEach와 다름
//return 100 'name' 'func' { '100': 100, str: 'name', 'function () {}': 'func' } Map(1) { 100 => 'num', __proto__: { constructor: ƒ Map(), get: ƒ get(), set: ƒ set(), has: ƒ has(), delete: ƒ delete(), clear: ƒ clear(), entries: ƒ entries(), forEach: ƒ forEach(), keys: ƒ keys(), size: 1, values: ƒ values() } } Map(2) { 100 => 'num', [ 'a', 'b' ] => 'arr', __proto__: { constructor: ƒ Map(), get: ƒ get(), set: ƒ set(), has: ƒ has(), delete: ƒ delete(), clear: ƒ clear(), entries: ƒ entries(), forEach: ƒ forEach(), keys: ƒ keys(), size: 2, values: ƒ values() } } Map(3) { 100 => 'num', [ 'a', 'b' ] => 'arr', { name: 'name' } => 'obj', __proto__: { constructor: ƒ Map(), get: ƒ get(), set: ƒ set(), has: ƒ has(), delete: ƒ delete(), clear: ƒ clear(), entries: ƒ entries(), forEach: ƒ forEach(), keys: ƒ keys(), size: 3, values: ƒ values() } } Map(4) { 100 => 'num', [ 'a', 'b' ] => 'arr', { name: 'name' } => 'obj', ƒ func() => 'func', __proto__: { constructor: ƒ Map(), get: ƒ get(), set: ƒ set(), has: ƒ has(), delete: ƒ delete(), clear: ƒ clear(), entries: ƒ entries(), forEach: ƒ forEach(), keys: ƒ keys(), size: 4, values: ƒ values() } } 4 'num' 'arr' 'obj' 'func'