https://school.programmers.co.kr/learn/courses/30/lessons/134240
food | result |
---|---|
[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');
}
0번 음식인 물은 항상 1개만 존재하므로, reduce 메서드 콜백함수의 초기값으로 설정한다.
주어진 배열의 2번째 요소부터 칼로리가 적은 순서의 음식의 개수를 똑같이 나눠, 그 이전 순서의 음식의 왼쪽과 오른쪽에 추가해야 한다.
배열의 2번째 요소에 대해서 이 과정을 반복하므로, 음식의 순서는 배열의 인덱스와 동일함.
물만 있다면, 첫번째로 칼로리가 적은 순서의 음식을 물의 왼쪽과 오른쪽에. ex) 0
→ 101
물과 첫번째로 칼로리가 적은 순서의 음식이 있다면, 물은 항상 가운데에 위치해야 하므로, 2번째로 칼로리가 적은 순서의 음식을 첫번째 음식의 왼쪽과 오른쪽에. ex) 101
→ 1220221
....위의 과정을 계속 반복한다.
(단, 앞뒤로 추가할 수 있는 음식의 개수가 1보다 작다면, 이는 생략한다.)
0번 음식인 물을 기준으로 그 이전에 추가했던 순서의 음식의 개수를 복사한다.
음식의 순서는 물을 기준으로 왼쪽, 오른쪽 모두 바깥에서 안쪽으로 추가되므로, 3번에서 복사한 이전 순서의 음식의 값은 가장 앞쪽과 뒤쪽에, 현재 추가하려는 순서의 음식은 0
의 앞뒤에 더한다.