5월-6월에 가고 싶었던 부트캠프 (네이버 부스트캠프, 우아텍, 코드스쿼드) 들이 모집 (예상) 이라는 정보를 듣고, 하루에 한문제씩이라도 자바스크립트 알고리즘 문제를 풀어보면 도움이 되지 않을까 하고 있다. 태어나서 알고리즘을 풀어보는 게 처음이기도 (본래 전공 언론정보학과 ^^;) 하고 아직 프로그래밍을 배운 지 얼마 안돼서 내가 적은 알고리즘이 좋은 알고리즘이라는 확신은 없다. 그래도 한 문제 한 문제 풀어가면서 새롭게 알아가는 것들이 많아서 간단하게라도 풀이에 성공한 문제들은 어떤 실수를 했는지, 새로 알게 된 문법들이 있는지 기록해보고자 한다!
1. 문제
프로그래머스 Lv1. 소수 만들기 (링크)
2. 나의 풀이
function solution(nums) {
var answer
const sumOfThree = [];
for (x=0; x < nums.length - 2; x++) {
for(y=x+1; y < nums.length - 1; y++) {
for(z= y+1; z < nums.length ; z++) {
sumOfThree.push(nums[x]+nums[y]+nums[z]);
}
}
}
for (i=0; i< sumOfThree.length; i++) {
for (n=2; n<sumOfThree[i] && n<2998; n++) {
if (sumOfThree[i]%n===0) {
sumOfThree.splice(sumOfThree.indexOf(sumOfThree[i]),1);
i--;
break;
}
}
}
answer = sumOfThree.length;
return answer;
}
3. 배움
for 반복문과 ++, -- 연산자
- python에서 for문 사용하는 법을 배워서, 내가 javascript 의 for반복문 문법을 알고 있다고 착각하고 있었다. 내가 과거에 공부했던 js 들을 살펴보니 while 반복문만 배우고 사용해보았지 for문은 사용을 안해봤더라 ^^; for문 문법을 검색해보면서 ++연산자와 --연산자에 대해서도 알게 되었다.
splice
- 배열에 값을 추가하는 array.push()만 알고 있었지 값을 제거하는 방법에 대해서는 처음 검색해서 알게되었다. splice를 이용해서 값을 제거하는 경우 배열의 길이 자체가 줄어들게 된다는 점 주의
4. 마주친 다양한 에러
- 처음에 계속 sumOfThree.push(nums[x]+nums[y]+nums[z]); 에서 에러가 났다. 뭐지, 자료형이 string인가 ? 하고 parseInt도 써보고 여러가지 해봤는데 알고보니 sumOfThree에 오타가 있었다. 에러가 날때는 기본적인 오타부터 살펴보자 ^^;
- 일부 소수들이 걸러지지 않았다. 자기 자신으로 나눠지는 경우를 생각을 못했다. for문 조건에 n<sumOfThree[i] && 을 추가 하고나서야 스스로보다 작은 수로만 나눌 수 있게 되었다.
- 실행 결과를 돌려보니 일부 케이스에서는 pass를 하고 일부 케이스에서는 fail을 했다. 틀린 케이스를 대입해서 코드 중간중간 console.log를 하면서 로직을 검토했다. 그 결과 만약 2로 나누어 떨어지는 수가 있는 경우 배열에서 제거가 되면서 배열의 수가 -1이 되고 다음 검토해야 하는 수가 배열의 한 칸 앞으로 당겨지게 되는데 이부분에 대한 고려를 못해서 그냥 넘어가는 케이스가 발생했던 것이다. 이에 따라 나누어떨어지는 경우에는 i--를 하고 다음 자리 수로 넘어갈 수 있도록 break를 추가하였다.
5. 총평
세 수의 합을 구하는 부분은 잘 생각했다고 생각한다! 처음에는 너무 막막했는데 그래도 차근차근 생각을 해보니 풀리긴 풀렸다. 다양한 에러들을 마주쳤지만 그만큼 많이 배우게 된 문제였다고 생각한다 :)
'Algorithm > 문제 풀이' 카테고리의 다른 글
프로그래머스 Lv1. 완주하지 못한 선수 (0) | 2022.03.30 |
---|
댓글