프로그래머스의 좋은 점은 입력값을 어렵게 받아오지 않아도 자동으로 입력이 된다는 것이다.
그래서 어떻게 출력할 것인지만 신경 쓰면 된다!
완주하지 못한 선수
문제 요약
: 참여한 선수 이름이 담긴 배열과 완주한 선수 이름이 담긴 배열을 비교해서 완주하지 못한 선수의 이름이 return 되게 해라.
입출력 예
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"
|
제출코드
function solution(participant, completion) {
participant.sort();
completion.sort();
for(let i=0; i<participant.length; ++i){
if(participant[i]!==completion[i]){
return participant[i];
}
}
}
1. participant 배열과 completion 배열을 정렬한다.
> sort의 인자가 없을 경우 문자의 유니 코드 코드 포인트 값에 따라 정렬된다.
2. for문을 이용해서 participant 배열과 completion 배열을 하나하나 비교할 수 있도록 한다.
3. if 문으로 만약 participant의 값이 completion 값과 다를 경우 paricipant의 값이 리턴되도록 한다. (completion에 없다는 것은 완주를 못했다는 뜻이기 때문에)
이렇게 해도 정답이다!
그렇다면 다른 사람들은 어떻게 풀었을까? 보고 우와 했던 코드가 있어서 그것을 한 줄 한 줄 해독하려고 한다.
다른 사람의 코드
function solution(participant, completion) {
const map = new Map();
for(let i = 0; i < participant.length; i++) {
let a = participant[i],
b = completion[i];
map.set(a, (map.get(a) || 0) + 1);
map.set(b, (map.get(b) || 0) - 1);
}
for(let [k, v] of map) {
if(v > 0) return k;
}
return 'nothing';
}
처음엔 이거 보고 이게 뭐지?? 싶었다. 분명 아는 개념인데 모르는 그런...
그래서 하나하나 찾아봤다.
첫 번째로 찾아본 것은 map
Map은 객체로 메소드인 set, get을 이용해서 값을 넣고 뺄 수 있도록 만들어진 것이다. Es6에서 도입된 문법이라고 한다.
그래서 먼저 새로운 객체 map을 지정한다.
그다음 for문으로 값들을 넣어줄 것이다.
변수 a에는 participant의 값을, b에는 completion의 값을 넣어준다.
가장 이게 뭐지 했던 것이
map.set(a, (map.get(a) || 0) + 1);
map.set(b, (map.get(b) || 0) - 1);
이것! 여기서 생각의 전환을 해야 했었다.
내가 알고 있는 || 연산자는 ~또는 에 해당하는데? 이게 뭐가 어땠다는 거지?라고 생각했었다.
그래서 구글에 검색한 결과, 내 생각을 바꿔줄 글을 하나 읽었다.
이 글을 읽고 그렇구나! 외쳤다.
||는 단순히 참 거짓을 판별하는 논리 연산자일 뿐만 아니라, true 값을 반환하는 연산자인 것이다. 이 사실을 깨닫고 이 코드 댓글에 달린 해석을 읽으니 이해가 갔다.
map.set(a, (map.get(a) || 0) + 1);
새로 만든 객체 map에 값을 넣는데 a(participant)를 키로 하고 value는 객체 map에 키 a가 있으면 그 값을 가져와서 +1, 없으면 0에 +1을 하는 것이다.
map.set(b, (map.get(b) || 0) - 1);
b도 동일하다. map 객체에서 키를 b( completion)로 하고, value는 객체 map에서 키 b가 있으면 그 값을 가져와서 -1, 없으면 0에서 -1인 것이다.
for(let [k, v] of map) {
if(v > 0) return k;
}
여기서는 그래서 만든 객체 map의 value가 0보다 크면 k(키 값)을 리턴하는 것이다.
이제 예를 다시 보면서 정리해보자.
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"
|
첫 번째 줄의 ["leo", "kiki", "eden"]을 살펴보자.
이 값은 participant 이기 때문에 위에서 설정한 각 a [0] 은 "leo", a [1]은 "kiki", a [2]는 "den"이다.
map.set(a, (map.get(a) || 0) + 1);
이 코드에 대입해보면,
1. 첫 번째 a, "leo"를 키 값으로 한다. 하지만 첫번째 값이기 때문에 이 값은 get을 해도 가져올 값이 없기 때문에 false. 따라서 0+1을 해서 value가 1이다. {"leo" => 1}
2. 두 번째 a, "kiki"를 키 값으로 한다. 이것도 역시 get해도 가져올 값이 없기 때문에 false. 따라서 0+1을 해서 value가 1이다.
{"kiki" => 1}
3. 세 번째 a, "eden"을 키 값으로 한다. 이것도 get 해도 가져올 값이 없기 때문에 false. 따라서 0+1=1을 value로 한다.
{ "eden" => 1}
현재 map 은 {"leo" => 1, "kiki" => 1, "eden" => 1}이다.
이제 copletion을 살펴보자. ["eden", "kiki"]
이 값은 위에서 설정한 b의 값이다.
map.set(b, (map.get(b) || 0) - 1);
이 코드에 대입해보면,
1. 첫 번째 b, "eden"을 키 값으로 한다. 이 값은 위에서 세 번째 a에서 설정한 값이기 때문에 get 할 값이 있다. 그 값은 1. 따라서 1-1 =0 value는 0이다. {"eden" => 0}
2. 두 번째 b, "kiki"를 키 값으로 한다. 이 값은 위에서 두 번째 a에서 먼저 설정한 키 값이기 때문에 get 할 값이 있다. 그 값은 1. 따라서 value는 0이다.
{"kiki" => 0}
(실제 순서는 map.set(a, (map.get(a) || 0) + 1); 와 map.set(b, (map.get(b) || 0) - 1); 가 번갈아가면서 진행된다.)
이제 다시 map을 정리해보면,
{"leo" => 1,
"eden" => 0,
"kiki" => 0
}
이다.
이제 for 문을 적용해보자.
for(let [k, v] of map) {
if(v > 0) return k;
}
여기서 k는 키 값에 해당하는 이름, v는 값에 해당하는 숫자이다.
for문을 통해 값 하나하나에 if문을 적용할 것이다.
먼저첫 번째, "leo"의 v는 1. 0보다 크기 때문에 "leo"가 리턴된다.
하지만 두 번째, 세 번째의 v값은 0이기 때문에 리턴되지 않는다.
따라서 답은 "leo"
즉, 참가한 사람들에게 1의 value를 주고 완주한 사람에게는 다시 -1을 해서 value를 0으로 만든다. 그리고 value가 0보다 큰 사람을 찾으면 완료!
동명이인의 경우 참가자의 value가 2이고 한 명만 완주했을 경우 -1 해서 1이기 때문에 한 명만 리턴된다.
'알고리즘 > 프로그래머스' 카테고리의 다른 글
[JavaScript] 프로그래머스 Level1 #최소직사각형 (0) | 2022.08.18 |
---|---|
[JavaScript] 프로그래머스 Level 1 #같은 숫자는 싫어 (0) | 2022.08.17 |
[JavaScript] 프로그래머스 Level 1 크레인 인형뽑기 게임 (0) | 2022.08.11 |
[JavaScript] 프로그래머스 #키패드 누르기 (0) | 2022.07.26 |
[JavaScript] 프로그래머스 해시 #위장 (0) | 2022.07.13 |
프로그래머스의 좋은 점은 입력값을 어렵게 받아오지 않아도 자동으로 입력이 된다는 것이다.
그래서 어떻게 출력할 것인지만 신경 쓰면 된다!
완주하지 못한 선수
문제 요약
: 참여한 선수 이름이 담긴 배열과 완주한 선수 이름이 담긴 배열을 비교해서 완주하지 못한 선수의 이름이 return 되게 해라.
입출력 예
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"
|
제출코드
function solution(participant, completion) {
participant.sort();
completion.sort();
for(let i=0; i<participant.length; ++i){
if(participant[i]!==completion[i]){
return participant[i];
}
}
}
1. participant 배열과 completion 배열을 정렬한다.
> sort의 인자가 없을 경우 문자의 유니 코드 코드 포인트 값에 따라 정렬된다.
2. for문을 이용해서 participant 배열과 completion 배열을 하나하나 비교할 수 있도록 한다.
3. if 문으로 만약 participant의 값이 completion 값과 다를 경우 paricipant의 값이 리턴되도록 한다. (completion에 없다는 것은 완주를 못했다는 뜻이기 때문에)
이렇게 해도 정답이다!
그렇다면 다른 사람들은 어떻게 풀었을까? 보고 우와 했던 코드가 있어서 그것을 한 줄 한 줄 해독하려고 한다.
다른 사람의 코드
function solution(participant, completion) {
const map = new Map();
for(let i = 0; i < participant.length; i++) {
let a = participant[i],
b = completion[i];
map.set(a, (map.get(a) || 0) + 1);
map.set(b, (map.get(b) || 0) - 1);
}
for(let [k, v] of map) {
if(v > 0) return k;
}
return 'nothing';
}
처음엔 이거 보고 이게 뭐지?? 싶었다. 분명 아는 개념인데 모르는 그런...
그래서 하나하나 찾아봤다.
첫 번째로 찾아본 것은 map
Map은 객체로 메소드인 set, get을 이용해서 값을 넣고 뺄 수 있도록 만들어진 것이다. Es6에서 도입된 문법이라고 한다.
그래서 먼저 새로운 객체 map을 지정한다.
그다음 for문으로 값들을 넣어줄 것이다.
변수 a에는 participant의 값을, b에는 completion의 값을 넣어준다.
가장 이게 뭐지 했던 것이
map.set(a, (map.get(a) || 0) + 1);
map.set(b, (map.get(b) || 0) - 1);
이것! 여기서 생각의 전환을 해야 했었다.
내가 알고 있는 || 연산자는 ~또는 에 해당하는데? 이게 뭐가 어땠다는 거지?라고 생각했었다.
그래서 구글에 검색한 결과, 내 생각을 바꿔줄 글을 하나 읽었다.
이 글을 읽고 그렇구나! 외쳤다.
||는 단순히 참 거짓을 판별하는 논리 연산자일 뿐만 아니라, true 값을 반환하는 연산자인 것이다. 이 사실을 깨닫고 이 코드 댓글에 달린 해석을 읽으니 이해가 갔다.
map.set(a, (map.get(a) || 0) + 1);
새로 만든 객체 map에 값을 넣는데 a(participant)를 키로 하고 value는 객체 map에 키 a가 있으면 그 값을 가져와서 +1, 없으면 0에 +1을 하는 것이다.
map.set(b, (map.get(b) || 0) - 1);
b도 동일하다. map 객체에서 키를 b( completion)로 하고, value는 객체 map에서 키 b가 있으면 그 값을 가져와서 -1, 없으면 0에서 -1인 것이다.
for(let [k, v] of map) {
if(v > 0) return k;
}
여기서는 그래서 만든 객체 map의 value가 0보다 크면 k(키 값)을 리턴하는 것이다.
이제 예를 다시 보면서 정리해보자.
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"
|
첫 번째 줄의 ["leo", "kiki", "eden"]을 살펴보자.
이 값은 participant 이기 때문에 위에서 설정한 각 a [0] 은 "leo", a [1]은 "kiki", a [2]는 "den"이다.
map.set(a, (map.get(a) || 0) + 1);
이 코드에 대입해보면,
1. 첫 번째 a, "leo"를 키 값으로 한다. 하지만 첫번째 값이기 때문에 이 값은 get을 해도 가져올 값이 없기 때문에 false. 따라서 0+1을 해서 value가 1이다. {"leo" => 1}
2. 두 번째 a, "kiki"를 키 값으로 한다. 이것도 역시 get해도 가져올 값이 없기 때문에 false. 따라서 0+1을 해서 value가 1이다.
{"kiki" => 1}
3. 세 번째 a, "eden"을 키 값으로 한다. 이것도 get 해도 가져올 값이 없기 때문에 false. 따라서 0+1=1을 value로 한다.
{ "eden" => 1}
현재 map 은 {"leo" => 1, "kiki" => 1, "eden" => 1}이다.
이제 copletion을 살펴보자. ["eden", "kiki"]
이 값은 위에서 설정한 b의 값이다.
map.set(b, (map.get(b) || 0) - 1);
이 코드에 대입해보면,
1. 첫 번째 b, "eden"을 키 값으로 한다. 이 값은 위에서 세 번째 a에서 설정한 값이기 때문에 get 할 값이 있다. 그 값은 1. 따라서 1-1 =0 value는 0이다. {"eden" => 0}
2. 두 번째 b, "kiki"를 키 값으로 한다. 이 값은 위에서 두 번째 a에서 먼저 설정한 키 값이기 때문에 get 할 값이 있다. 그 값은 1. 따라서 value는 0이다.
{"kiki" => 0}
(실제 순서는 map.set(a, (map.get(a) || 0) + 1); 와 map.set(b, (map.get(b) || 0) - 1); 가 번갈아가면서 진행된다.)
이제 다시 map을 정리해보면,
{"leo" => 1,
"eden" => 0,
"kiki" => 0
}
이다.
이제 for 문을 적용해보자.
for(let [k, v] of map) {
if(v > 0) return k;
}
여기서 k는 키 값에 해당하는 이름, v는 값에 해당하는 숫자이다.
for문을 통해 값 하나하나에 if문을 적용할 것이다.
먼저첫 번째, "leo"의 v는 1. 0보다 크기 때문에 "leo"가 리턴된다.
하지만 두 번째, 세 번째의 v값은 0이기 때문에 리턴되지 않는다.
따라서 답은 "leo"
즉, 참가한 사람들에게 1의 value를 주고 완주한 사람에게는 다시 -1을 해서 value를 0으로 만든다. 그리고 value가 0보다 큰 사람을 찾으면 완료!
동명이인의 경우 참가자의 value가 2이고 한 명만 완주했을 경우 -1 해서 1이기 때문에 한 명만 리턴된다.
'알고리즘 > 프로그래머스' 카테고리의 다른 글
[JavaScript] 프로그래머스 Level1 #최소직사각형 (0) | 2022.08.18 |
---|---|
[JavaScript] 프로그래머스 Level 1 #같은 숫자는 싫어 (0) | 2022.08.17 |
[JavaScript] 프로그래머스 Level 1 크레인 인형뽑기 게임 (0) | 2022.08.11 |
[JavaScript] 프로그래머스 #키패드 누르기 (0) | 2022.07.26 |
[JavaScript] 프로그래머스 해시 #위장 (0) | 2022.07.13 |