[프로그래머스 코딩테스트 연습문제] 푸드 파이트 대회 | 알고리즘 설명 & 문제 풀이 with 자바스크립트(Javascript)

Re_Go·2024년 1월 3일
0

코딩테스트연습

목록 보기
65/106
post-thumbnail

1. 문제 설명

2. 제한사항

3. 입출력 예

4. 입출력 예 설명

5. 첫번째 문제 풀이(2024-01-03)

일단 이번 문제는 이해하는데 한 20분을 쓸 만큼 되게 난해한 문제였던 듯 합니다. 뭐, 결국에는 이해해서 풀긴 했는데 풀다보니 얼마 전에 정리를 해놓은 자바스크립트 이론 공부들의 메서드들을 이용할 수 있는 시간이기도 해서 나름 만족을 했습니다.

일단 이 문제는 food 배열이 주어지면 이 음식들의 칼로리 뭐 그딴거는 집어 치우도록 하고(어차피 칼로리가 낮은 순으로 정렬이 되어있는 상태입니다.) 배열에 [1,3,5,7] 이렇게 주어졌다고 합시다. 그럼 이걸 상대방이랑 같이 나눠먹어야 합니다. 그래서 실질적으로 똑같이 분배해서 먹을 수 있는 수를 구하면 되는데,

첫번째 음식은 1개이므로 나누어 먹을 수 없으므로 pass, 두번째 음식은 세 개이므로 하나씩 나누어 먹으면 되므로 101 입니다. 그리고 세번째 음식도 5개 이므로 2개씩 나누어 먹으면 되므로 1220221 가 되죠. 네번째 음식도 3개씩 나누어 먹으면 되니까 결과적으로 1223330333221을 구하면 됩니다.

그래서 이 문제의 경우 result변수를 문자열로 할당한 후 for문을 돌면서 각 food 배열마다 2개씩 쪼개는 작업을 해주면 되는데, 이때 2로 나눌 경우 홀수는 실수가 발생됩니다. 그래서 언뜻 보면 둘이 나눠먹어야 되니까 Math.ceil 메서드를 사용할 수도 있겠지만, 그렇게 되면 실질적으로 없는 음식이 하나 더 생겨버리는 꼴이니 floor 메서드를 사용해 줍니다.(어차피 음식 개수가 홀수라면 하나를 빼고 양쪽에서 각각 똑같이 나누어 먹어야 하니까 나눈 값을 floor로 소수를 버림 처리 해줍니다.)

아무튼 그렇게 도출된 값을 i만큼 반복을 하면 되는데, 이때 사용되는 것이 바로 repeat 메서드입니다. 그리고 이 메서드를 사용하려면 해당 매개변수가 String 타입이어야 하므로 i의 값을 String으로 변환하여 repeat 메서드를 사용한 후 최종 반환값을 result 변수에 누적 시켜줍니다.

그 후 for문이 끝나게 되면 내가 먹을 음식 번호와 개수를 반환받을 수 있을텐데, 이 값을 배열로 나누고(split), 돌려서(reverse), 다시 문자열로 만듭니다(join) 그리고 그 값에 0을 더한 후 return 변수에 누적시켜주면 0을 사이에 끼고 상대가 먹을 개수와 내가 먹을 개수가 담긴 최종 문자열이 생성됩니다.

function solution(food) {
    result = "";

    for(let i = 0; i < food.length ; i++){
        result += String(i).repeat(Math.floor(food[i]/2))
    }
    return result += (0 + result.split('').reverse().join(''));
}
profile
인생은 본인의 삶을 곱씹어보는 R과 타인의 삶을 배워 나아가는 L의 연속이다.

0개의 댓글