惯性聚合 高效追踪和阅读你感兴趣的博客、新闻、科技资讯
阅读原文 在惯性聚合中打开

推荐订阅源

Threat Intelligence Blog | Flashpoint
Threat Intelligence Blog | Flashpoint
博客园_首页
钛媒体:引领未来商业与生活新知
钛媒体:引领未来商业与生活新知
博客园 - 叶小钗
A
About on SuperTechFans
量子位
G
Google Developers Blog
云风的 BLOG
云风的 BLOG
T
Threat Research - Cisco Blogs
Spread Privacy
Spread Privacy
Hacker News - Newest:
Hacker News - Newest: "LLM"
N
News and Events Feed by Topic
C
Cybersecurity and Infrastructure Security Agency CISA
cs.AI updates on arXiv.org
cs.AI updates on arXiv.org
T
Tenable Blog
V
V2EX
月光博客
月光博客
L
Lohrmann on Cybersecurity
W
WeLiveSecurity
Webroot Blog
Webroot Blog
H
Hacker News: Front Page
酷 壳 – CoolShell
酷 壳 – CoolShell
T
The Exploit Database - CXSecurity.com
freeCodeCamp Programming Tutorials: Python, JavaScript, Git & More
博客园 - 三生石上(FineUI控件)
T
Troy Hunt's Blog
Google Online Security Blog
Google Online Security Blog
AI
AI
腾讯CDC
Recent Commits to openclaw:main
Recent Commits to openclaw:main
Google DeepMind News
Google DeepMind News
CTFtime.org: upcoming CTF events
CTFtime.org: upcoming CTF events
V2EX - 技术
V2EX - 技术
Martin Fowler
Martin Fowler
博客园 - Franky
I
Intezer
Project Zero
Project Zero
I
InfoQ
P
Privacy International News Feed
C
Check Point Blog
T
The Blog of Author Tim Ferriss
P
Palo Alto Networks Blog
L
LINUX DO - 最新话题
有赞技术团队
有赞技术团队
Cloudbric
Cloudbric
人人都是产品经理
人人都是产品经理
cs.CL updates on arXiv.org
cs.CL updates on arXiv.org
S
SegmentFault 最新的问题
Latest news
Latest news
小众软件
小众软件

The Tracks of mulder21c

Atomic Design + Storybook 적용 후기 json-server에 사용자 인증 구현하기 개발환경 WSL2 + zsh로 갈아타기 pass function as props in vue 2020년 회고 colum flexbox에서 padding bottom 문제 해결 Nuxt를 통해 보는 프론트엔드 개발자가 하는 일 Nuxt Router kebab-case 처리 JS to SCSS 변환 Nuxt + Storybook 통합 하기 2020 이직 이야기 2020 이직 이야기 2020 이직 이야기 2020 이직 이야기 Windows에서 PM2 실행 오류 해결 오픈톡 정지에 대한 카카오톡 고객센터 후기 배려에 대한 단상 학습이 잘 되지 않는 이유 웹팩 4 마이그레이션 삽질기 babel 7 업데이트 후 node_modules 패키지가 변환되지 않는다면? white space는 4px이다? 정말? 2020년 시간 관리를 위해서 도입 한 툴들 Codility Lesson 5 — PassingCars 2019년 회고 Codility Lesson 4 — MissingInteger Codility Lesson 4 — FrogRiverOne Codility Lesson — PermCheck 착각은 자유가 아닌각 세미나 진행 후기 Codility Lesson 3 — tapeEquilibrium Codility Lesson 3 — PermMissingElm Codility Lesson 3 — FrogJump 알고리즘 연습을 다시 시작했다. Codility Lesson 2 — CyclicRotation Codility Lesson 2 — OddOccurrencesInArray Codility Lesson 1 — BinaryGap 아이패드 구매 하고 3주 써 본 기록 세미나 어떻게 준비해야 할까? HTML은 웹이다 접근성 향상을 위한 이름 짓기 접근성 교육에서 자주 나오는 상위 5가지 질문 접근 가능한 숨김 텍스트 깃북 파일 저장 시 오류 문제 해결 크로스 브라우징이란? 블로그 테마 만들기 시작 2018년 회고 학습에 대한 오해 모르는 사람에게 질문할거면 예의 좀 지켜라 파이썬으로 웹 크롤러 만들기 해쉬 링크 오프셋 조정하기
Codility Lesson 4 — MaxCounters
멀더끙 · 2019-12-08 · via The Tracks of mulder21c

Task description

  • 정수 N과 1 ~ N + 1까지의 값을 원소로 가지는 배열 A가 주어짐
  • 배열 A를 순회하면서 해당 값들이 나오는 수를 카운트
  • 배열 A를 순회하는 중에 발견된 값이 N + 1일 경우 모든 값에 대한 카운트를 가장 높은 카운트 수로 일괄 변경

즉,

N = 5

A[0] = 3
A[1] = 4
A[2] = 4
A[3] = 6
A[4] = 1
A[5] = 4
A[6] = 4

이러한 N과 A 배열이 주어졌다면, A[2]까지 순회 했을 때 3은 1번, 4는 2번 카운트 되었으므로 (0, 0, 1, 2, 0)이 반환되어야 하고, 이후 A[3]까지 순회 했을 때는 6 = N + 1에 해당하므로 모든 값에 대한 가장 높은 카운트 수인 2로 일괄 변경하여 (2, 2, 2, 2, 2)가 반환되어야 함.

이를 처리하는 가장 효율적인 알고리즘 작성

How I did solve

1 차 (77%)

  • 1부터 N까지 A에 몇 번 나타나는가가 일단 기본값을 이루기 때문에 카운터 Deck(?)을 만들어 두고 값 값이 나올때마다 Deck의 값을 1씩 증가.
  • N + 1의 값이 나오면 모든 Deck을 가장 큰 카운터 값으로 채움
    • 가장 큰 카운터 값을 그 때 그 때 조회하는건 비효율적이므로 값을 조회할 때마다 가장 큰 카운터 값을 미리 담아 둠.
  • 최종적으로 반환 시에 Deck이 비어있으면 오류이므로 Deck의 각 카운트 값은 0으로 초기화.

이 요구사항으로 구현을 하고 제출했으나... 스코어 77%... 또르르...

large_random2과 extream_large 케이스에서 Timeout이 발생했다.

Solved Code

function solution(N, A) {
  const counter = new Array(N).fill(0);
  let maxCounter = 0;

  A.forEach( item => {
    let idx = item - 1;
    if(item <= N) {
      counter[idx] += 1;
      maxCounter = Math.max(maxCounter, counter[idx]);
    }
    else
      counter.fill(maxCounter)
  })

  return counter
}

2차

어디서 문제일까 되짚어 봤을 때, 아무래도 counter.fill(maxCounter) 이 부분에서 timeout을 일으킨듯 보여서 이 부분을 개선해보기로.

  • N + 1이 나타날 때 마다 fill 하는 대신 max counter를 memorize해두고 마지막에 한 번에 적용
  • 단, 이 경우 중간에 max counter로 변경되어 거기서부터 다시 1씩 증가시키는 경우는 결과값이 달라지므로, 증가 시킬 때 max counter와 memorized counter를 분리하여 max counter가 발생된 이후 반영된 적이 없으면 일반 변경시키고 증가 시키도록 구현

그리고 이렇게 해서 100% 달성!

Solved Code

function solution(N, A) {
  const counter = new Array(N).fill(0);
  let maxCounter = 0;
  let tmpMaxCounter = 0;

  A.forEach( (item) => {
    let idx = item - 1;
    if( item <= N) {
      counter[idx] = Math.max(counter[idx], maxCounter);
      counter[idx] += 1;
      tmpMaxCounter =  Math.max(counter[idx], tmpMaxCounter);
    }else{
      maxCounter = tmpMaxCounter;
    }
  });

  counter.forEach( (item, idx, arr) => {
    arr[idx] = Math.max(item, maxCounter);
  })

  return counter
}

Retrospective

  • 하... 이 문제는 문제를 이해하는데만 거의 30분 이상을 쓴 것 같다.
    영어를 떠나서 문제 설명을 이렇게 어렵게 해놓아서야... 허허허...
    이 문제가 중급 난이도인건 문제 자체를 이해하는게 어려워서가 아닐까?
  • 역시 두 번만에 풀었음. 한 번에 풀어보고 싶다...
  • 아직까지는 그래도 풀만 하다.