✨JSY
article thumbnail

-- 문제

https://school.programmers.co.kr/learn/courses/30/lessons/12924

 

프로그래머스

코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.

programmers.co.kr


-- 최초 풀이

<javascript />
function solution(n) { let cnt = 0; let i = 1; // 예외 처리 if (n === 1) return 1; while (1) { let mid = Math.ceil(n / i); // 중앙값 // 연속된 수 중 가장 작은 값이 1보다 작으면 루프 종료 및 cnt 리턴 if (mid - Math.floor(i / 2) < 1) return cnt; if (n % mid === 0) cnt++; else if (n % (mid * 2 - 1) === 0) cnt++; i++; } }

 

-- 접근 과정

매개변수 n이 1일 때는 1을 리턴하도록 예외 처리를 먼저 해 준 다음,

중앙값을 먼저 구하고, 만들어 질 연속된 수 중 가장 작은 값이 1보다 작게 되면 while loop를 종료하도록 했다.

그 다음, 중앙값으로 n이 나누어 떨어지면 cnt 증가

혹은 중앙값(소수점 올림) * 2 - 1으로 n이 나누어 떨어지면 cnt 증가

로 코드를 짰다.

 

하지만, 제출 결과 62.5점이었다.

 

최초 풀이대로라면,

#TC : n = 100

i 가

1
2
4
5
8
10
11

일 때 cnt 가 증가하게 되는 데

알다시피 i 가 2인 경우에는 연속된 수의 합으로 100을 만들 수 없다.

(중앙값이 50이면서, 만들 수 있는 49 + 50 과 50 + 51 둘 다 100 이 되지 않음)

 

실제로는

100 = 100

100 = 18 + 19 + 20 + 21 + 22

100 = 9 + 10 + 11 + 12 + 13 + 14 + 15 + 16

이렇게 3가지 경우만 나온다.

 

그래서 위의 코드를 최대한 바꾸지 않으면서 문제를 해결하려 했으나, 로직이 떠오르지 않아

결국 중앙값을 기준으로 한 연속된 수 배열을 만들어 합이 100인 지 확인하는 방식으로 갔다.

 

-- 최종 제출

<javascript />
function solution(n) { let cnt = 0; let i = 1; while (1) { let mid = Math.ceil(n / i); // 중앙값 기반 배열 길이가 i인 연속된 수 배열 생성 let arr = Array(i).fill(mid).map((v, idx) => v + idx - ~~(i / 2)); if (arr[0] < 1) return cnt; // 배열 중 가장 작은 값이 1 미만이면 루프 종료 if (arr.reduce((acc, cur) => acc + cur, 0) === n) cnt++; i++; } }

 

제출 결과 모든 케이스를 통과했지만 굳이 배열을 만들지 않고 수학 계산만으로 풀 수 있는 방법이 있을 것 같았다.

그래서 다른 분의 풀이를 참고했다.

 

-- 다른 분의 풀이 참고

<javascript />
function solution(n) { var answer = 0; for (var i = 1; i <= n; i++) { if ((n % i == 0) && (i % 2 == 1)) { answer++; } } return answer; }

 

i 가 1부터 n 까지 for loop를 돌려 n을 i 로 나눈 나머지가 0이고, i 가 홀수인 경우 answer를 증가하도록 했다.

1시간 동안 고민했지만 이렇게 풀이할 생각을 미처 하지 못했다.

하지만 이 경우에는 방법을 생각 못 했다는 것에 초점을 맞추지 말고, 패턴으로 기억해 두었다가 비슷한 문제를 다시 만났을 때 적용해 볼 만 한 것 같다.

 

(+ 내 최종 풀이 vs 다른 분 풀이 효율성 비교)

다른 분 풀이
내 최종 풀이

profile

✨JSY

@JUNSANG YOO

포스팅이 좋았다면 "좋아요❤️" 또는 "구독👍🏻" 해주세요!