프로그래머스 - 푸드 파이터 대회

이나리·2023년 2월 6일
0

문제

https://school.programmers.co.kr/learn/courses/30/lessons/134240

입출력 예시

foodresult
[1, 3, 4, 6]"1223330333221"
[1, 7, 1, 2]"111303111"

풀이

function solution(food) {
    return food.reduce((acc, curr, index) => {
        if (index === 0) return acc;
        
        const count = Math.floor(curr / 2);
        if (count > 0) {
            const zeroIdx = acc.indexOf('0');
            const frontStr = acc.slice(0, zeroIdx);
            const backStr = acc.slice(zeroIdx + 1);
            const str = `${index}`.repeat(count);
            return frontStr + str + '0' + str + backStr;
        }
        
        return acc;
    }, '0');
}

풀이 해석 (첫번째 예제 기준)

  1. 0번 음식인 물은 항상 1개만 존재하므로, reduce 메서드 콜백함수의 초기값으로 설정한다.

  2. 주어진 배열의 2번째 요소부터 칼로리가 적은 순서의 음식의 개수를 똑같이 나눠, 그 이전 순서의 음식의 왼쪽과 오른쪽에 추가해야 한다.

배열의 2번째 요소에 대해서 이 과정을 반복하므로, 음식의 순서는 배열의 인덱스와 동일함.

물만 있다면, 첫번째로 칼로리가 적은 순서의 음식을 물의 왼쪽과 오른쪽에. ex) 0101
물과 첫번째로 칼로리가 적은 순서의 음식이 있다면, 물은 항상 가운데에 위치해야 하므로, 2번째로 칼로리가 적은 순서의 음식을 첫번째 음식의 왼쪽과 오른쪽에. ex) 1011220221
....위의 과정을 계속 반복한다.
(단, 앞뒤로 추가할 수 있는 음식의 개수가 1보다 작다면, 이는 생략한다.)

  1. 0번 음식인 물을 기준으로 그 이전에 추가했던 순서의 음식의 개수를 복사한다.

  2. 음식의 순서는 물을 기준으로 왼쪽, 오른쪽 모두 바깥에서 안쪽으로 추가되므로, 3번에서 복사한 이전 순서의 음식의 값은 가장 앞쪽과 뒤쪽에, 현재 추가하려는 순서의 음식은 0 의 앞뒤에 더한다.

0개의 댓글