코딩테스트 26일차
달리기 경주
얀에서는 매년 달리기 경주가 열립니다. 해설진들은 선수들이 자기 바로 앞의 선수를 추월할 때 추월한 선수의 이름을 부릅니다. 예를 들어 1등부터 3등까지 "mumu", "soe", "poe" 선수들이 순서대로 달리고 있을 때, 해설진이 "soe"선수를 불렀다면 2등인 "soe" 선수가 1등인 "mumu" 선수를 추월했다는 것입니다. 즉 "soe" 선수가 1등, "mumu" 선수가 2등으로 바뀝니다.
선수들의 이름이 1등부터 현재 등수 순서대로 담긴 문자열 배열 players와 해설진이 부른 이름을 담은 문자열 배열 callings가 매개변수로 주어질 때, 경주가 끝났을 때 선수들의 이름을 1등부터 등수 순서대로 배열에 담아 return 하는 solution 함수를 완성해주세요.
function solution(players, callings) {
let idx;
let name1;
let name2;
const idxList = {}
players.forEach((name,index)=>idxList[name]=index)
for(let call of callings){
idx = idxList[call]
name1 = players[idx]
name2 = players[idx-1]
idxList[call]-=1
idxList[name2]+=1
players[idx] = name2
players[idx-1] = name1
}
return players;
}
✏️풀이
idx, name1, name2, idxList라는 변수를 선언합니다.
빈 객체인 idxList를 생성합니다.
players 배열의 각 요소에 대해 반복문을 실행합니다.
name은 현재 요소의 값이며, index는 현재 요소의 인덱스입니다.
idxList 객체에 name을 키로 하고 index를 값으로 추가합니다. 즉, 각 플레이어 이름에 대응하는 인덱스를 저장합니다.
callings 배열의 각 요소에 대해 반복문을 실행합니다.
call은 현재 요소의 값입니다.
call을 사용하여 idx에 해당하는 인덱스를 idxList에서 찾습니다.
name1은 players 배열에서 idx에 해당하는 요소입니다.
name2는 players 배열에서 idx-1에 해당하는 요소입니다.
idxList의 call에 해당하는 값을 1 감소시키고, name2에 해당하는 값을 1 증가시킵니다.
players 배열에서 idx 위치의 요소를 name2로 업데이트하고, players 배열에서 idx-1 위치의 요소를 name1로 업데이트합니다.
최종적으로 players 배열을 반환합니다.
추억 점수
사진들을 보며 추억에 젖어 있던 루는 사진별로 추억 점수를 매길려고 합니다. 사진 속에 나오는 인물의 그리움 점수를 모두 합산한 값이 해당 사진의 추억 점수가 됩니다. 예를 들어 사진 속 인물의 이름이 ["may", "kein", "kain"]이고 각 인물의 그리움 점수가 [5점, 10점, 1점]일 때 해당 사진의 추억 점수는 16(5 + 10 + 1)점이 됩니다. 다른 사진 속 인물의 이름이 ["kali", "mari", "don", "tony"]이고 ["kali", "mari", "don"]의 그리움 점수가 각각 [11점, 1점, 55점]]이고, "tony"는 그리움 점수가 없을 때, 이 사진의 추억 점수는 3명의 그리움 점수를 합한 67(11 + 1 + 55)점입니다.
그리워하는 사람의 이름을 담은 문자열 배열 name, 각 사람별 그리움 점수를 담은 정수 배열 yearning, 각 사진에 찍힌 인물의 이름을 담은 이차원 문자열 배열 photo가 매개변수로 주어질 때, 사진들의 추억 점수를 photo에 주어진 순서대로 배열에 담아 return하는 solution 함수를 완성해주세요.
function solution(name, yearning, photo) {
var answer = [];
for (var i = 0; i < photo.length; i++) {
var namesInPhoto = photo[i];
var score = 0;
for (var j = 0; j < namesInPhoto.length; j++) {
var person = namesInPhoto[j];
var index = name.indexOf(person);
if (index !== -1) {
score += yearning[index];
}
}
answer.push(score);
}
return answer;
}
✏️풀이
먼저, solution 함수는 세 개의 매개변수를 받습니다: name, yearning, photo. 각각은 사람들의 이름을 담은 문자열 배열, 각 사람별 그리움 점수를 담은 정수 배열, 그리고 사진에 찍힌 인물의 이름을 담은 이차원 문자열 배열입니다.
함수 내부에서는 결과를 저장할 answer 배열을 선언합니다.
그런 다음, photo 배열을 순회하면서 각 사진별로 추억 점수를 계산합니다. for 루프의 인덱스 i를 활용하여 photo 배열의 요소에 접근합니다. namesInPhoto 변수에는 현재 사진에 찍힌 인물들의 이름이 담겨있는 배열이 할당됩니다.
그리고 score 변수를 0으로 초기화합니다. 이 변수는 현재 사진의 추억 점수를 계산하여 저장할 변수입니다.
내부적으로 namesInPhoto 배열을 순회하면서 각 인물의 이름을 가져옵니다. for 루프의 인덱스 j를 활용하여 namesInPhoto 배열의 요소에 접근합니다. 현재 인물의 이름은 person 변수에 할당됩니다.
그리고 name 배열에서 person의 인덱스를 찾습니다. indexOf() 메서드를 사용하여 name 배열에서 person의 인덱스를 검색합니다. 만약 person의 인덱스가 존재한다면, index 변수에 해당 인덱스가 할당됩니다.
index가 -1이 아닌 경우는 person이 name 배열 안에 존재하는 경우입니다. 그리움 점수를 yearning 배열에서 가져와 score에 더해줍니다.
namesInPhoto 배열의 모든 인물에 대해 점수를 계산한 후, score를 answer 배열에 추가합니다. 이렇게 모든 사진에 대한 추억 점수를 계산하여 answer 배열에 담습니다.
마지막으로, answer 배열을 반환하여 최종 결과를 반환합니다.