코딩테스트

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

오쟝 2024. 3. 5. 19:04

 

오늘의 문제는 푸드 파이트 대회입니다.

문제를 보고 필요한 것이 무언인지 생각해 보았습니다.

먼저 음식이 2명이 먹을 수 있어야 하고, 반올림이 아닌 소수점을 제거해야합니다.

다음은 한 선수의 음식을 배치하게 되면 다음 선수의 음식은 처음 선수의 문자열을 뒤집으면 됩니다!

 

function solution(food) {
    var answer = '';
    
    for(let i = 0; i<food.length; i++){
        if(Math.floor(food[i]/2) > 0){
            for(let j = 0; j<Math.floor(food[i]/2); j++) answer += i;
        }
    }
    return answer + '0' + answer.split("").reverse().join('');
}

 

따라서 저는 Math.floor를 사용해서 음식이 2명에서 먹을 수 있는지를 확인하고 중첩 for문을 사용해 answer에 넣어주었습니다. 이렇게 첫 번째 선수의 음식 순서를 정한 후에는 '0'과 answer를 나눈 배열을 뒤집은 후 join을 사용하여 연결해주었습니다.

 

 

결과는 정답!!

 

문제를 푼 후 다른 분의 코드도 살펴보았습니다.

 

가장 상단에 있는 코드를 한 번 보겠습니다.

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은 괄호 안에 들어가는 숫자만큼 반복을 하는 메서드입니다.

예를 들어 "abc".repeat(2)를 하게 되면 > "abcabc"가 리턴됩니다.

 

따라서 i를 String으로 형 변환 시킨 후 Math.floor를 사용해 몇 번 반복할 지 넣어주는 방식입니다.

 

제가 if와 중첩 for문을 사용했던 것보다 좀 더 간결하고 효율적인 코드인 것 같습니다.

 

첫 번째 음식 정렬을 구한 후 [...res].reverse().join('')을 사용하였습니다. reverse와 join을 사용한 것은 같지만 전개연산자를 사용하였습니다. 전개연산자를 사용하게 되면 배열이나 객체의 요소를 나열해주지만 원본을 손상시키지는 않는 복사본을 만들 수 있습니다. 따라서 res의 문자열을 이루고 있는 요소들을 나열하는 배열을 만든 것입니다.

 

 

>

앞으로 코딩을 할 때 무조건 조건문과 반복문을 쓰기 전에 좀 더 단순하고 간결한 코드를 어떻게 만들 수 있을지 고민해봐야겠습니다! 이 문제도 조건문과 반복문을 쓰게 되면 쉽겠지만 repeat()이라는 메소드를 쓰게 되면 조건문과 중첩 반복문 없이 작성할 수 있다는 것을 생각하지 못해 아쉽습니다. 하지만 Math.floor()를 사용한 것과 reverse와 join을 사용한 것은 칭찬해주고 싶다!! O(∩_∩)O

 

그럼 20000~