https://school.programmers.co.kr/learn/courses/30/lessons/12924
Lv1 중후반 - Lv2 초반으로 가면서
점점 내 코딩실력의 한계가 드러나는 기분이다.
이젠 단순한 기능구현 뿐 아니라
문제 이해력, 수학적 사고, 리팩토링, 코드 효율성 등등의 능력을 보는 것같다.
function solution(n) {
let answer = 0;
for(let a=n; a>0 ;a--) {
for(let i=1; i<=n-a+1; i++) {
if(i*(2*a+i-1)/2 === n) {
answer++
break;
}
}
}
return answer
}
내 첫번째 풀이.
등차수열의 합을 이용하여 이중 for문을 만들었다.
딱봐도 코드가 무거워 보인다.
코드 실행과 정확성 테스트에서는 모두 통과 되었지만
역시나 효율성 테스트에서 시간초과가 뜨고 말았다.
최종 풀이
function solution(n) {
let answer = 0
for(let i=1; i*(i+1)/2<=n;i++) {
let a = (n-(i*(i-1)/2))/i;
answer += a === ~~a ? 1 : 0
}
return answer
}
결국 gpt의 힘을 빌려 코드를 짰는데,
코드 흐름을 이해하는 것만으로도 벅찼다.
i는 숫자의 개수고 a는 시작 숫자.
i(숫자의 개수)를 하나씩 더하는데 결국 마지막은 1+2+3+... 형태가 나올 것이므로
i를 자연수의 합 공식을 써서 위 1+2+3+... 형태가 나올때 까지 1씩 더한다.
이제 a를 구할 차례인데
고2 때 배우는 등차수열의 합 " n{2a+(n-1)d}/2 "를 사용할 것이다.
공차가 1이고, n은 for문에서 돌리는 i 이므로
a에 대한 식은 (n-(i*(i-1)/2))/i 으로 나온다. (이 식에서 n은 매개변수 n)
이때 a가 자연수라면 연속된 자연수의 합이 나오므로 answer를 1씩 더해주는 것이다.
a가 자연수라면~ 조건은 최대한 간결해 보이기 위해
삼항 연산자와 비트 연산자를 사용해 주었다.
다른 사람의 풀이
function expressions(num) {
var answer = 0;
for (var i = 1; i <= num; i++) {
if ((num % i == 0) && (i % 2 == 1)) {
answer++;
}
}
return answer;
}
겁나 쉽게 푸셨는데 진짜 뭔 말인지 모르겠음..
슬슬 벽이 느껴지긴 하지만
이런 문제들을 많이 풀어보면서 수학적 사고력, 리팩토링 실력을 길러야 겠다.
힘내자!
'Coding Test' 카테고리의 다른 글
[JS] 프로그래머스 / 짝지어 제거하기 (0) | 2025.01.10 |
---|---|
[JS] 프로그래머스 / 삼총사 (0) | 2025.01.09 |
[JS] 프로그래머스 / 바탕화면 정리 (0) | 2024.12.23 |
[JS] 프로그래머스 / 대충 만든 자판 (0) | 2024.12.21 |
[JS] 프로그래머스 / 덧칠하기 (0) | 2024.12.21 |