수웅이는 매달 주어진 음식을 빨리 먹는 푸드 파이트 대회를 개최합니다. 이 대회에서 선수들은 1대 1로 대결하며, 매 대결마다 음식의 종류와 양이 바뀝니다. 대결은 준비된 음식들을 일렬로 배치한 뒤, 한 선수는 제일 왼쪽에 있는 음식부터 오른쪽으로, 다른 선수는 제일 오른쪽에 있는 음식부터 왼쪽으로 순서대로 먹는 방식으로 진행됩니다. 중앙에는 물을 배치하고, 물을 먼저 먹는 선수가 승리하게 됩니다.
ㅤ
이때, 대회의 공정성을 위해 두 선수가 먹는 음식의 종류와 양이 같아야 하며, 음식을 먹는 순서도 같아야 합니다. 또한, 이번 대회부터는 칼로리가 낮은 음식을 먼저 먹을 수 있게 배치하여 선수들이 음식을 더 잘 먹을 수 있게 하려고 합니다. 이번 대회를 위해 수웅이는 음식을 주문했는데, 대회의 조건을 고려하지 않고 음식을 주문하여 몇 개의 음식은 대회에 사용하지 못하게 되었습니다.
ㅤ
예를 들어, 3가지의 음식이 준비되어 있으며, 칼로리가 적은 순서대로 1번 음식을 3개, 2번 음식을 4개, 3번 음식을 6개 준비했으며, 물을 편의상 0번 음식이라고 칭한다면, 두 선수는 1번 음식 1개, 2번 음식 2개, 3번 음식 3개씩을 먹게 되므로 음식의 배치는 "1223330333221"이 됩니다. 따라서 1번 음식 1개는 대회에 사용하지 못합니다.
ㅤ
수웅이가 준비한 음식의 양을 칼로리가 적은 순서대로 나타내는 정수 배열 food가 주어졌을 때, 대회를 위한 음식의 배치를 나타내는 문자열을 return 하는 solution 함수를 완성해주세요.
function solution(foods) {
let result = [0]
for (let i = foods.length - 1; i > 0; i--){
const dividedFood = Math.floor(foods[i] / 2);
if(dividedFood >= 1){
for(let j = 0; j < dividedFood; j++){
result.push(i);
result.unshift(i);
}
}
}
return result.join('');
}
array의 첫 번째 인덱스는 물이기 때문에 배열의 원소 수보다 하나 적게 반복문을 돌린다.
그리고 짝수만 반으로 나눌 수 있기 때문에 해당 값을 반으로 나누고 내림 한 후 그 값이 1과 같거나 크다면 그 값만큼 result 배열의 시작과 끝에 해당 인덱스값을 추가한다.
그리고 배열로 이루어진 result를 문자열로 변환하여 return하면 끝이다.
function solution(food) {
let res = '';
for (let i = 1; i < food.length; i++) {
res += String(i).repeat(Math.floor(food[i]/2));
}
return res + '0' + [...res].reverse().join('');
}
프로그래머스에서 가져온 타인의 풀이이다.
존재 자체도 몰랐던 repeat
메소드를 이 풀이를 통해 알게되어 기록하고싶어 가져왔다.