[TIL] 20250325화 (자바스크립트의 배열, 연결리스트, 완전탐색(모의고사), reduce와 filter의 시간복잡도 계산)

2025. 3. 25. 23:26·Developer/TIL
반응형

2025-03-25


1) 자바스크립트의 배열

`for...of`는 배열의 반복에서 사용되고,
`for...in`은 객체의 반복에서 사용된다.

 

`unshift`, `shift` (배열의 맨앞)

`pop`, `push` (배열의 맨뒤)

 

`Array(5).fill(0)` ➡ 5개의 원소가 들어있는 배열을 모두 0으로 초기화 ex) [ 0, 0, 0, 0, 0 ]

 

인파 자바스크립트 배열 → 자바스크립트에서 제공하는 배열의 특징을 잘 정리해 놓은 블로그

 

2 ) 자바스크립트 반복문

🔹 문자열 반복

문자열을 반복할 때는 for, split + map/forEach, for...of 등을 사용할 수 있다.

1. for문 이용

const str = "hello";
for (let i = 0; i < str.length; i++) {
  console.log(str[i]);
}

2. split 후 map 또는 forEach 이용

문자열을 배열로 변환한 후 map이나 forEach를 사용할 수도 있다.

const str = "hello";
str.split("").forEach(char => console.log(char));

3. for...of 사용

const str = "hello";
for (const char of str) {
  console.log(char);
}

🔹 배열 반복

배열을 순회할 때 사용할 수 있는 반복문이 많다.

1. map 사용 (새로운 배열 반환)

const arr = [1, 2, 3];
const doubled = arr.map(num => num * 2);
console.log(doubled); // [2, 4, 6]

2. forEach 사용 (반환값 없음)

const arr = [1, 2, 3];
arr.forEach(num => console.log(num));

3. for...of 사용

const arr = [1, 2, 3];
for (const num of arr) {
  console.log(num);
}

🔹 객체 반복

객체의 키(key), 값(value), 키-값 쌍을 반복하는 방법이 있다.

1. Object.keys(obj) → 키(key) 반복

const obj = { a: 1, b: 2, c: 3 };
Object.keys(obj).forEach(key => console.log(key));
// 출력: a, b, c

2. Object.values(obj) → 값(value) 반복

const obj = { a: 1, b: 2, c: 3 };
Object.values(obj).forEach(value => console.log(value));
// 출력: 1, 2, 3

3. Object.entries(obj) → 키와 값 둘 다 반복

const obj = { a: 1, b: 2, c: 3 };
Object.entries(obj).forEach(([key, value]) => {
  console.log(`${key}: ${value}`);
});
// 출력: a: 1, b: 2, c: 3

 

 

3) 바킹독 알고리즘 배열 읽음, 링크드 리스트 읽는 중

자바스크립트로 `linked list` 구현

https://www.freecodecamp.org/korean/news/implementing-a-linked-list-in-javascript/

 

자바스크립트로 연결 리스트를 구현하는 방법

여러분이 만약 데이터 구조를 공부하고 있다면, 연결 리스트(linked list)는 반드시 알아야 할 구조 중 하나입니다. 연결 리스트를 좀 더 이해하고 싶거나 구현하는 방법이 궁금하다면 이 게시글이

www.freecodecamp.org

 

 

4) 프로그래머스 Lv1. 완전탐색 - 모의고사 문제 품

function solution(answers) {
    var answer = Array(3).fill(0);
    let su1 = [1, 2, 3, 4, 5];
    let su2 = [2, 1, 2, 3, 2, 4, 2, 5];
    let su3 = [3, 3, 1, 1, 2, 2, 4, 4, 5, 5]
    
    for(let i = 0; i < answers.length; i++) {
        if(answers[i] === su1[i % su1.length]) {
            answer[0]++;
        } 
        if(answers[i] === su2[i % su2.length]) {
            answer[1]++;
        } 
        if(answers[i] === su3[i % su3.length]) {
            answer[2]++;
        }
    }
    
    // 제일 많이 맞춘 사람 구하기
    let max = Math.max(...answer);
    let final = answer.reduce((indexes, num, i) => {
        if (num === max) indexes.push(i + 1);
        return indexes;
    }, []);
    
    return final.sort((a, b) => a-b);
}

📌 총 시간 복잡도 정리

단계 연산 횟수 시간 복잡도
점수 계산 (for 루프) ≈ 3 × N O(N)
Math.max(...answer) 1 O(1)
reduce()로 인덱스 찾기 ≤ 3 O(1)
sort() (최대 3개 정렬) ≤ 3 log 3 O(1)

📢 최종 시간 복잡도:
🔹 O(N) + O(1) + O(1) + O(1) = O(N)
즉, 이 알고리즘은 O(N) 으로 동작하며, N = 10,000일 때에도 효율적이다.

 

프로그래머스 인기 답안 중, 가장 첫번째 답안인`filter`을 3번 사용한 답안은 for문을 3번 돌리는 것과 유사한 시간복잡도를 가진다. 따라서, 시간 복잡도 측면에서 효율적이지는 않다.

 

추가적으로 `filter`, `reduce`의 시간복잡도에 대해 궁금증이 생겨 조사해 보았다.

🔍 JavaScript `filter()`와 `reduce()`의 시간 복잡도

✅ 1. `filter()`의 시간 복잡도

const result = array.filter((element) => condition);
  • filter()는 배열의 각 요소에 대해 주어진 조건을 검사해야 함.
  • 즉, N개의 요소를 가진 배열이라면 N번 반복하며 조건을 체크.
  • 시간 복잡도:
    • 최악의 경우: O(N) (배열의 모든 요소를 검사해야 함)
    • 최상의 경우: O(N) (여전히 모든 요소를 확인해야 함)

예제

const arr = [1, 2, 3, 4, 5];
const filtered = arr.filter(num => num % 2 === 0); // O(N)

👉 결론: `filter()`는 기본적으로 O(N)


✅ 2. `reduce()`의 시간 복잡도

const result = array.reduce((acc, element) => {
    return operation;
}, initialValue);
  • reduce()는 배열을 처음부터 끝까지 한 번 순회하며 누적 연산을 수행.
  • N개의 요소에 대해 반복 1번 + 연산 수행 → 총 N번 실행
  • 시간 복잡도:
    • 일반적인 경우: O(N)
    • 단, `reduce()` 내부에서 추가적인 `map()`, `filter()` 등 O(N) 연산을 호출하면 O(N²)로 증가할 수 있음

예제

const sum = arr.reduce((acc, num) => acc + num, 0); // O(N)

👉 결론: `reduce()`도 기본적으로 O(N)


🚀 최종 정리

메서드 시간 복잡도 설명
filter() O(N) 각 요소를 조건과 비교하며 새 배열 생성
reduce() O(N) 배열을 한 번 순회하면서 누적 연산 수행

🔥 추가적인 최적화 팁

  • `filter()`는 새로운 배열을 반환하기 때문에, 메모리를 절약하려면 for 문을 고려
  • `reduce()` 내부에서 추가적인 반복문 (`map()`, `filter()`, `forEach()`)를 사용하면 성능 저하 가능

👉 따라서, N이 크다면 for 문을 고려하는 것이 가장 빠른 해결책! 🚀

 

 

 

반응형
저작자표시 비영리 변경금지 (새창열림)

'Developer > TIL' 카테고리의 다른 글

TIL : 250401화 (:active, 즐겨찾기 기능 css 변경 진행중-event.target, menuRefs, white-space, 프로그래머스 문자열 내림차순으로 배치하기)  (0) 2025.04.01
TIL : 250331월 (프로그래머스 해시, 윤년, 같은 숫자는 싫어, 문자열 내 마음대로 정렬하기(sort()함수에 대해 알아보기))  (1) 2025.03.31
TIL : 250328금 (메뉴 검색창 만들기, 즐겨찾기 기능 구현, 프로그래머스 유연근무제)  (0) 2025.03.29
[TIL] 250327목 (isNaN, Number.isNaN / split, splice, slice / reduce / map vs reduce)  (1) 2025.03.27
[TIL] 250326수 (자바스크립트 BFS, BFS가 필요한 문제 패턴, PGM 음양마스터, selectbox 데이터 null값 뜨는 문제 수정)  (1) 2025.03.26
[TIL] 20250324월 (vue.js 부모 ← 자식 데이터 바인딩, input field :size)  (0) 2025.03.24
'Developer/TIL' 카테고리의 다른 글
  • TIL : 250328금 (메뉴 검색창 만들기, 즐겨찾기 기능 구현, 프로그래머스 유연근무제)
  • [TIL] 250327목 (isNaN, Number.isNaN / split, splice, slice / reduce / map vs reduce)
  • [TIL] 250326수 (자바스크립트 BFS, BFS가 필요한 문제 패턴, PGM 음양마스터, selectbox 데이터 null값 뜨는 문제 수정)
  • [TIL] 20250324월 (vue.js 부모 ← 자식 데이터 바인딩, input field :size)
청량리 물냉면
청량리 물냉면
프로그래밍 공부를 하고 있습니다. 공부 내용 정리 겸 정보 공유를 목적으로 합니다.
    반응형
  • 청량리 물냉면
    노력중인 블로그
    청량리 물냉면
  • 전체
    오늘
    어제
    • 분류 전체보기 (506)
      • 프로그래밍 (41)
        • Programming (1)
        • C | C++ (6)
        • Java (28)
        • Python (5)
      • 웹 프로그래밍 (2)
        • HTML | CSS (5)
        • JavaScript | TypeScript (41)
        • React (25)
        • Vue.js (0)
        • Next.js (18)
        • Spring & Spring Boot (13)
        • JSP & Servlet (1)
        • DB (4)
      • 웹 프로젝트 (77)
        • 웹 프로젝트 (22)
        • 🥨스낵몰 (3)
        • 👨‍👨‍👧‍👧소셜 가계부 (26)
        • 🌜꿈 일기장 (11)
        • 🔮포트폴리오 사이트 (11)
        • 🏃‍♂️팀 프로젝트: 일정관리 프로그램 (0)
        • 📈팀 프로젝트: AI기반 주식 분석 플랫폼 (0)
        • 😺Just Meow It: 조언 사이트 (2)
        • 📕Workly: 교대근무 다이어리 (1)
      • 앱 프로그래밍 (26)
        • Flutter (24)
        • Kotlin (2)
      • Problem Solving (166)
        • 백준 (52)
        • 프로그래머스 (79)
        • SWEA (29)
      • Computer Science (40)
        • 알고리즘 (14)
        • 컴퓨터 네트워크 (18)
        • 이산수학 (8)
      • Developer (47)
        • 후기 (4)
        • 자료정리 (4)
        • 취업 | 취준 (9)
        • SSAFY (1)
        • 웹개발 교육 프로그램 (9)
        • TIL (20)
  • 블로그 메뉴

    • 홈
    • Github
  • 공지사항

    • 프로그래밍 공부 중😊
  • 인기 글

  • 태그

    d3
    백준
    클론 프로젝트
    강의내용정리
    컴퓨터네트워크
    bfs
    플러터
    구현
    프로그래머스
    SWEA
    알고리즘
    spring boot
    프로젝트
    ZeroCho
    mysql
    블로그 제작
    React
    타입스크립트
    웹사이트
    뉴렉처
    포트폴리오
    파이썬
    Til
    자바
    AWS
    Jiraynor Programming
    자바스크립트
    리액트
    Next.js
    공식문서
  • 최근 글

  • hELLO· Designed By정상우.v4.10.3
청량리 물냉면
[TIL] 20250325화 (자바스크립트의 배열, 연결리스트, 완전탐색(모의고사), reduce와 filter의 시간복잡도 계산)
상단으로

티스토리툴바