1. 문제
https://school.programmers.co.kr/learn/courses/30/lessons/131701
프로그래머스
코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.
programmers.co.kr
원형 수열에서 연속하는 부분 수열의 합의 경우의 수를 구하는 문제이다.
2. 초기 코드
function solution(elements) {
elements.push(...elements);
let acc = [];
for (let i=0; i<elements.length/2; i++) {
let sum = 0;
for (let j = 0; j < (elements.length-1) / 2; j++) {
sum+=elements[i+j];
if (!acc.includes(sum)) acc.push(sum);
}
}
return acc.size;
}
기존 배열을 한번 더 붙여 2번 반복되는 배열을 만들고, 배열을 2중 for문으로 순회하며 각 요소에서부터 1~(요소의 길이)개의 요소들의 합을 acc에 저장하는 형태이다. 이때 중복된 값이 들어가면 안되므로, includes 를 이용하여 이미 포함된 값인지 검사를 하였다.
이때, 2중 for문에 또 한번의 순회를 거치는 includes 과정까지 더해져 런타임 에러가 발생하였다.
3. 최종 코드
function solution(elements) {
elements.push(...elements);
let acc = new Set();
for (let i=0; i<elements.length/2; i++) {
let sum = 0;
for (let j = 0; j < (elements.length-1) / 2; j++) {
sum+=elements[i+j];
acc.add(sum);
}
}
return acc.size;
}
저장하는 acc 타입을 배열이 아닌 Set으로 바꾸었다. Set은 값을 저장할 때 중복되는 값은 하나의 값으로 처리하기 때문에, 런타임을 줄일 수 있다.
'TIL' 카테고리의 다른 글
TIL 240626 - 면접 예상질문 및 답변 모음 (공개모의면접 진행) (0) | 2024.06.26 |
---|---|
TIL 240625 - Nest.js란? 간단한 코드 해부하기 (0) | 2024.06.25 |
TIL 240621 - 알고리즘 코드카타 - 괄호 회전하기 (0) | 2024.06.21 |
TIL 240620 - socket.io 적용 (2) namespace / room (1) | 2024.06.20 |
TIL 240619 - socket.io 적용 (1) 기본 기능 구현 / 파일 분리 문제 해결 (0) | 2024.06.19 |