옝옹
냠
옝옹
전체 방문자
오늘
어제
  • 분류 전체보기 (84)
    • [LG유플러스]유레카 SW (5)
    • React (20)
    • JS (17)
    • TypeScript (5)
    • CSS & HTML (1)
    • 알고리즘 (11)
    • JAVA (20)
    • GIT (1)
    • 자격증 (4)

블로그 메뉴

  • 홈
  • 태그
  • 방명록

공지사항

인기 글

태그

  • 혼자공부하는자바
  • useEffect
  • 코드스플리팅
  • 함수선언
  • 접근제한자
  • indexOf()
  • reverse() 메서드
  • join()
  • While문
  • 자바
  • Node.js
  • join() 메서드
  • map
  • 정적멤버
  • JavaScript
  • 화살표함수
  • 자바스트립트
  • continue문
  • 템플릿리터럴
  • 노마드코더
  • java.util패키지
  • match()
  • 리액트를다루는기술
  • 기본api클래스
  • TypeScript
  • sort() 메서드
  • map() 함수
  • 백준
  • do-while문
  • 자바스크립트
  • java
  • 타입스크립트
  • useRef
  • break문
  • 리액트
  • toFixed
  • 변수선언
  • fillter
  • js
  • switch문
  • ==
  • useMemo
  • java.lang패키지
  • 타입변환
  • 인스턴스멤버
  • template literal
  • useCallback
  • 혼자 공부하는 자바
  • reduce
  • useState

최근 댓글

최근 글

티스토리

hELLO · Designed By 정상우.
옝옹

냠

[알고리즘] 프로그래머스 - 롤케이크 자르기
알고리즘

[알고리즘] 프로그래머스 - 롤케이크 자르기

2024. 10. 10. 19:36

문제 설명 

 

제한 사항

  • 1 <= topping의 길이 <= 1,000,000
    • 1 <= topping의 원소 <= 10,000

입출력 예

topping result
[1, 2, 1, 3, 1, 4, 1, 2] 2
[1, 2, 3, 1, 4] 0

 

내 코드

sol 1.

**** 시간 초과 오답 ****

function solution(topping) {
  let answer = 0;
  const oldToppingSet = new Set(); // 철수 토핑
  const youngToppingSet = new Set(); // 동생 토핑
  let cutIdx = 1;

  while (cutIdx > -1 && cutIdx < topping.length) {
    for (let i = 0; i < cutIdx; i++) {
      oldToppingSet.add(topping[i]);
    }
    for (let j = cutIdx; j < topping.length; j++) {
      youngToppingSet.add(topping[j]);
    }

    if (oldToppingSet.size > youngToppingSet.size) break;
    if (oldToppingSet.size === youngToppingSet.size) answer++;

    cutIdx++;
    oldToppingSet.clear();
    youngToppingSet.clear();
  }
  return answer;
}
  • while 루프에서 시간 복잡도 최대 N
  • 두개의 for문 각각 최대 N
  • 최악의 경우 시간 복잡도 O(N^2)
    • 토핑의 길이가 최대 1,000,000이므로 정답을 돌렸을 때 오답이 뜸

 

sol 2

function solution(topping) {
  let answer = 0;
  const map = new Map(); //전체 토핑 개수로, for문이 돌면 동생의 토핑수가 된다.
  const broTopping = new Set();

  for (let i = 0; i < topping.length; i++) {
    map.has(topping[i])
      ? map.set(topping[i], map.get(topping[i]) + 1)
      : map.set(topping[i], 1);
  }

  for (let i = 0; i < topping.length; i++) {
    // 토핑을 하나씩 형한테 줌
    let cnt = map.get(topping[i]) - 1;
    broTopping.add(topping[i]);

    cnt == 0 ? map.delete(topping[i]) : map.set(topping[i], cnt);

    if (broTopping.size === map.size) answer++;
  }
  return answer;
}
  • Map의 성질을 활용해 효과적인 비교를 수행함
  • 토핑의 개수를 저장하여 두번째 for문을 순회할 때 broTopping을 업데이트하도록 함
  • 단독으로 N번씩 실행 -> 시간 복잡도 : O(n)
저작자표시 비영리 변경금지 (새창열림)

'알고리즘' 카테고리의 다른 글

[알고리즘]프로그래머스 - 2018 KAKAO BLIND RECRUITMENT [3차] 압축  (1) 2024.10.10
[알고리즘] 백준 11286 절대값 힙 node.js (heap)  (1) 2024.06.26
[알고리즘]프로그래머스 - N으로 표현 <동적계획법(DP)>  (0) 2024.03.04
[알고리즘] 백준 13904 과제 node.js (Greedy)  (3) 2024.02.23
[알고리즘] 탐욕법(Greedy)  (0) 2024.02.06
    '알고리즘' 카테고리의 다른 글
    • [알고리즘]프로그래머스 - 2018 KAKAO BLIND RECRUITMENT [3차] 압축
    • [알고리즘] 백준 11286 절대값 힙 node.js (heap)
    • [알고리즘]프로그래머스 - N으로 표현 <동적계획법(DP)>
    • [알고리즘] 백준 13904 과제 node.js (Greedy)
    옝옹
    옝옹

    티스토리툴바