반응형
문제
프로그래머스
코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.
programmers.co.kr
풀이
내 풀이
처음에 문제를 이해하는데 시간이 조금 걸렸다.
linked list로, 끝과 앞이 연결된 형태라 생각하고
연속된 숫자의 합이 중복 없이 총 몇 가지가 나올 수 있는지 묻는 문제였다.
나는 slice를 이용해서 풀이했다.
function solution(elements) {
const answer = [...elements];
for(let i = 2; i <= elements.length; i++) {
for(let j = 0; j < elements.length; j++) {
let sliceArr;
if(i + j > elements.length) {
sliceArr = elements.slice(j).concat(elements.slice(0, (i + j) % elements.length))
} else {
sliceArr = elements.slice(j, i + j);
}
answer.push(sliceArr.reduce((acc, cur) => acc + cur, 0));
}
}
return [...new Set(answer)].length;
}
다른 풀이
function solution(elements) {
const circular = elements.concat(elements);
const set = new Set();
for (let i = 0; i < elements.length; i++) {
let sum = 0;
for (let j = 0; j < elements.length; j++) {
sum += circular[i + j];
set.add(sum);
}
}
return set.size;
}
(1) 그렇구나.. 애초에 처음부터 elements.concat(elements) 를 하고 푸는게 훨씬 깔끔하다
(2) 그렇구나.. 애초에 처음부터 answer를 Set 으로 만들면 되네
이렇게 하니까 for문에 조건을 크게 생각하지 않아도 돼서 훨씬 깔끔하고 간단하게 문제를 풀 수 있다.
두 번째 for문은 reduce로 작성해도 될 듯 한데, for문이 더 가독성있긴 하다.
다른 사람들도 대부분 Set 을 이용해서 풀이했더라.
다음에 중복 문제가 나오면 나도 Set 으로 풀어봐야겠다.
반응형
'CS > 알고리즘' 카테고리의 다른 글
[230424] 프로세스 (0) | 2023.04.24 |
---|---|
[230423] 소수 만들기 (0) | 2023.04.23 |
[230423] 명예의 전당 (1) | 2023.04.23 |
[230422] 기능개발 (0) | 2023.04.22 |
[230422] 소수 찾기 (0) | 2023.04.22 |