코딩테스트

[JS] 연습문제 > 푸드 파이트 대회

차차한 2024. 9. 10. 15:19

오랜만에 한 번에 푼 문제

입력되는 배열이 무슨 뜻인지 이해가 잘 안 돼서 제한사항을 꼼꼼히 읽었다

0번 인덱스는 무조건 1이 나오고 그 다음 1번부터 N번까지 음식이 나온다

 

function solution(food) {
    var answer = '';
    var arr = food.map(v => ~~(v/2));
    for(let i = 1; i < arr.length; i++){
        let cnt = 0;
        if(arr[i] != 0){
            while(cnt++ < arr[i]){
                answer += i;
            }
        }
    }
    answer += "0" + answer.split("").reverse().join("");
    
    return answer;
}

먼저 arr 배열에 food의 값을 두 선수가 공평히 먹을 수 있게 2로 나눠줬다

그 다음 arr을 반복했다

0번 인덱스는 음식이 아닌 물이니까 1번 인덱스부터 반복 시작

테스트 1번을 예시로 들면 [1,3,4,6]을 둘로 나누면 [0, 1, 2, 3]이 된다

반을 나눈 만큼 음식을 먹는 거니 n번 인덱스의 값만큼 n번 반복을 해준다

1번 음식은 두 선수가 1번씩만 먹을 수 있고

2번 음식은 2개씩, 3번 음식은 3개씩 먹을 수 있다

단 값이 0이라면 두 선수가 먹을 수 없으니 값을 더하지 않고 넘어갔다

그러면 answer는 "122333"이 된다

중간에는 물이 위치하니까 0을 더하고 answer을 뒤집어 문자열을 더해주면 

"1223330333221"이 된다

 

다른 사람의 풀이를 보니까 나는 repeat 메소드를 생각하지 못 해서

while에 cnt까지 썼는데 repeat를 쓰면 0 체크, 반복문 없이 간단하게 표현이 가능하다.

function solution(food) {
    var answer = '';
    var arr = food.map(v => ~~(v/2));
    for(let i = 1; i < arr.length; i++){
        answer += String(i).repeat(arr[i]);
    }
    answer += "0" + [...answer].reverse().join("");
    return answer;
}

훨씬 깔끔한 코드

answer.split("")도 [...answer]로 표현이 가능하다