[Programmers]롤케이크 자르기/JS

2024. 2. 24. 01:10·Algorithm/Programmers
목차
  1. 문제링크
  2. 접근방법
  3. 오답
  4. 정답코드

문제링크

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

 

프로그래머스

코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.

programmers.co.kr

접근방법

배열을 잘라서 두 배열에 있는 원소 종류가 몇 개인지 구한 다음 같으면 answer + 1 해주면 되겠구나.

어쩐지 단순하다 싶었다.. 

오답

function solution(topping) {
  var answer = 0;

  for (let i = 1; i < topping.length; i++) {
    let front = topping.slice(0, i);
    let back = topping.slice(i, topping.length);
    let frontResult = front.filter((value, index)=>front.indexOf(value)===index);
    let backResult =back.filter((value, index)=>back.indexOf(value)===index);    
    if(frontResult.length == backResult.length) answer++;

  }

  return answer;
}

위의 코드는 filter 함수를 이용한 코드이다.

배열을 잘라서 앞 뒤 배열의 토핑 종류가 몇 개인지를 구하는건데

시간초과..ㅠㅠ 

1<=topping의 길이<=1,000,000

1<=topping의 원소<=10,000

조건을 보니까 이렇게 하면 시간이 엄청 오래걸릴거 같긴하넹..

function solution(topping) {
  var answer = 0;

  for (let i = 1; i < topping.length; i++) {
    let front = topping.slice(0, i);
    let back = topping.slice(i, topping.length);
    let frontResult = [...new Set(front)];
    let backResult = [...new Set(back)];   
    if(frontResult.length == backResult.length) answer++;

  }

  return answer;
}

혹시 Set으로 풀면 되지 않을까?라는 희망을 가지고 Set으로도 풀어봤지만

똑같이 시간 초과.. 여기서부터 멘탈이 나갔다..

도저히 고민해봐도 어떻게 풀어야할지 감이 안와서 결국 구글링해봤다.

 

map 쓰는 사람들이 많던데 나는 위에서 Set을 사용해서 그런지 Set을 사용한 코드가 더 끌렸다.

정답코드

function solution(topping) {
  var answer = 0;
  const len = topping.length;
  const frontCnt = Array(len).fill(0);
  const backCnt = Array(len).fill(0);

  const frontSet = new Set();
  const backSet = new Set();

  for (let i = 0; i < len; i++) {
    frontSet.add(topping[i]);
    backSet.add(topping[len - 1 - i]);
    frontCnt[i] = frontSet.size;
    backCnt[len - 1 - i] = backSet.size;
  }

  for (let i = 0; i < len - 1; i++) {
    if (frontCnt[i] === backCnt[i + 1]) answer++;
  }

  return answer;
}

frontCnt와 backCnt는 토핑의 종류가 몇 개인지를 저장한다.

frontCnt는 앞에서부터, backCnt는 뒤에서부터 개수를 세서 저장한다.

frontSet과 backSet은 중복을 제거해서 개수를 세기 위해서 사용한다.

 

ex) topping[1, 2, 1, 3, 1, 4, 1, 2]일때

frontCnt[1, 2, 2, 3, 3, 4, 4, 4]

backCnt[4, 4, 4, 4, 3, 3, 2, 1] => frontCnt[3] == backCnt[4], frontCnt[4]==backCnt[5]이므로 answer은 2!!

 

첫번째 for문을 다 돌고 나면

두번째 for문에서 frontCnt[i]와 backCnt[i+1]의 값이 같으면 

공평하게 나눠진걸로 간주해서 answer++를 해준다.

 

 

시간복잡도를 생각해야했던 문제이다..ㅠ
내가 제일 못하는 부분이라서 어려웠당...

'Algorithm > Programmers' 카테고리의 다른 글

[Programmers]등굣길/JS  (2) 2024.04.04
[Programmers]다트 게임/JS  (8) 2024.03.29
[Programmers]문자열 압축/JS  (0) 2024.02.23
[Programmers]혼자 놀기의 달인/JS  (0) 2024.02.19
[Programmers]삼각 달팽이/JS  (1) 2024.02.01
  1. 문제링크
  2. 접근방법
  3. 오답
  4. 정답코드
'Algorithm/Programmers' 카테고리의 다른 글
  • [Programmers]등굣길/JS
  • [Programmers]다트 게임/JS
  • [Programmers]문자열 압축/JS
  • [Programmers]혼자 놀기의 달인/JS
>동구리<
>동구리<
  • >동구리<
    데굴데굴 굴러가는 히동구리
    >동구리<
  • 전체
    오늘
    어제
    • 분류 전체보기
      • WEB
      • HTML,CSS,JS
      • React
      • 개발
      • Git
      • 이것저것
      • Algorithm
        • Programmers
        • Study
  • 블로그 메뉴

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

  • 공지사항

  • 인기 글

  • 태그

    ouline
    JITC
    배열 생성
    border vs outline
    adaptive jitc
    http1
    리액트 #React #생명주기 #Lifecycle #훅 #Hook
    리액트 #React #아토믹디자인 #아토믹디자인패턴
    이벤트 전파
    js 동작원리
  • 최근 댓글

  • 최근 글

  • hELLO· Designed By정상우.v4.10.3
>동구리<
[Programmers]롤케이크 자르기/JS
상단으로

티스토리툴바

단축키

내 블로그

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

블로그 게시글

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

모든 영역

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

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