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

이나리·2023년 2월 6일

문제

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

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

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

0개의 댓글