avatar
$
Published on

Codility - Fish

Author
  • avatar
    Name
    yceffort

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
}