문제 및 제한사항
나의 풀이
문제를 풀긴 풀었는데 어제의 알고리즘 문풀에 비해 시간이 배로 걸렸고, 코드의 퀄리티가 배로 좋지 않다.
웬만해서는 알고리즘 문제를 풀고 나면 기분이 진짜 좋은데, 풀고 나서도 기분이 하나도 안좋았다.
일단 어떤 식으로 접근 했는지, 어떤 방법들을 시도했고 어떤 결과에 도출했는지 적어보겠다.
코드를 짜기 전 생각해본 코드 작성 과정은 다음과 같다.
1. (배열의 인덱스가 출력되는 음식의 값이고, 배열의 요소가 주어진 음식의 수이기 때문에)
각 배열의 인덱스와 함께 각사람이 먹을 음식의 수를 정수로 리턴하기.
2. 리턴한 인덱스를 각 사람이 먹을 음식의 수만큼 반복해서 0 앞에 붙이기.
3. 리턴한 인덱스를 각 사람이 먹을 음식의 수만큼 반복해서 0 뒤에 붙이기.
이렇게 구상하고 난 뒤 짜본 코드는 아래와 같다.
function solution(food) {
let answer = [0] ;
for(let i=1;i<food.length;i++){
let foods = String(Math.floor(food[i]/2));
answer.push(foods);
}
return answer;
};
let food = [1,3,4,6];
console.log(solution());
unshift와 push를 이용해 배열의 앞뒤로 반복문을 통해 넣은 후 join 메서드를 사용해서 합쳐주려고 했다.
하지만 문제는 food의 각 인덱스를 각 사람이 먹을 음식의 개수만큼 넣어줘야 한다는 것이었다.
문제점
위에서 말했다싶이 index를 각 사람이 먹을 음식의 개수만큼 출력해줘야했다.
진짜 진짜 진짜 많은 시도를 했다.
function solution(food) {
answer = "0"
for(let i=1;i<food.length;i++){
answer.padStart(Math.floor(food[i]/2)+1,i).padEnd(Math.floor(food[i]/2)+1,i);
}
return answer;
}
let food = [1,3,4,6]
console.log(solution(food));
padstart, padend 를 이용해 넣어보려고도 했고
function solution(food) {
let answer = "0";
let result = food.slice(1).map((el,i)=>{
return answer.padStart(Math.floor(el/2)+1,i+1).padEnd(Math.floor(el/2)+1,i+1);
});
return result;
};
let food = [1,3,4,6]
console.log(solution(food))
map의 두번째 파라미터인 i를 적절하게 이용하면 될 것 같아 사용해보기도 했다.
function solution(food) {
let newArr = food.slice(1).map((el,i)=>{
return Math.floor(el/2)
})
return newArr;
}
let food = [1,3,4,6]
console.log(solution(food))
그냥 단순하게 newArr에 먹을 음식의 개수와 index를 맞춘 [1,2,3]을 넣기도 했다.
i+1의 인덱스를 출력하되 newArr의 요소 크기만큼 반복해주면 되기 때문이었다.
하지만,,,, 결론부터 말하자면 일단은 반복!!!이 문제였다.
반복문을 통해 일정 문자열을 반복하는 함수를 만들어 넣어보았는데 코드가 너무 더러워졌다.
그러다 진짜 우연히 발견한 repeat메서드!!!! 이 기능을 진짜 찾고 싶었는데 왜 이제 나온거야.......
해결 ( feat. repeat 메서드 )
<repeat의 도움을 받은 코드>
function solution(food) {
let answer = "0";
let result = "";
for (let i = 1; i < food.length; i++) {
let repeatTimes = Math.floor(food[i] / 2);
let stringI = String(i);
result += stringI.repeat(repeatTimes)
console.log(result)
}
let reverseResult = result.split("").sort().reverse().join("");
answer = result + answer + reverseResult;
return answer;
};
let food = [1, 3, 4, 6]
console.log(solution(food))
구상했던 대로, 0 을 기준으로 왼쪽에 인덱스를 1인당 먹을 음식의 수만큼 반복해서 더해줬다.
상대편도 똑같은 음식을 똑같은 순서에 따라 먹기 때문에 0을 기점으로 반대로 정렬되어 있다.
따라서 왼쪽편 선수의 음식 순서를 거꾸로 만들어 0의 오른쪽에 더해주었다.
결국은 풀긴 풀었다.
하지만 내가 봐도 아쉬운 코드다.... 자존감 떨어지네....
조금 더 깔끔하게 나올 수 있는지 다시 한번 더 보러간다.
'Algorithm' 카테고리의 다른 글
콜라 문제 [프로그래머스] (0) | 2023.10.19 |
---|---|
두 개 뽑아서 더하기 [프로그래머스] (0) | 2023.10.19 |
가장 가까운 같은 글자 [프로그래머스] (0) | 2023.10.16 |
[1차] 비밀지도 [프로그래머스] (2) | 2023.10.16 |
정수 내림차순으로 배치하기 [프로그래머스] (1) | 2023.10.16 |