Notice
Recent Posts
Recent Comments
Link
«   2024/04   »
1 2 3 4 5 6
7 8 9 10 11 12 13
14 15 16 17 18 19 20
21 22 23 24 25 26 27
28 29 30
Tags
more
Archives
Today
Total
관리 메뉴

coding etude

[javascript]추억 점수 본문

algorithm

[javascript]추억 점수

코코리니 2023. 12. 23. 23:38

사진들을 보며 추억에 젖어 있던 루는 사진별로 추억 점수를 매길려고 합니다. 사진 속에 나오는 인물의 그리움 점수를 모두 합산한 값이 해당 사진의 추억 점수가 됩니다. 예를 들어 사진 속 인물의 이름이 ["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 함수를 완성해주세요.


제한사항
  • 3 ≤ name의 길이 = yearning의 길이≤ 100
    • 3 ≤ name의 원소의 길이 ≤ 7
    • name의 원소들은 알파벳 소문자로만 이루어져 있습니다.
    • name에는 중복된 값이 들어가지 않습니다.
    • 1 ≤ yearning[i] ≤ 100
    • yearning[i]는 i번째 사람의 그리움 점수입니다.
  • 3 ≤ photo의 길이 ≤ 100
    • 1 ≤ photo[i]의 길이 ≤ 100
    • 3 ≤ photo[i]의 원소(문자열)의 길이 ≤ 7
    • photo[i]의 원소들은 알파벳 소문자로만 이루어져 있습니다.
    • photo[i]의 원소들은 중복된 값이 들어가지 않습니다.

입출력 예nameyearningphotoresult
["may", "kein", "kain", "radi"] [5, 10, 1, 3] [["may", "kein", "kain", "radi"],["may", "kein", "brin", "deny"], ["kon", "kain", "may", "coni"]] [19, 15, 6]
["kali", "mari", "don"] [11, 1, 55] [["kali", "mari", "don"], ["pony", "tom", "teddy"], ["con", "mona", "don"]] [67, 0, 55]
["may", "kein", "kain", "radi"] [5, 10, 1, 3] [["may"],["kein", "deny", "may"], ["kon", "coni"]] [5, 15, 0]

 

문제 풀이

function solution(name, yearning, photo) {
    var answer = [];
    let findNameIdx = [];
    let count = 0;

    for(i = 0; i < photo.length; i++) {
        for(j = 0; j < name.length; j++){
            if(photo[i].includes(name[j])){
                findNameIdx.push(name.indexOf(name[j]));
            }
        }
        if(findNameIdx.length){
            for(f = 0; f < findNameIdx.length; f++){
                count += yearning[findNameIdx[f]];
            }
            answer.push(count);
            findNameIdx = [];
            count = 0;
        }else {
            answer.push(0);
        }
    }

    return answer;
}

 

첫 풀이에서 생각하는 기능을 모두 나열해서 풀었다.

사진 찾기 > 사진에 포함된 이름 찾기 > 이름이 있으면 점수 찾아서 더하기 > 없다면 0 넣기 > 초기화

위의 방법 순으로 통과. 여기서 더 줄여 본다면.

function solution(name, yearning, photo) {
    var answer = [];
    let count = 0;
	
   	photo.forEach((img) => {
    	img.forEach((find) => {
        	if(name.includes(find)){
                count += yearning[name.indexOf(find)];
            }
        });
        count === 0 ? answer.push(0) : answer.push(count);
        count = 0;
    });
    
    return answer;
}

 

이중 for문을 이중 forEach문으로 변경해주고 name에서 확인 절차를 생략하고, 바로 yearning에서 name의 index를 이용하여 바로 찾아서 더하는 방식으로 수정했다.

여기서 주의해야 할 점은 적은 수의 연산은 이중 forEach로 가능하지만, 모수가 많을 수록 이중 for문을 이용해야 한다는 것이다.

 

하지만!! 제출 한 답안 중에 가장 베스트라고 생각했던 답안은.

function solution(name, yearning, photo) {
    return photo.map((v)=> v.reduce((a, c)=> a += yearning[name.indexOf(c)] ?? 0, 0))
}

 

여기서 핵심은 reduce함수 이다.

 

Array.prototype.reduce()

arr.reduce(callback[, initialValue])

 

ex)

const array1 = [1, 2, 3, 4];

// 0 + 1 + 2 + 3 + 4
const initialValue = 0;
const sumWithInitial = array1.reduce(
  (accumulator, currentValue) => accumulator + currentValue,
  initialValue,
);

 

accumulator

누산기는 콜백의 반환값을 누적합니다. 콜백의 이전 반환값 또는, 콜백의 첫 번째 호출이면서 initialValue를 제공한 경우에는 initialValue의 값입니다.

currentValue

처리할 현재 요소.

currentIndex Optional

처리할 현재 요소의 인덱스. initialValue를 제공한 경우 0, 아니면 1부터 시작합니다.

initialValue Optional

callback의 최초 호출에서 첫 번째 인수에 제공하는 값. 초기값을 제공하지 않으면 배열의 첫 번째 요소를 사용합니다. 빈 배열에서 초기값 없이 reduce()를 호출하면 오류가 발생합니다.

 

위의 답안에서 map의 리턴값은 배열이기 때문에 하나의 사진에 대한 답이 return되는 형식이다.

마지막 null 연산자를 통해서 찾은 값이 없다면 값을 0으로 대체하는 방식을 사용했다.

 

결론, javascript는 각 prototype에 포함된 함수의 기능을 잘 활용 할 수 있어야 할 것 같다.

'algorithm' 카테고리의 다른 글

[javascript] 공원산책  (2) 2024.01.07
[Javascript]달리기 경주  (0) 2023.08.09
[javascript] 햄버거 만들기  (0) 2023.01.09
[javascript] 푸드파이트 대회  (0) 2023.01.05
[Javascript] 과일 장수  (0) 2023.01.05