[프로그래머스] 푸드 파이트 대회(JavaScript)

2024. 9. 5. 21:21[Node.js_6기 본캠프 TIL]

 

 

 

◈ 고민 시작

알고리즘 문제를 풀면서 문제가 이해되지 않아 여러번 읽게 된 건 이번이 처음인 것 같다. 캡쳐에는 보이지 않지만, food의 첫번째 요소는 물이기 때문에 "1"이 고정이며, result의 중앙에 "0"으로 return 되어야 한다. 예시에서 유추할 수 있듯, food의 각 요소는 음식의 갯수이며, index값이 곧 칼로리에 따른 음식의 고유 넘버이다. 문제를 풀기 위한 주의점을 간단하게 정리하자면 하기와 같다.

  • food[0] = 물, result 중앙에 "0"으로 return 되어야 함
  • food[n] = 음식의 갯수, n은 칼로리 순으로 정렬된 음식의 고유 넘버
  • 선수가 1:1로 매칭되며, 동일한 음식이 제공되어야 하므로 2개 미만으로 준비된 음식은 사용할 수 없다.
  • 홀수로 준비된 음식은 선수들에게 동일하게 제공될 수 있는 만큼만 사용된다. (7개면 3개씩 분배하고 1개는 버려야 한다.)
  • 각 선수들이 양 끝에서 동일한 순서대로 음식을 먹을 수 있게 세팅해야 하므로, 중앙(물)을 기점으로 반전된 패턴을 보인다.

코드로 정리하기 전에, 어떤 작업들이 필요한지 먼저 정리해보기로 했다.

function solution(food) {
    // 선수A가 먹을 음식 패턴(순서) 선언
    for(let i=0; i<food.length; i++){
        // 각 선수에게 제공할 수 있는 음식의 양을 확인하는 함수 선언
        if(food[i] >= 2){  // 준비된 음식이 2개도 안된다면 제공을 하지 못하므로 조건을 걸어준다
            // 선수A가 먹을 음식 패턴의 결과값을 넣어준다
        }
    }
    return 선수A가 먹을 음식 패턴 + 물 + 선수B가 먹을 음식 패턴(A 패턴 반전)
}

 

 

◈ 풀이

function solution(food) {
    let array = '';
    for(let i=0; i<food.length; i++){
        let foodNum = Math.floor(food[i]/2) //소수점은 제공할 수 없으므로 내림 처리
        if(food[i] >= 2){
            array += (i.toString().repeat(foodNum)) // 준비된 음식 갯수만큼 반복
        }
    }
    return array + "0" + array.split("").reverse().join("");
}

 

 

◈ 어려웠던 점

repeat()과 reverse()를 써본 적이 있기 때문에 자신 있게 코드를 써내려가기 시작했었다. 그러나 정말 써본 적만 있을 뿐... 어떤 조건에서 쓸 수 있는지는 숙지하지 못하고 있었다는 것을 배운 시간이었다. 자주 쓰는 메서드들을 중심으로 따로 한번 정리할 필요성을 느낀다.

 

1) repeat()

숫자 타입의 i에 냅다 repeat을 썼더니, 함수가 아니라는 오류 문구가 출력되어서 혹시 오타를 낸건가 뚫어져라 보고 있었다. 설마 하고 조건을 검색해보니, string 타입에만 사용 가능한 메서드였다. 그렇다고 "i"로 문자열로 바꾸면 그건 그냥 i 라는 문자 그 자체가 string이 되기 때문에... 급하게 string 타입으로 변경해주는 함수를 찾아야 했다. toString()을 사용하면 된다는 글을 보고 나서야 아 맞다 이런 게 있었지... 하고 코드를 수정했다. 

 

2) reverse()

array를 뒤집으면 끝난다는 생각에 단순하게 array.reverse()라고 썼다. 당연히 될 리가 없었다. 배열에만 사용할 수 있는 메서드를 string 타입에 바로 써버렸으니, 함수가 아니라는 오류 문구가 또 출력되었다. 잠시 생각해보니, split()과 함께 썼던 기억이 있었다. reverse()가 배열에서만 작동하므로, split()으로 하나씩 뜯어놓은 배열 형태로 바꾸고, reverse()로 반전하고, 다시 join("")으로 붙여 string으로 돌려놔야 했다. 이것도 분명 예전에 썼던 메서드인데... 어떤 기능이 있는지만 알고, 어떤 상황에서 쓸 수 있는지는 조금 대충 넘겨왔던 것 같아 민망했다.