코딩테스트
[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]로 표현이 가능하다