티스토리 뷰
https://school.programmers.co.kr/learn/courses/30/lessons/12938
프로그래머스
코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.
programmers.co.kr
🤔 해결방법
1. s를 n으로 나눈 몫으로 집합을 채운다.
2. 나머지가 나오는 경우 1씩 더해준다.
3. 오름차순으로 정렬 후 반환
🔑 풀이
문제를 처음 읽었을 때는 단순하게 합해서 S가 되는 쌍을 모두 찾아 곱하기까지 해보면 되지 않을까 싶었지만 당연히 메모리 초과, 시간 초과가 날 것 같았다.
그래서 곱의 결과가 최대가 되는 집합을 찾기 위해 어떤 규칙이 있는지 여러 예시로 알아봤다.
그 결과, n개의 숫자들 간의 차이가 적을수록 곱의 결과가 크다는 것을 알 수 있었다!
그렇다면 숫자들 간의 차이가 적은 쌍을 어떻게 찾아야 할까.
위의 예시들처럼 1,4,5번째의 경우 즉, s를 n으로 나누어 떨어지는 경우는 그 몫들로 이루어진 집합이 답이 된다.
2,3번째처럼 나누어 떨어지지 않는다면 나머지를 최대한 분배하면 된다.
이는 각 요소에 1씩 나머지만큼 더해주면 된다.
따라서 최종 코드는 다음과 같다.
function solution(n, s) {
let answer = [];
//s가 n보다 작아서 집합을 만들 수 없는 경우
if (s < n) {
answer.push(-1);
return answer
}
//나누어 떨어지는 경우
if ( s % n === 0) {
for (let i = 0; i < n; i++){
answer.push(Math.floor(s / n));
//나누어 떨어지지 않는 경우
}} else {
for (let i = 0; i < n; i++){
answer.push(Math.floor(s / n));
}
//1씩 나머지만큼 더해줌
for (let j = 0; j < s % n; j++){
answer[j] += 1;
}
}
//오름차순 정렬
answer.sort((a,b) => a-b)
return answer;
}
'JS-algorithm > 프로그래머스' 카테고리의 다른 글
[프로그래머스] 124 나라의 숫자 (javascript) (0) | 2023.08.21 |
---|---|
[프로그래머스] 단속카메라 (javascript) (0) | 2023.07.24 |
[프로그래머스] 요격 시스템 (javascript) (0) | 2023.07.17 |
댓글