๏ฃฟ Apple Lover Developer & Artist

์˜์†์ ์ธ ๋””์ž์ธ์— ํ˜„๋Œ€์˜ ๊ณต๊ฐ์„ ์ฑ„์›Œ๋„ฃ๋Š” ๊ณต๋ฐฉ์ž…๋‹ˆ๋‹ค

๐Ÿ–ฅ Computer Science/Programming

[์•Œ๊ณ ๋ฆฌ์ฆ˜] ๋ฐฑ์ค€ 16236 ์•„๊ธฐ์ƒ์–ด

singularis7 2020. 8. 23. 13:45
๋ฐ˜์‘ํ˜•

๋„์ž…

2020๋…„ ์ƒ๋ฐ˜๊ธฐ ์‚ผ์„ฑ์ „์ž ๊ธฐ์ถœ๋ฌธ์ œ์ธ ๋ฐฑ์ค€(#16236) ์•„๊ธฐ์ƒ์–ด ๋ฌธ์ œ๋ฅผ ํ’€์–ด๋ด…์‹œ๋‹ค!

ํƒ์ƒ‰ ๋ฐ ์‹œ๋ฎฌ๋ ˆ์ด์…˜ ๋ฌธ์ œ์ž…๋‹ˆ๋‹ค. ์ฒ˜์Œ ๋ณด๊ธฐ์— ๋ฌธ์ œ๊ฐ€ ๊ธธ๊ณ  ๋ณต์žกํ•ด์„œ ์–ด๋ ค์›Œ ๋ณด์ผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ํ•˜์ง€๋งŒ ๋จผ์ € ๋ฌธ์ œ๋ฅผ ์ž˜ ์ดํ•ดํ–ˆ๋Š”์ง€ ๊ผญ ํ™•์ธํ•ด๋ณด๊ณ  ์ฃผ์–ด์ง„ ์กฐ๊ฑด์„ ํ™•์ธํ•ด๊ฐ€๋ฉด์„œ ์ฝ”๋”ฉํ•˜๋‹ค ๋ณด๋ฉด ์–ด๋Š์ƒˆ ์ •๋‹ต์˜ ์ฝ”๋“œ๋ฅผ ๋„์ถœํ•ด๋‚ผ ์ˆ˜ ์žˆ์„ ๊ฒƒ์ž…๋‹ˆ๋‹ค. - solved.ac ๊ณจ๋“œ 5

๋ฌธ์ œ

N×N ํฌ๊ธฐ์˜ ๊ณต๊ฐ„์— ๋ฌผ๊ณ ๊ธฐ M๋งˆ๋ฆฌ์™€ ์•„๊ธฐ ์ƒ์–ด 1๋งˆ๋ฆฌ๊ฐ€ ์žˆ๋‹ค. ๊ณต๊ฐ„์€ 1×1 ํฌ๊ธฐ์˜ ์ •์‚ฌ๊ฐํ˜• ์นธ์œผ๋กœ ๋‚˜๋ˆ„์–ด์ ธ ์žˆ๋‹ค. ํ•œ ์นธ์—๋Š” ๋ฌผ๊ณ ๊ธฐ๊ฐ€ ์ตœ๋Œ€ 1๋งˆ๋ฆฌ ์กด์žฌํ•œ๋‹ค.

์•„๊ธฐ ์ƒ์–ด์™€ ๋ฌผ๊ณ ๊ธฐ๋Š” ๋ชจ๋‘ ํฌ๊ธฐ๋ฅผ ๊ฐ€์ง€๊ณ  ์žˆ๊ณ , ์ด ํฌ๊ธฐ๋Š” ์ž์—ฐ์ˆ˜์ด๋‹ค. ๊ฐ€์žฅ ์ฒ˜์Œ์— ์•„๊ธฐ ์ƒ์–ด์˜ ํฌ๊ธฐ๋Š” 2์ด๊ณ , ์•„๊ธฐ ์ƒ์–ด๋Š” 1์ดˆ์— ์ƒํ•˜์ขŒ์šฐ๋กœ ์ธ์ ‘ํ•œ ํ•œ ์นธ์”ฉ ์ด๋™ํ•œ๋‹ค.

์•„๊ธฐ ์ƒ์–ด๋Š” ์ž์‹ ์˜ ํฌ๊ธฐ๋ณด๋‹ค ํฐ ๋ฌผ๊ณ ๊ธฐ๊ฐ€ ์žˆ๋Š” ์นธ์€ ์ง€๋‚˜๊ฐˆ ์ˆ˜ ์—†๊ณ , ๋‚˜๋จธ์ง€ ์นธ์€ ๋ชจ๋‘ ์ง€๋‚˜๊ฐˆ ์ˆ˜ ์žˆ๋‹ค. ์•„๊ธฐ ์ƒ์–ด๋Š” ์ž์‹ ์˜ ํฌ๊ธฐ๋ณด๋‹ค ์ž‘์€ ๋ฌผ๊ณ ๊ธฐ๋งŒ ๋จน์„ ์ˆ˜ ์žˆ๋‹ค. ๋”ฐ๋ผ์„œ, ํฌ๊ธฐ๊ฐ€ ๊ฐ™์€ ๋ฌผ๊ณ ๊ธฐ๋Š” ๋จน์„ ์ˆ˜ ์—†์ง€๋งŒ, ๊ทธ ๋ฌผ๊ณ ๊ธฐ๊ฐ€ ์žˆ๋Š” ์นธ์€ ์ง€๋‚˜๊ฐˆ ์ˆ˜ ์žˆ๋‹ค.

์•„๊ธฐ ์ƒ์–ด๊ฐ€ ์–ด๋””๋กœ ์ด๋™ํ• ์ง€ ๊ฒฐ์ •ํ•˜๋Š” ๋ฐฉ๋ฒ•์€ ์•„๋ž˜์™€ ๊ฐ™๋‹ค.

  • ๋” ์ด์ƒ ๋จน์„ ์ˆ˜ ์žˆ๋Š” ๋ฌผ๊ณ ๊ธฐ๊ฐ€ ๊ณต๊ฐ„์— ์—†๋‹ค๋ฉด ์•„๊ธฐ ์ƒ์–ด๋Š” ์—„๋งˆ ์ƒ์–ด์—๊ฒŒ ๋„์›€์„ ์š”์ฒญํ•œ๋‹ค.
  • ๋จน์„ ์ˆ˜ ์žˆ๋Š” ๋ฌผ๊ณ ๊ธฐ๊ฐ€ 1๋งˆ๋ฆฌ๋ผ๋ฉด, ๊ทธ ๋ฌผ๊ณ ๊ธฐ๋ฅผ ๋จน์œผ๋Ÿฌ ๊ฐ„๋‹ค.
  • ๋จน์„ ์ˆ˜ ์žˆ๋Š” ๋ฌผ๊ณ ๊ธฐ๊ฐ€ 1๋งˆ๋ฆฌ๋ณด๋‹ค ๋งŽ๋‹ค๋ฉด, ๊ฑฐ๋ฆฌ๊ฐ€ ๊ฐ€์žฅ ๊ฐ€๊นŒ์šด ๋ฌผ๊ณ ๊ธฐ๋ฅผ ๋จน์œผ๋Ÿฌ ๊ฐ„๋‹ค.
    • ๊ฑฐ๋ฆฌ๋Š” ์•„๊ธฐ ์ƒ์–ด๊ฐ€ ์žˆ๋Š” ์นธ์—์„œ ๋ฌผ๊ณ ๊ธฐ๊ฐ€ ์žˆ๋Š” ์นธ์œผ๋กœ ์ด๋™ํ•  ๋•Œ, ์ง€๋‚˜์•ผ ํ•˜๋Š” ์นธ์˜ ๊ฐœ์ˆ˜์˜ ์ตœ์†Ÿ๊ฐ’์ด๋‹ค.
    • ๊ฑฐ๋ฆฌ๊ฐ€ ๊ฐ€๊นŒ์šด ๋ฌผ๊ณ ๊ธฐ๊ฐ€ ๋งŽ๋‹ค๋ฉด, ๊ฐ€์žฅ ์œ„์— ์žˆ๋Š” ๋ฌผ๊ณ ๊ธฐ, ๊ทธ๋Ÿฌํ•œ ๋ฌผ๊ณ ๊ธฐ๊ฐ€ ์—ฌ๋Ÿฌ ๋งˆ๋ฆฌ๋ผ๋ฉด, ๊ฐ€์žฅ ์™ผ์ชฝ์— ์žˆ๋Š” ๋ฌผ๊ณ ๊ธฐ๋ฅผ ๋จน๋Š”๋‹ค.

์•„๊ธฐ ์ƒ์–ด์˜ ์ด๋™์€ 1์ดˆ ๊ฑธ๋ฆฌ๊ณ , ๋ฌผ๊ณ ๊ธฐ๋ฅผ ๋จน๋Š”๋ฐ ๊ฑธ๋ฆฌ๋Š” ์‹œ๊ฐ„์€ ์—†๋‹ค๊ณ  ๊ฐ€์ •ํ•œ๋‹ค. ์ฆ‰, ์•„๊ธฐ ์ƒ์–ด๊ฐ€ ๋จน์„ ์ˆ˜ ์žˆ๋Š” ๋ฌผ๊ณ ๊ธฐ๊ฐ€ ์žˆ๋Š” ์นธ์œผ๋กœ ์ด๋™ํ–ˆ๋‹ค๋ฉด, ์ด๋™๊ณผ ๋™์‹œ์— ๋ฌผ๊ณ ๊ธฐ๋ฅผ ๋จน๋Š”๋‹ค. ๋ฌผ๊ณ ๊ธฐ๋ฅผ ๋จน์œผ๋ฉด, ๊ทธ ์นธ์€ ๋นˆ์นธ์ด ๋œ๋‹ค.

์•„๊ธฐ ์ƒ์–ด๋Š” ์ž์‹ ์˜ ํฌ๊ธฐ์™€ ๊ฐ™์€ ์ˆ˜์˜ ๋ฌผ๊ณ ๊ธฐ๋ฅผ ๋จน์„ ๋•Œ๋งˆ๋‹ค ํฌ๊ธฐ๊ฐ€ 1 ์ฆ๊ฐ€ํ•œ๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด, ํฌ๊ธฐ๊ฐ€ 2์ธ ์•„๊ธฐ ์ƒ์–ด๋Š” ๋ฌผ๊ณ ๊ธฐ๋ฅผ 2๋งˆ๋ฆฌ ๋จน์œผ๋ฉด ํฌ๊ธฐ๊ฐ€ 3์ด ๋œ๋‹ค.

๊ณต๊ฐ„์˜ ์ƒํƒœ๊ฐ€ ์ฃผ์–ด์กŒ์„ ๋•Œ, ์•„๊ธฐ ์ƒ์–ด๊ฐ€ ๋ช‡ ์ดˆ ๋™์•ˆ ์—„๋งˆ ์ƒ์–ด์—๊ฒŒ ๋„์›€์„ ์š”์ฒญํ•˜์ง€ ์•Š๊ณ  ๋ฌผ๊ณ ๊ธฐ๋ฅผ ์žก์•„๋จน์„ ์ˆ˜ ์žˆ๋Š”์ง€ ๊ตฌํ•˜๋Š” ํ”„๋กœ๊ทธ๋žจ์„ ์ž‘์„ฑํ•˜์‹œ์˜ค.

Code

์šฐ์„  ์ „์ฒด์ ์ธ ๋…ผ๋ฆฌ๋ฅผ ์‚ดํŽด๋ด…์‹œ๋‹ค.

int main(void) {
  ios::sync_with_stdio(0);
  cin.tie(0);
  cout.tie(0);

  int N;
  cin >> N;
  vii ocean(N, vi(N, 0));
  Shark baby = placeFishTo(ocean, N);

  int time = INF;
  int total = 0;

  while (time) {
    vii mDist = calculate(ocean, N, baby);
    time = solve(ocean, mDist, N, baby);
    total += time;
  }

  cout << total << '\n';

  return 0;
}

1. ์ž…๋ ฅ

์ž…๋ ฅ์œผ๋กœ ์ฃผ์–ด์ง€๋Š” ๋ฌผ๊ณ ๊ธฐ๋“ค์˜ ์œ„์น˜๋ฅผ Shark baby = placeFishTo(ocean, N); ๋ฅผ ํ†ตํ•ด ๋งต์— ์ž…๋ ฅ๋ฐ›์Šต๋‹ˆ๋‹ค. ์ด๋•Œ ์•„๊ธฐ์ƒ์–ด์˜ ์œ„์น˜์™€ ํฌ๊ธฐ๋Š” ๊ฐ์ฒด๋กœ ๋งŒ๋“ค์–ด ๋งต(ocean)๊ณผ ๋ถ„๋ฆฌํ•ฉ๋‹ˆ๋‹ค.

Shark ๊ฐ์ฒด๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™์€ ๊ตฌ์กฐ์ฒด๋กœ ์ •์˜๋˜์–ด์žˆ์Šต๋‹ˆ๋‹ค.

struct Shark {
  int r;    // ํ–‰์„ ์˜๋ฏธํ•ฉ๋‹ˆ๋‹ค.
  int c;    // ์—ด์„ ์˜๋ฏธํ•ฉ๋‹ˆ๋‹ค.
  int size;    // ์ƒ์–ด์˜ ํฌ๊ธฐ ํ˜น์€ ์ƒ์–ด์™€์˜ ๊ฑฐ๋ฆฌ๋ฅผ ๊ธฐ๋กํ•ฉ๋‹ˆ๋‹ค.
  Shark(int r, int c, int s) {
    this->r = r;
    this->c = c;
    this->size = s;
  }
};

 

์ž…๋ ฅ ์†Œ์Šค๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค.

Shark placeFishTo(vii &ocean, int N) {
  Shark baby(0, 0, 2);

  for (int r=0; r<N; r++) {
    for (int c=0; c<N; c++) {
      cin >> ocean[r][c];
      if (ocean[r][c] == 9) {
        baby.r = r;
        baby.c = c;
        ocean[r][c] = 0;
      }
    }
  }

  return baby;
}

 

์•„๊ธฐ์ƒ์–ด์˜ ํฌ๊ธฐ๋Š” 2์ด๊ณ  ์ž…๋ ฅ ํ–‰๋ ฌ์—์„œ ์•„๊ธฐ์ƒ์–ด์˜ ์œ„์น˜๊ฐ€ 9๋กœ ํ‘œ์‹œ๋œ๋‹ค๋Š” ์กฐ๊ฑด์„ ํ™œ์šฉํ•˜์—ฌ ์•„๊ธฐ์ƒ์–ด ๊ฐ์ฒด๋ฅผ ์ƒ์„ฑํ•˜๊ณ  ๋งต์„ ์ƒ์„ฑ ํ•ฉ๋‹ˆ๋‹ค.

2. BFS ํƒ์ƒ‰

vii mDist = calculate(ocean, N, baby); ๋ฅผ ํ†ตํ•ด ์•„๊ธฐ์ƒ์–ด์˜ ํ˜„์žฌ ์œ„์น˜์—์„œ ๋ฐฉ๋ฌธํ•  ์ˆ˜ ์žˆ๋Š” ์ขŒํ‘œ๊นŒ์ง€์˜ ์ตœ๋‹จ๊ฑฐ๋ฆฌ๋ฅผ BFS๋ฅผ ํ™œ์šฉํ•˜์—ฌ ๊ณ„์‚ฐํ•ฉ๋‹ˆ๋‹ค.

vii calculate(vii &ocean, int N, Shark &baby) {
  vii visited(N, vi(N, 0));
  vii mdist(N, vi(N, -1));
  qs q;

  q.push(baby);
  visited[baby.r][baby.c] = true;
  mdist[baby.r][baby.c] = 0;

  while (!q.empty()) {
    Shark x = q.front(); q.pop();

    vs dir = {
      Shark(x.r-1, x.c, x.size), Shark(x.r, x.c-1, x.size),
      Shark(x.r+1, x.c, x.size), Shark(x.r, x.c+1, x.size)
    };

    for (Shark each : dir) {
      if (each.r<0 || each.c<0) continue;
      if (each.r>=N || each.c>=N) continue;
      if (visited[each.r][each.c]) continue;
      if (ocean[each.r][each.c] > baby.size) {
        visited[each.r][each.c] = true;
        continue;
      }
      mdist[each.r][each.c] = mdist[x.r][x.c] + 1;
      visited[each.r][each.c] = true;
      q.push(each);
    }
  }

  return mdist;
}

 

์šฐ์„  ์•„๊ธฐ์ƒ์–ด๊ฐ€ ๋งต์˜ ๋ชจ๋“  ์นธ์— ๋ฐฉ๋ฌธํ•  ์ˆ˜ ์—†๋‹ค๊ณ  ๊ฐ€์ •ํ•˜๊ณ  vii mdist(N, vi(N, -1)); ๋กœ ์ดˆ๊ธฐํ™”ํ•ฉ๋‹ˆ๋‹ค. ์•„๊ธฐ ์ƒ์–ด์˜ ํ˜„์žฌ ์œ„์น˜์™€ ํฌ๊ธฐ๊ฐ€ ๊ธฐ๋ก๋˜์–ด์žˆ๋Š” baby ๊ฐ์ฒด๋ฅผ ํ์— ๋„ฃ์Šต๋‹ˆ๋‹ค. ์•„๊ธฐ์ƒ์–ด๊ฐ€ ์ƒํ•˜์ขŒ์šฐ๋กœ ์ธ์ ‘ํ•œ ํ•œ ์นธ์”ฉ ์ด๋™ํ•  ์ˆ˜ ์žˆ๋‹ค๋Š” ์กฐ๊ฑด์„ ํ™œ์šฉํ•˜์—ฌ ์ธ์ ‘ํ•œ ์ขŒํ‘œ๋กœ ์ด๋™ํ•œ ๊ฒฝ์šฐ์˜ ์ƒ์–ด ๊ฐ์ฒด๋ฅผ ๋ฒกํ„ฐ์— ๋„ฃ์–ด๋‘” ํ›„ ์ˆœํšŒํ•˜๋ฉด์„œ ๋‹ค์Œ๊ณผ ๊ฐ™์€ ์‚ฌํ•ญ์„ ํ™•์ธํ•ฉ๋‹ˆ๋‹ค.

  1. ์ฃผ์–ด์ง„ ์ขŒํ‘œ๊ฐ€ ๋งต์˜ ๋ฒ”์œ„ ์•ˆ์— ์กด์žฌํ•˜๋Š”๊ฐ€?
  2. ์ฃผ์–ด์ง„ ์ขŒํ‘œ๊ฐ€ ์ด๋ฏธ ๋ฐฉ๋ฌธํ•œ ๊ณณ์ธ๊ฐ€?
  3. ์ฃผ์–ด์ง„ ์ขŒํ‘œ์— ์กด์žฌํ•˜๋Š” ์ƒ์–ด๊ฐ€ ์•„๊ธฐ์ƒ์–ด๋ณด๋‹ค ํฐ๊ฐ€?

์•„๊ธฐ์ƒ์–ด๊ฐ€ ๋งต ๋ฐ–์œผ๋กœ ๋‚˜๊ฐ€๋Š” ๊ฒƒ์€ ๋ถˆ๊ฐ€๋Šฅํ•˜๋ฉฐ, ์•„๊ธฐ์ƒ์–ด๊ฐ€ ๊ฐ€๋ ค๊ณ  ํ–ˆ๋˜ ์ขŒํ‘œ๊ฐ€ ์ด๋ฏธ ๋ฐฉ๋ฌธํ•œ ๊ณณ์ด์—ˆ๋‹ค๋ฉด ์ตœ๋‹จ๊ฑฐ๋ฆฌ๊ฐ€ ์•„๋‹™๋‹ˆ๋‹ค.

"์•„๊ธฐ ์ƒ์–ด๋Š” ์ž์‹ ์˜ ํฌ๊ธฐ๋ณด๋‹ค ํฐ ๋ฌผ๊ณ ๊ธฐ๊ฐ€ ์žˆ๋Š” ์นธ์€ ์ง€๋‚˜๊ฐˆ ์ˆ˜ ์—†๊ณ , ๋‚˜๋จธ์ง€ ์นธ์€ ๋ชจ๋‘ ์ง€๋‚˜๊ฐˆ ์ˆ˜ ์žˆ๋‹ค. ์•„๊ธฐ ์ƒ์–ด๋Š” ์ž์‹ ์˜ ํฌ๊ธฐ๋ณด๋‹ค ์ž‘์€ ๋ฌผ๊ณ ๊ธฐ๋งŒ ๋จน์„ ์ˆ˜ ์žˆ๋‹ค."

๋ฌธ์ œ์—์„œ ์ฃผ์–ด์ง„ ์œ„ ์กฐ๊ฑด์— ๋”ฐ๋ผ์„œ ์ฃผ์–ด์ง„ ์ขŒํ‘œ์— ์กด์žฌํ•˜๋Š” ์ƒ์–ด๊ฐ€ ์•„๊ธฐ ์ƒ์–ด๋ณด๋‹ค ํฌ๋ฉด ์ง€๋‚˜๊ฐˆ ์ˆ˜ ์—†์œผ๋ฉฐ ๊ฐ™๊ฑฐ๋‚˜ ์ž‘๋‹ค๋ฉด ์ง€๋‚˜๊ฐˆ ์ˆ˜ ์žˆ์œผ๋ฏ€๋กœ ๊ฑฐ๋ฆฌ๋ฅผ ๊ณ„์‚ฐํ•˜๊ฒŒ ๋ฉ๋‹ˆ๋‹ค. ์œ„ ์กฐ๊ฑด์— ๊ฑธ๋ฆฌ์ง€ ์•Š์œผ๋ฉด ๋ชจ๋“  ์ขŒํ‘œ๋ฅผ ๋ฐฉ๋ฌธํ•  ๋•Œ๊นŒ์ง€ ๊ฑฐ๋ฆฌ๋ฅผ 1์”ฉ ๋ˆ„์ ํ•ด๊ฐ€๋ฉฐ ์ตœ๋‹จ๊ฑฐ๋ฆฌ๋ฅผ ํƒ์ƒ‰ํ•ฉ๋‹ˆ๋‹ค. ์ดํ›„ ๊ฐฑ์‹ ๋œ ์ตœ๋‹จ๊ฑฐ๋ฆฌ ๋ฒกํ„ฐ๋ฅผ ๋ฆฌํ„ดํ•ฉ๋‹ˆ๋‹ค.

3. ์‹œ๋ฎฌ๋ ˆ์ด์…˜

time = solve(ocean, mDist, N, baby); ์„ ํ†ตํ•ด ์ฃผ์–ด์ง„ ๋งต์—์„œ ๋จน์„ ์ˆ˜ ์žˆ๋Š” ์ƒ์–ด๋ฅผ ์ˆœ์„œ์— ์•Œ๋งž๊ฒŒ ๋จน๊ณ  ์•„๊ธฐ ์ƒ์–ด์˜ ๋ชธ์ง‘์„ ํ‚ค์›๋‹ˆ๋‹ค. ๋จน์„ ์ˆ˜ ์žˆ๋Š” ์ƒ์–ด๊ฐ€ ์žˆ๋‹ค๋ฉด ๊ทธ ์ƒ์–ด๋ฅผ ๋จน๊ธฐ ์œ„ํ•ด ์ด๋™ํ•˜๋Š” ๊ฑฐ๋ฆฌ๋ฅผ ๋ฆฌํ„ดํ•˜๊ณ  ๋จน์„ ์ˆ˜ ์žˆ๋Š” ์ƒ์–ด๊ฐ€ ์—†์œผ๋ฉด 0์„ ๋ฆฌํ„ดํ•ฉ๋‹ˆ๋‹ค.

int solve(vii &ocean, vii &mdist, int N, Shark &baby) {
  pqs sharks;

  for (int i=0; i<N; i++) {
    for (int j=0; j<N; j++) {
      if (mdist[i][j]>0 && 1<=ocean[i][j] && ocean[i][j]<=baby.size) {
        Shark shark(i, j, mdist[i][j]);
        sharks.push(shark);
      }
    }
  }

  bool canEatFish = false;
  Shark minShark(0, 0, 0);

  while (!sharks.empty()) {
    Shark shark = sharks.top();
    sharks.pop();
    if (baby.size > ocean[shark.r][shark.c]) {
      canEatFish = true;
      minShark = shark;
      break;
    }
  }

  if (canEatFish) {
    baby.r = minShark.r;
    baby.c = minShark.c;

    if (baby.size > ocean[baby.r][baby.c]) {
      ate++;
      ocean[baby.r][baby.c] = 0;
    }

    if (ate >= baby.size) {
      baby.size++;
      ate = 0;
    }
  }

  return minShark.size;
}

 

๋งด์—์„œ ์ƒ์–ด๊ฐ€ ์žˆ๋Š” ์žฅ์†Œ ์ค‘ ์•„๊ธฐ์ƒ์–ด๊ฐ€ ์ง€๋‚˜๊ฐˆ ์ˆ˜ ์žˆ๋Š” ์žฅ์†Œ๋ฅผ ๊ฐ€์ค‘์น˜-ํ์— ๋‹ด์Šต๋‹ˆ๋‹ค. ๊ฐ€์ค‘์น˜-ํ์—์„œ ์ง€๋‚˜๊ฐˆ ์ˆ˜ ์žˆ๋Š” ์ƒ์–ด๋“ค์ด ์ •๋ ฌ๋˜๋Š” ์›๋ฆฌ๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค.

bool operator>(Shark a, Shark b) {
  if (a.size > b.size) {
    return true;
  } else if (a.size == b.size && a.r > b.r) {
    return true;
  } else if (a.size == b.size && a.r == b.r && a.c > b.c) {
    return true;
  }

  return false;
}

 

์•„๊ธฐ ์ƒ์–ด๋Š” ์ž์‹ ์˜ ํฌ๊ธฐ๋ณด๋‹ค ํฐ ๋ฌผ๊ณ ๊ธฐ๊ฐ€ ์žˆ๋Š” ์นธ์€ ์ง€๋‚˜๊ฐˆ ์ˆ˜ ์—†๊ณ , ๋‚˜๋จธ์ง€ ์นธ์€ ๋ชจ๋‘ ์ง€๋‚˜๊ฐˆ ์ˆ˜ ์žˆ๋‹ค.
๋จน์„ ์ˆ˜ ์žˆ๋Š” ๋ฌผ๊ณ ๊ธฐ๊ฐ€ 1๋งˆ๋ฆฌ๋ณด๋‹ค ๋งŽ๋‹ค๋ฉด, ๊ฑฐ๋ฆฌ๊ฐ€ ๊ฐ€์žฅ ๊ฐ€๊นŒ์šด ๋ฌผ๊ณ ๊ธฐ๋ฅผ ๋จน์œผ๋Ÿฌ ๊ฐ„๋‹ค.
๊ฑฐ๋ฆฌ๊ฐ€ ๊ฐ€๊นŒ์šด ๋ฌผ๊ณ ๊ธฐ๊ฐ€ ๋งŽ๋‹ค๋ฉด, ๊ฐ€์žฅ ์œ„์— ์žˆ๋Š” ๋ฌผ๊ณ ๊ธฐ, ๊ทธ๋Ÿฌํ•œ ๋ฌผ๊ณ ๊ธฐ๊ฐ€ ์—ฌ๋Ÿฌ ๋งˆ๋ฆฌ๋ผ๋ฉด, ๊ฐ€์žฅ ์™ผ์ชฝ์— ์žˆ๋Š” ๋ฌผ๊ณ ๊ธฐ๋ฅผ ๋จน๋Š”๋‹ค.

์•„๊ธฐ์ƒ์–ด๊ฐ€ ์–ด๋Š ์ขŒํ‘œ๋ฅผ ์ง€๋‚˜๊ฐˆ ์ˆ˜ ์žˆ๋Š”์ง€, ์–ด๋Š ์ƒ์–ด๋ฅผ ๋จน์„ ์ˆ˜ ์žˆ๋Š”์ง€ ํ˜น์€ ๋จน์œผ๋ ค๋Š” ์ƒ์–ด์˜ ์ˆœ์„œ๋ฅผ ๊ณ ๋ คํ•  ๋•Œ ์œ„์™€ ๊ฐ™์€ ๋ฌธ์ œ์˜ ์กฐ๊ฑด์„ ํ™œ์šฉํ•ฉ๋‹ˆ๋‹ค. ์ตœ์šฐ์„ ์ ์œผ๋กœ๋Š” ์•„๊ธฐ์ƒ์–ด๊ฐ€ ๋ฐฉ๋ฌธํ•  ์ˆ˜ ์žˆ๋Š” ์ง€์—ญ์ค‘์—์„œ ์ƒ์–ด๊ฐ€ ์กด์žฌํ•˜๋Š” ๊ณณ์„ ์‚ดํŽด๋ด…๋‹ˆ๋‹ค. ์•„๊ธฐ์ƒ์–ด์™€ ์–ด๋Š ์ขŒํ‘œ์˜ ์ƒ์–ด์™€์˜ ํฌ๊ธฐ๋ฅผ ๋น„๊ตํ–ˆ์„๋•Œ ๊ฐ™๊ฑฐ๋‚˜ ์ž‘์€ ๊ฒฝ์šฐ๊ฐ€ ์•„๊ธฐ์ƒ์–ด๊ฐ€ ๋จน์„ ์ˆ˜ ์žˆ๋Š” ์ƒ์–ด๋“ค์˜ ๋ฆฌ์ŠคํŠธ๋ฅผ ์ž‘์„ฑํ•˜๋Š”๋ฐ ํ•„์š”ํ•œ ์กฐ๊ฑด์ž…๋‹ˆ๋‹ค. ์•„๊ธฐ์ƒ์–ด๋Š” ๊ฐ€์žฅ ๊ฐ€๊นŒ์šด ๊ฑฐ๋ฆฌ์— ์žˆ๋Š” ์ƒ์–ด๋ฅผ ๋จน์œผ๋Ÿฌ ๊ฐ€์ง€๋งŒ ๊ทธ๋Ÿฌํ•œ ๋ฌผ๊ณ ๊ธฐ๊ฐ€ ์—ฌ๋Ÿฌ ๋งˆ๋ฆฌ๋ผ๋ฉด ๊ฐ€์žฅ ์œ„์ชฝ ํ–‰์— ์žˆ๋Š” ์ƒ์–ด๋ฅผ ์šฐ์„ ์ ์œผ๋กœ ๋จน๊ณ , ๊ทธ๋งˆ์ €๋„ ๊ฐ™๋‹ค๋ฉด ๊ฐ€์žฅ ์™ผ์ชฝ ์—ด์— ์žˆ๋Š” ์ƒ์–ด๋ฅผ ๋จน์œผ๋Ÿฌ ๊ฐˆ ์ˆ˜ ์žˆ๋„๋ก ์—ฐ์‚ฐ์ž ์˜ค๋ฒ„๋กœ๋”ฉ์„ ํ†ตํ•ด ๊ฐ€์ค‘์น˜-ํ์—์„œ ์ •๋ ฌ๋˜๊ฒŒ ๋งŒ๋“ญ๋‹ˆ๋‹ค.

์•„๊ธฐ ์ƒ์–ด๋Š” ์ž์‹ ์˜ ํฌ๊ธฐ๋ณด๋‹ค ์ž‘์€ ๋ฌผ๊ณ ๊ธฐ๋งŒ ๋จน์„ ์ˆ˜ ์žˆ๋‹ค.
์•„๊ธฐ ์ƒ์–ด๋Š” ์ž์‹ ์˜ ํฌ๊ธฐ์™€ ๊ฐ™์€ ์ˆ˜์˜ ๋ฌผ๊ณ ๊ธฐ๋ฅผ ๋จน์„ ๋•Œ๋งˆ๋‹ค ํฌ๊ธฐ๊ฐ€ 1 ์ฆ๊ฐ€ํ•œ๋‹ค.

๊ฐ€์ค‘์น˜ ํ์— ๋‹ด๊ธด ์ƒ์–ด๋“ค ์ค‘์—๋Š” ์•„๊ธฐ ์ƒ์–ด์™€ ํฌ๊ธฐ ๊ฐ™์•„์„œ ๋จน์„ ์ˆ˜ ์—†๋Š” ์ƒ์–ด๋“ค๋„ ์žˆ๊ณ  ํฌ๊ธฐ๊ฐ€ ์ž‘์•„์„œ ๋จน์„ ์ˆ˜ ์žˆ๋Š” ์ƒ์–ด๋„ ์„ž์—ฌ์žˆ์Šต๋‹ˆ๋‹ค. ์ฆ‰, ํŠน์ •ํ•œ ๊ฒฝ์šฐ์—” ๋งต์—์„œ ์•„๊ธฐ์ƒ์–ด์™€ ํฌ๊ธฐ๊ฐ€ ๊ฐ™์€ ์ƒ์–ด๋“ค๋งŒ ๋‚จ๋Š”๋‹ค๋ฉด ์•Œ๊ณ ๋ฆฌ์ฆ˜์˜ ์œ ํ•œ์„ฑ์„ ๋งŒ์กฑ์‹œํ‚ฌ ์ˆ˜ ์—†๋Š” ์ƒํ™ฉ์ด ๋ฐœ์ƒํ•  ์ˆ˜ ์žˆ๋‹ค๋Š” ์ ์ž…๋‹ˆ๋‹ค. ์ด๋Ÿฌํ•œ ๋ฌธ์ œ์ ์„ ํ•ด๊ฒฐํ•˜๊ธฐ ์œ„ํ•ด ๋„์ž…๋œ ๊ฐœ๋…์ด bool canEatFish = false; ์ž…๋‹ˆ๋‹ค. ์•„๊ธฐ์ƒ์–ด๊ฐ€ ์ง€๋‚˜๊ฐˆ ์ˆ˜ ์žˆ๋Š” ์ƒ์–ด๊ฐ€ ๋‹ด๊ธด ๊ฐ€์ค‘์น˜-ํ์—์„œ ์ƒ์–ด๋ฅผ ํ•˜๋‚˜์”ฉ ๊บผ๋‚ด๋ณด๋ฉด์„œ ์•„๊ธฐ์ƒ์–ด๊ฐ€ ๋จน์„ ์ˆ˜ ์žˆ๋Š”์ง€ ํ™•์ธํ•ฉ๋‹ˆ๋‹ค. ๋งŒ์•ฝ ์•„๊ธฐ์ƒ์–ด๊ฐ€ ๋จน์„ ์ˆ˜ ์žˆ๋Š” ์ƒ์–ด๊ฐ€ ์ฒ˜์Œ์œผ๋กœ ๋“ฑ์žฅํ•œ๋‹ค๋ฉด ๊ทธ ์ƒ์–ด๋Š” ์•„๊ธฐ์ƒ์–ด๊ฐ€ ๋จน์„ ์ˆ˜ ์žˆ๋Š” ์ƒ์–ด๋“ค ์ค‘์— ์ตœ์šฐ์„ ์ ์œผ๋กœ ๋จน์–ด์•ผ ํ•˜๋Š” ์ƒ์–ด๊ฐ€ ๋˜๋ฉฐ minShark ๊ฐ์ฒด๋กœ ์ €์žฅ๋ฉ๋‹ˆ๋‹ค. ๋˜ํ•œ canEatFish ๋ณ€์ˆ˜๊ฐ€ ์ฐธ๊ฐ’์œผ๋กœ ๋ฐ”๋€Œ์–ด ์•„๊ธฐ์ƒ์–ด๊ฐ€ ์„ฑ์žฅํ•  ์ˆ˜ ์žˆ๋Š”์ง€ ๊ณ ๋ คํ•  ์ˆ˜ ์žˆ๊ฒŒ๋ฉ๋‹ˆ๋‹ค. ์•„๊ธฐ์ƒ์–ด๊ฐ€ ๋ช‡ ๋งˆ๋ฆฌ๋ฅผ ๋จน์—ˆ๋Š”์ง€๋Š” ์ „์—ญ ๋ณ€์ˆ˜์ธ ate ์— ๊ธฐ๋ก๋˜๊ณ  ์•„๊ธฐ์ƒ์–ด์˜ ํ˜„์žฌ ํฌ๊ธฐ์™€ ๊ฐ™์€ ์ˆ˜์˜ ๋ฌผ๊ณ ๊ธฐ๋ฅผ ๋จน์„ ๋•Œ๋งˆ๋‹ค 1์”ฉ ์ฆ๊ฐ€์‹œํ‚ค๊ฒŒ ๋ฉ๋‹ˆ๋‹ค.

์ •๋ฆฌํ•˜์ž๋ฉด canEatFish๊ฐ€ ์ฐธ์ด ๋˜์–ด์„œ minShark์— ์ƒˆ๋กœ์šด ์ขŒํ‘œ, ์•„๊ธฐ์ƒ์–ด์™€์˜ ์ตœ๋‹จ๊ฑฐ๋ฆฌ ๊ฐ’์ด ๋‹ด๊ธฐ๊ฒŒ ๋œ๋‹ค๋ฉด ์ตœ๋‹จ๊ฑฐ๋ฆฌ๋ฅผ ๋ฆฌํ„ด ํ•˜์ง€๋งŒ canEatFish๊ฐ€ ๊ฑฐ์ง“์ด์–ด์„œ ๋จน์„ ์ˆ˜ ์žˆ๋Š” ์ƒ์–ด๊ฐ€ ์—†๋‹ค๋ฉด minShark์˜ ๊ธฐ๋ณธ ๊ฑฐ๋ฆฌ ๊ฐ’์ธ 0์ด ๋ฆฌํ„ด๋˜๊ณ  main ํ•จ์ˆ˜์— ์ด ๊ฐ’์„ ์ฐธ์กฐํ•˜์—ฌ ๋ฐ˜๋ณต๋ฌธ์„ ๋Œ๋ฆฌ๋Š” ๋ถ€๋ถ„์ด ๋™์ž‘ํ•˜๊ฒŒ ๋ฉ๋‹ˆ๋‹ค.

4. ์ถœ๋ ฅ

์•„๊ธฐ ์ƒ์–ด๊ฐ€ ๋จน์„ ์ˆ˜ ์žˆ๋Š” ๋ชจ๋“  ์ƒ์–ด๋ฅผ ์žก์•„๋จน์„ ๋•Œ๊นŒ์ง€ ์ด๋™ํ•˜๋Š” ๊ฑฐ๋ฆฌ๋ฅผ int total = 0; ์— ๋ˆ„์ ํ•˜๊ณ  cout << total << '\n'; ๊ฒฐ๊ณผ๋ฌผ์„ ์ถœ๋ ฅํ•ฉ๋‹ˆ๋‹ค.

๊ตํ›ˆ

๋ฌธ์ œ๋ฅผ ์ž˜ ์ฝ๊ณ  ์ดํ•ดํ•˜๋Š” ๊ฒƒ๋„ ๋Šฅ๋ ฅ์ž…๋‹ˆ๋‹ค. ('20.08.23)

์ „์ฒด ์ฝ”๋“œ

#include <bits/stdc++.h>
using namespace std;

struct Shark {
  int r;
  int c;
  int size;
  Shark(int r, int c, int s) {
    this->r = r;
    this->c = c;
    this->size = s;
  }
};

bool operator>(Shark a, Shark b) {
  if (a.size > b.size) {
    return true;
  } else if (a.size == b.size && a.r > b.r) {
    return true;
  } else if (a.size == b.size && a.r == b.r && a.c > b.c) {
    return true;
  }

  return false;
}

typedef vector<int> vi;
typedef vector<vi> vii;
typedef vector<Shark> vs;
typedef queue<Shark> qs;
typedef priority_queue<Shark, vs, greater<Shark> > pqs;

const int INF = 987654321;
int ate = 0;

vii calculate(vii &ocean, int N, Shark &baby) {
  vii visited(N, vi(N, 0));
  vii mdist(N, vi(N, -1));
  qs q;

  q.push(baby);
  visited[baby.r][baby.c] = true;
  mdist[baby.r][baby.c] = 0;

  while (!q.empty()) {
    Shark x = q.front(); q.pop();
    
    vs dir = {
      Shark(x.r-1, x.c, x.size), Shark(x.r, x.c-1, x.size),
      Shark(x.r+1, x.c, x.size), Shark(x.r, x.c+1, x.size)
    };

    for (Shark each : dir) {
      if (each.r<0 || each.c<0) continue;
      if (each.r>=N || each.c>=N) continue;
      if (visited[each.r][each.c]) continue;
      if (ocean[each.r][each.c] > baby.size) {
        visited[each.r][each.c] = true;
        continue;
      }
      mdist[each.r][each.c] = mdist[x.r][x.c] + 1;
      visited[each.r][each.c] = true;
      q.push(each);
    }
  }

  return mdist;
}

int solve(vii &ocean, vii &mdist, int N, Shark &baby) {
  pqs sharks;

  for (int i=0; i<N; i++) {
    for (int j=0; j<N; j++) {
      if (mdist[i][j]>0 && 1<=ocean[i][j] && ocean[i][j]<=baby.size) {
        Shark shark(i, j, mdist[i][j]);
        sharks.push(shark);
      }
    }
  }

  bool canEatFish = false;
  Shark minShark(0, 0, 0);

  while (!sharks.empty()) {
    Shark shark = sharks.top();
    sharks.pop();
    if (baby.size > ocean[shark.r][shark.c]) {
      canEatFish = true;
      minShark = shark;
      break;
    }
  }

  if (canEatFish) {
    baby.r = minShark.r;
    baby.c = minShark.c;

    if (baby.size > ocean[baby.r][baby.c]) {
      ate++;
      ocean[baby.r][baby.c] = 0;
    }

    if (ate >= baby.size) {
      baby.size++;
      ate = 0;
    }
  }

  return minShark.size;
}

Shark placeFishTo(vii &ocean, int N) {
  Shark baby(0, 0, 2);

  for (int r=0; r<N; r++) {
    for (int c=0; c<N; c++) {
      cin >> ocean[r][c];
      if (ocean[r][c] == 9) {
        baby.r = r;
        baby.c = c;
        ocean[r][c] = 0;
      }
    }
  }

  return baby;
}

int main(void) {
  ios::sync_with_stdio(0);
  cin.tie(0);
  cout.tie(0);

  int N;
  cin >> N;
  vii ocean(N, vi(N, 0));
  Shark baby = placeFishTo(ocean, N);

  int time = INF;
  int total = 0;
  
  while (time) {
    vii mDist = calculate(ocean, N, baby);
    time = solve(ocean, mDist, N, baby);
    total += time;
  }
  
  cout << total << '\n';
  
  return 0;
}

 

๋ฐ˜์‘ํ˜•