본문으로 건너뛰기
yceffort
PostsSeriesTagsAbout🧪 Research
EN

Tweaks

theme
accent palette
film grain
minimal mode
BACK TO INDEX
◆ ESSAY
--min
--year
KOoriginal

mailMail icongithubtwitter
yceffort
•
© 2026
•
https://yceffort.kr
BACK TO INDEX
◆ ESSAY

Codility - Fish

avatar
yceffort
2020-06-25 · 3분
3min
2020year
KOoriginal
algorithm

Fish

문제

길이 N으로 이루어진 비어있지 않은 배열 A, B가 주어진다. 배열 A는 물고기의 크기를, B는 물고기의 움직임을 나타내는데, 0일 경우 위로, 1일 경우 아래로 간다. 만약 두마리의 물고기가 만날 경우, 더 사이즈가 큰 물고기가 잡아먹어버린다. 이 때 살아남는 물고기의 수를 구하라.

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

0번 물고기는 위로 간다
1번 물고기는 밑으로 가는데, 2번 물고기는 위로 간다. 이 때 1번 물고기는 2번 물고기를 먹는다
마찬가지로 3번 물고기도 먹고,
그러나 4번물고기는 5로 1번 물고기보다 덩치가 크므로 4번 물고기가 1번물고기를 먹는다

이때 그래서 살아남는 물고기는 2마리다.

풀이

function solution(A, B) {
  // 하류로 가는 물고기를 쌓는 스택
  const stack = []
  let count = 0

  for (let i = 0; i < A.length; i++) {
    // 물고기가 하류로 가면 그 물고기의 크기를 스택에 쌓는다
    if (B[i] === 1) {
      stack.push(A[i])
    }
    // 물고기가 상류로 갈경우
    else {
      // 하류행 물고기가 있는지 계속해서 확인한다
      while (stack.length > 0) {
        // 하류행 물고기가 있으면 한마리 씩 맞짱 뜬다
        // 하류행 물고기가 더 크면 패배
        if (stack[stack.length - 1] > A[i]) {
          break
        }
        // 상류행 물고기가 더 크면 하류행 물고기 하나의 숨통을 끊는다
        else {
          stack.pop()
        }
      }

      // 그렇게 상류행 물고기를 다 이겨야 생존 카운트를 올릴 수 있다.
      if (stack.length === 0) {
        count += 1
      }
    }
  }

  // 최종 생존 명단은 하류로 가는 물고기 중 살아남은 물고기 + 상류로 갔는데 살아남은 물고기다.
  return stack.length + count
}

관련 글

  • #javascript#algorithm

    자바스크립트로 메모이제이션 구현하기

    까먹지 않게 기억해두기

    2020-11-23·1분
  • #algorithm

    프로그래머 기초 수학 2-3 - 유리수, 무리수, 실수

    유리수, 무리수, 실수

    2020-07-29·5분
  • #algorithm

    프로그래머 기초 수학 2-2 - 기수법

    기수법

    2020-07-24·3분
  • #algorithm#mathematics

    프로그래머 기초 수학 2-1 - 정수

    정수

    2020-07-23·4분

새 글을 놓치고 싶지 않으시다면 RSS로 구독해 주세요.

RSS 구독 →

yceffort — 프론트엔드 엔지니어입니다. 발표·기술 자문·기고 문의는 이곳에서 받고 있습니다.

← Back to the blogIssue on GitHub →