[프로그래머스/js] 숫자의 표현 (Lv. 2)

2025. 3. 26. 20:00·공부/코딩테스트
목차
  1. 문제
  2. 문제 리뷰
  3. 첫 번째 시도 (오답, 79.2/100)
  4. code
  5. review
  6. 두 번째 시도 (오답, 87.5/100)
  7. code
  8. review
  9. 세 번째 시도 (정답)
  10. code
  11. review
  12. 소감
  13. (+) let에서 var로 바꾸기만 했는데..

문제

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

프로그래머스

SW개발자를 위한 평가, 교육, 채용까지 Total Solution을 제공하는 개발자 성장을 위한 베이스캠프

programmers.co.kr

프로그래머스 :: 숫자의 표현 :: Lv. 2

문제 리뷰

이번에 pick 한 문제도 문제 설명이 짧고, 스토리텔링이 더해지지 않아(군더더기 없는 설명!!) 이해가 쉬운 문제였습니다.

 

저는 일단, "그냥 1부터 '연속된 자연수의 합'이 n이 되는 애들 수집해버려" 라고 생각했고, 그렇게 코드를 작성했습니다.

 

(Stay..)

 

첫 번째 시도 (오답, 79.2/100)

code

function solution(n) {
    let answer = [];
    
    for (let i = 1; i <= n; i++) {
        let temp = []; // 임시 배열
        let tempTotal = 0;
        let j = i;
        
        while (tempTotal < n) {
            temp.push(j++);
            tempTotal = temp.reduce((acc, cur) => acc + cur, 0);
            
            if (tempTotal === n) {
                answer.push(temp);
                break;
            }
        }
    }
    
    return answer.length;
}

review

ㅋ.

 

정확성 테스트는 모두 통과했지만, 효율성 테스트에서 참패한 모습입니다.

 

한 번 패하고 나니 번쩍!! 생각이 떠오르더군요..

 

— 이건 누적합 배열과 함께라면 해결할 수 있어.. —

 

두 번째 시도 (오답, 87.5/100)

code

function solution(n) {
    let sumArr = [0];
    let answer = 0;
    let [l, r] = [0, 1];
    
    for (let i = 1; i <= n; i++) {
        sumArr.push(sumArr[sumArr.length - 1] + i);
    }
    
    while (l < r && l <= n && r <= n) {
        if (sumArr[r] - sumArr[l] > n) l++;
        else if (sumArr[r] - sumArr[l] < n) r++;
        else {
            answer++;
            l++;
            r++;
        }
    }
    
    return answer;
}

review

ㅋ. (2)

 

그러나 이번에도 실패

 

하지만 첫 번째 시도에 비해 효율성에서 제법 성과를 얻은 모습입니다.

이런 방법을 two-pointers 라고 하던가요?

누적합 배열이라는 아이디어 자체는 나이스 한 것 같네요..

 

그렇다면 이제 손 볼 곳은 뭐냐?

while을 뚫어져라 바라봅니다..

 

세 번째 시도 (정답)

code

function solution(n) {
    let sumArr = [0];
    let answer = 0;
    let [l, r] = [0, 1];
    
    for (let i = 1; i <= n; i++) {
        sumArr.push(sumArr[sumArr.length - 1] + i);
    }
    
    while (l <= n && r <= n) { // `l < r` 조건 삭제
        const sub = sumArr[r] - sumArr[l]; // 중복 연산 방지
        
        if (sub > n) l++;
        else if (sub < n) r++;
        else {
            answer++;
            l++;
            r++;
        }
    }
    
    return answer;
}

review

미묘한 수정 결과, 통과할 수 있었습니다!!

 

소감

첫 번째 시도 (오답, 79.2/100) 두 번째 시도 (오답, 87.5/100) 세 번째 시도 (정답)


 

음.. 좋았어

 

레벨1 문제들을 풀 때는 대부분

답이 나오기만 하면 됐는데,

 

레벨2 부터는 시간복잡도를 유의하면서 계획하는 연습을 해야할 것 같습니다.

 


(+) let에서 var로 바꾸기만 했는데..

그런데 말이죠

질문하기에 들어가 보니 이런 질문이 있더군요.

..뭐라구요?!?!

그래서 두 번째 시도의 코드에서, 모든 let을 var로 바꿔 보았는데..

 

이게 되네

 

구글링 해보니, 'var와 let 간 성능 차이'에 대해 이미 수많은 분들이 의문을 제시하셨고, 또 분석하신 게시글이 있었습니다.

 

요약하자면

  1. 일부 케이스에서는 let이 빠르지만, 또 어떤 케이스에서는 var가 빠르더라
  2. 그 이유는, Scope와 Lexical Enviroment 간 관계의 차이에서 비롯된 것으로 추정된다
  3. (개발 환경에서는) var보단 let을 쓰자

입니다.

 

자세한 내용을 공부하고자 한다면

  1. var와 let 간 성능 차이
  2. var let const
  3. js scope
  4. js lexical enviroment

등의 키워드를 검색해 보면 되겠습니다.

 

'공부 > 코딩테스트' 카테고리의 다른 글

[프로그래머스/js] 소수 찾기 (Lv. 2)  (2) 2025.04.16
[프로그래머스/js] 124 나라의 숫자 (Lv. 2)  (2) 2025.04.08
[프로그래머스/js] 다음 큰 숫자 (Lv. 2)  (1) 2025.03.25
[프로그래머스/js] 비밀 코드 해독 (Lv. 2)  (2) 2025.03.17
[프로그래머스/js] 가장 가까운 같은 글자 (Lv. 1)  (7) 2025.01.22
  1. 문제
  2. 문제 리뷰
  3. 첫 번째 시도 (오답, 79.2/100)
  4. code
  5. review
  6. 두 번째 시도 (오답, 87.5/100)
  7. code
  8. review
  9. 세 번째 시도 (정답)
  10. code
  11. review
  12. 소감
  13. (+) let에서 var로 바꾸기만 했는데..
'공부/코딩테스트' 카테고리의 다른 글
  • [프로그래머스/js] 소수 찾기 (Lv. 2)
  • [프로그래머스/js] 124 나라의 숫자 (Lv. 2)
  • [프로그래머스/js] 다음 큰 숫자 (Lv. 2)
  • [프로그래머스/js] 비밀 코드 해독 (Lv. 2)
ywwwon01
ywwwon01
이것저것 작성합니다.. 어엿한 웹 개발자로의 길
  • ywwwon01
    ywwwon01 님의 블로그
    ywwwon01
  • 전체
    오늘
    어제
    • 분류 전체보기 (33)
      • 낙서장 (3)
      • 공부 (20)
        • 코딩테스트 (13)
        • IT 인프라 (7)
      • 개발 (9)
        • Front-End (7)
        • Back-End (2)
  • 블로그 메뉴

    • 홈
    • 태그
    • 방명록
  • 링크

  • 공지사항

  • 인기 글

  • 태그

    VPC
    EC2
    배포
    에러 노트
    파일시스템
    EBS
    AWS 프리티어
    델타 탐색
    two-pointers
    최적화
    WSL2
    ubuntu
    splice
    toString()
    docker
    Queue
    Heap
    falsy
  • 최근 댓글

  • 최근 글

  • hELLO· Designed By정상우.v4.10.3
ywwwon01
[프로그래머스/js] 숫자의 표현 (Lv. 2)

개인정보

  • 티스토리 홈
  • 포럼
  • 로그인
상단으로

티스토리툴바

단축키

내 블로그

내 블로그 - 관리자 홈 전환
Q
Q
새 글 쓰기
W
W

블로그 게시글

글 수정 (권한 있는 경우)
E
E
댓글 영역으로 이동
C
C

모든 영역

이 페이지의 URL 복사
S
S
맨 위로 이동
T
T
티스토리 홈 이동
H
H
단축키 안내
Shift + /
⇧ + /

* 단축키는 한글/영문 대소문자로 이용 가능하며, 티스토리 기본 도메인에서만 동작합니다.