๋ฒฝ ๋ถ€์ˆ˜๊ณ  ์ด๋™ํ•˜๊ธฐ #2206

๊ณจ๋“œ3

๋ฌธ์ œ ์ดํ•ด

  • N x M ํฌ๊ธฐ์˜ ๊ทธ๋ฆฌ๋“œ์— ํ†ต๊ณผํ•  ์ˆ˜ ์žˆ๋Š” ๊ณต๊ฐ„ (0)๊ณผ ํ†ต๊ณผํ•  ์ˆ˜ ์—†๋Š” ๋ฒฝ(1)์ด ์ฃผ์–ด์ง„๋‹ค
  • (0,0)์—์„œ (N-1, M-1)๊นŒ์ง€ ์ด๋™ํ•˜๋Š” ์ตœ๋‹จ๊ฑฐ๋ฆฌ๋ฅผ ๊ตฌํ•œ๋‹ค
    • ๋‹จ, ๋ฒฝ์€ ์ตœ๋Œ€ ํ•˜๋‚˜๊นŒ์ง€ ๋ถ€์ˆ˜๊ณ  ์ด๋™ํ•  ์ˆ˜ ์žˆ๋‹ค

ํ•ด๊ฒฐ ๋ฐฉ์•ˆ

1. Node ํด๋ž˜์Šค ์ •์˜

ํ์— ์ถ”๊ฐ€๋  Node ํด๋ž˜์Šค๋ฅผ ์ •์˜ํ•œ๋‹ค. Node ํด๋ž˜์Šค๋Š” ๋‹ค์Œ์˜ ํ•„๋“œ๋ฅผ ๊ฐ–๋Š”๋‹ค

  • int y, int x
  • int dist : ํ˜„์žฌ๊นŒ์ง€์˜ ๊ฑฐ๋ฆฌ
  • boolean brokeWall : ์—ฌํƒœ 1๊ฐœ์˜ ๋ฒฝ์„ ๋ถ€์‰ˆ๋Š”์ง€ ์—ฌ๋ถ€

2. ๋ฐฉ๋ฌธ ์—ฌ๋ถ€ ํ™•์ธ

์šฐ์„  BFS์˜ ๊ธฐ๋ณธ์ธ, ์‚ฌ๋ฐฉํƒ์ƒ‰์„ ํ†ตํ•ด ๋‹ค์Œ์œผ๋กœ ๋ฐฉ๋ฌธํ•˜๋ ค๋Š” ๋…ธ๋“œ๊ฐ€ ์ด๋ฏธ ๋ฐฉ๋ฌธ๋˜์—ˆ๋Š”์ง€ ์—ฌ๋ถ€๋ฅผ ์ฒดํฌํ•ด์•ผ ํ•œ๋‹ค. ์ด๋ฅผ ์œ„ํ•ด visited ๋ฐฐ์—ด์„ ๊ด€๋ฆฌํ•  ๊ฒƒ์ธ๋ฐ, ๋ฒฝ์„ ๋ถ€์ˆ˜๊ณ  ๋ฐฉ๋ฌธํ•œ ๊ฒฝ์šฐ์™€, ๋ฒฝ์„ ๋ถ€์ˆ˜์ง€ ์•Š๊ณ  ๋ฐฉ๋ฌธํ•œ ๊ฒฝ์šฐ์˜ ๊ฒฝ๋กœ๊ฐ€ ๊ฐ๊ฐ ๋‹ค๋ฅด๊ธฐ ๋•Œ๋ฌธ์— ๊ตฌ๋ถ„ํ•ด์„œ ์ €์žฅํ•ด์•ผ ํ•œ๋‹ค.

int[][][] visited = new int[N][M][2];

// ๋ฒฝ์„ ํ•œ ๋ฒˆ๋„ ๋ถ€์ˆ˜์ง€ ์•Š๊ณ  ์˜จ ๊ฒฝ๋กœ๋กœ ํ˜„์žฌ ๋…ธ๋“œ๋ฅผ ๋ฐฉ๋ฌธํ•œ๋‹ค
visited[ny][nx][0] = 1; 

// ๋ฒฝ์„ ํ•œ ๋ฒˆ ๋ถ€์ˆ˜๊ณ  ์˜จ ๊ฒฝ๋กœ๋กœ ํ˜„์žฌ ๋…ธ๋“œ๋ฅผ ๋ฐฉ๋ฌธํ•œ๋‹ค.
visited[ny][nx][1] = 1; 

3. ๊ทธ๋Ÿผ ์–ธ์ œ ๋‹ค์Œ ๋…ธ๋“œ๋ฅผ ๋ฐฉ๋ฌธํ•˜๋Š”๊ฐ€?

๋‹ค์Œ ๋…ธ๋“œ๋ฅผ ๋ฐฉ๋ฌธํ•˜๋ ค๋ฉด ๊ผญ ํ•„์š”ํ•œ ๊ณตํ†ต ์กฐ๊ฑด์€ ๋ฐฉ๋ฌธ๋œ ์  ์—†๋Š” ๋…ธ๋“œ์—ฌ์•ผ ํ•˜๋Š” ๊ฒƒ์ด๋‹ค.

์œ„์—์„œ visited์„ 3์ฐจ ๋ฐฐ์—ด๋กœ ๊ตฌํ˜„ํ•œ ๊ฒƒ์—์„œ ์•Œ ์ˆ˜ ์žˆ๋“ฏ์ด, ๋…ธ๋“œ ํด๋ž˜์Šค์˜ brokeWall ๋ณ€์ˆ˜๋ฅผ ํ™œ์šฉํ•ด์„œ ์—ฌํƒœ ๋ฒฝ์„ ๋ถ€์‰ˆ๋Š”์ง€ ํ™•์ธํ•˜๊ณ , ํ•ด๋‹น ์ƒํƒœ(๋ฒฝ ๋ถ€์‰ˆ๋Š”์ง€ ์—ฌ๋ถ€)์— ๋Œ€ํ•œ ๋ฐฉ๋ฌธ ์—ฌ๋ถ€๋ฅผ ํ™•์ธํ•ด์•ผ ํ•œ๋‹ค.

brokeWall==true, ์ฆ‰ ์ด๋ฏธ ๋ฒฝ์„ ๋ถ€์ˆœ ์ƒํƒœ๋ผ๋ฉด visited[ny][nx][1]์˜ ๋ฐฉ๋ฌธ์—ฌ๋ถ€๋ฅผ ํ™•์ธํ•˜๊ณ  ์—…๋ฐ์ดํŠธํ•ด์•ผ ํ•œ๋‹ค.

์ด ์กฐ๊ฑด๊ณผ ํ•จ๊ป˜, ๋‹ค์Œ ์„ธ๊ฐ€์ง€ ์กฐ๊ฑด ์ค‘ ํ•˜๋‚˜๋ฅผ ๋งŒ์กฑํ•˜๋Š”์ง€ ํ™•์ธํ•ด์•ผ ํ•œ๋‹ค.

์ด๋ฏธ ๋ฒฝ์„ ๋ถ€์‰ˆ๊ณ , ๋‹ค์Œ์œผ๋กœ ๋ฐฉ๋ฌธํ•  ๋…ธ๋“œ๋„ ๋ฒฝ์ด๋ฉด ์ตœ๋Œ€ 1๊ฐœ์˜ ๋ฒฝ๋งŒ ๋ถ€์ˆ  ์ˆ˜ ์žˆ๋‹ค๋Š” ๋ฌธ์ œ์˜ ์กฐ๊ฑด์„ ๋งŒ์กฑํ•  ์ˆ˜ ์—†๊ธฐ ๋•Œ๋ฌธ์— ํŒจ์Šคํ•œ๋‹ค.

3-1. ์ด๋ฏธ ๋ฒฝ์„ ๋ถ€์‰ˆ๊ณ , ๋‹ค์Œ ๋…ธ๋“œ๋Š” ๋ฒฝ์ด ์—†์„ ๋•Œ

  • ๋ฒฝ์„ ์ด๋ฏธ ๋ถ€์‰ˆ๋‹ค => current.brokeWall
  • ๋‹ค์Œ ๋…ธ๋“œ๋Š” ๋ฒฝ์ด ์—†๋‹ค => grid[ny][nx]==0
  • ๋‹ค์Œ ๋…ธ๋“œ๋ฅผ ํ˜„์žฌ ์ƒํƒœ (๋ฒฝ์„ ๋ถ€์ˆœ ์ƒํƒœ)๋กœ ๋ฐฉ๋ฌธํ•œ ์ ์ด ์—†๋‹ค => visited[ny][nx][1]==0
if (current.brokeWall && grid[ny][nx] == 0 && visited[ny][nx][1] == 0) {
     queue.add(new Node(ny, nx, current.dist + 1, true));
     visited[ny][nx][1] = 1;
} 

3-2. ๋ฒฝ์„ ๋ถ€์ˆ˜์ง€ ์•Š์•˜๊ณ , ๋‹ค์Œ ๋…ธ๋“œ๋„ ๋ฒฝ์ด ์—†์„ ๋•Œ

  • ๋ฒฝ์„ ๋ถ€์ˆ˜์ง€ ์•Š์•˜๋‹ค => !current.brokeWall
  • ๋‹ค์Œ ๋…ธ๋“œ๋Š” ๋ฒฝ์ด ์—†๋‹ค => grid[ny][nx]==0
  • ๋‹ค์Œ ๋…ธ๋“œ๋ฅผ ํ˜„์žฌ ์ƒํƒœ (๋ฒฝ์„ ๋ถ€์ˆ˜์ง€ ์•Š์€ ์ƒํƒœ)๋กœ ๋ฐฉ๋ฌธํ•œ ์ ์ด ์—†๋‹ค => visited[ny][nx][0]==0
if (!current.brokeWall && grid[ny][nx] == 0 && visited[ny][nx][0] == 0) {
      queue.add(new Node(ny, nx, current.dist + 1, false));
      visited[ny][nx][0] = 1;
}

3-3. ๋ฒฝ์„ ๋ถ€์ˆ˜์ง€ ์•Š์•˜๊ณ , ๋‹ค์Œ ๋…ธ๋“œ๊ฐ€ ๋ฒฝ์ผ ๋•Œ

  • ๋ฒฝ์„ ๋ถ€์ˆ˜์ง€ ์•Š์•˜๋‹ค => !current.brokeWall
  • ๋‹ค์Œ ๋…ธ๋“œ๋Š” ๋ฒฝ์ด๋‹ค => grid[ny][nx]==1
  • ๋‹ค์Œ ๋…ธ๋“œ๋ฅผ ํ˜„์žฌ ์ƒํƒœ (๋ฒฝ์„ ๋ถ€์ˆ˜์ง€ ์•Š์€ ์ƒํƒœ)๋กœ ๋ฐฉ๋ฌธํ•œ ์ ์ด ์—†๋‹ค => visited[ny][nx][1]==0
if (!current.brokeWall && grid[ny][nx] == 1 && visited[ny][nx][1] == 0) {
    queue.add(new Node(ny, nx, current.dist + 1, true));
    visited[ny][nx][1] = 1;
}

์ฝ”๋“œ ์„ค๋ช…

๋ฒฝ ๋ถ€์ˆ˜๊ณ  ์ด๋™ํ•˜๊ธฐ ๋ฐฑ์ค€ #2206 ํ’€์ด ์ฝ”๋“œ

์‚ฝ์งˆ

์ด๋ฒˆ ์‚ฝ์งˆ์˜ ๊ฐ€์žฅ ์น˜๋ช…์ ์ธ ์ ์€ distance๋ฅผ ๋ฐฐ์—ด๋กœ ๊ด€๋ฆฌํ•˜๊ฒ ๋‹ค๋Š” ํ‹€์— ๋ฐ•ํžŒ ์‚ฌ๊ณ ์˜€๋‹ค. ๋ฐฉ๋ฌธ์—ฌ๋ถ€์™€ distance๋ฅผ ํ•˜๋‚˜์˜ ๋ฐฐ์—ด๋กœ ๊ด€๋ฆฌํ•˜๋Š” ์ฝ”๋“œ์˜ ๋‹จ์ ์„ ๋ผˆ์ €๋ฆฌ๊ฒŒ ๋А๊ผˆ๋‹ค.

๋ฐฉ๋ฌธํ–ˆ๋Š”์ง€,

๋ณด์™„์ 

์ด๋ฒˆ์—๋Š” ny, nx ์ธ๋ฑ์Šค ๊ฐ’์ด ๊ทธ๋ฆฌ๋“œ์˜ ์ธ๋ฑ์Šค ๋ฒ”์œ„๋ฅผ ๋ฒ—์–ด๋‚˜๋ฉด continueํ•˜๋„๋ก ๊ตฌ์กฐ๋ฅผ ๋ฐ”๊ฟ”๋ดค๋‹ค.

์›๋ž˜๋Š” ๋ฒ”์œ„ ๊ฐ’ ๋‚ด๋ฉด ์ฝ”๋“œ๋ฅผ ์ˆ˜ํ–‰ํ•˜๋Š” ๋ฐฉ์‹์œผ๋กœ ์ฝ”๋“œ๋ฅผ ์งฐ์—ˆ๋Š”๋ฐ, ์š” ๋ฐฉ๋ฒ•์ด ์ฝ”๋“œ์˜ ๊ฐ€๋…์„ฑ์— ๋” ๋„์›€์ด ๋˜๋Š” ๊ฒƒ ๊ฐ™๋‹ค.


ํ•˜๋…ธ์ด ํƒ‘์— ๋Œ€ํ•˜์—ฌ

[Gold V] ํ•˜๋…ธ์ด ํƒ‘ ์ด๋™ ์ˆœ์„œ #11729
[Gold V] ํ•˜๋…ธ์ด ํƒ‘ #1914

๊ฐœ๋… ์ดํ•ด

ํ•˜๋…ธ์ด ํƒ‘์€ ๋Œ€ํ‘œ์ ์ธ ์žฌ๊ท€ ์•Œ๊ณ ๋ฆฌ์ฆ˜ ๋ฌธ์ œ์ธ๋ฐ, ์˜ค๋Š˜ ์ฒซ ๋งŒ๋‚จ์„ ์น˜๋ค˜๋‹ค.

  1. ํ•œ ๋ฒˆ์— ํ•œ ๊ฐœ์˜ ์›ํŒ๋งŒ์„ ๋‹ค๋ฅธ ํƒ‘์œผ๋กœ ์˜ฎ๊ธธ ์ˆ˜ ์žˆ๋‹ค
  2. ์Œ“์•„ ๋†“์€ ์›ํŒ์€ ํ•ญ์ƒ ์œ„์˜ ๊ฒƒ์ด ์•„๋ž˜์˜ ๊ฒƒ๋ณด๋‹ค ์ž‘์•„์•ผ ํ•œ๋‹ค

์œ„์˜ ๋‘๊ฐ€์ง€ ์กฐ๊ฑด์„ ๋งŒ์กฑํ•˜๋ฉด์„œ ์ฒซ ํƒ‘์— ์žˆ๋Š” n๊ฐœ์˜ ์›ํŒ๋“ค์„ ๋ชจ๋‘ ์„ธ๋ฒˆ์งธ ํƒ‘์œผ๋กœ ์˜ฎ๊ฒจ์•ผ ํ•œ๋‹ค. ๋‘๋ฒˆ์งธ ํƒ‘์€ ๋ณด์กฐ ํƒ‘์œผ๋กœ ์‚ฌ์šฉํ•˜๋ฉด ๋œ๋‹ค.

ํ•˜๋…ธ์ดํƒ‘์˜ ์ด๋™์„ ์ œ๋Œ€๋กœ ์ดํ•ดํ•ด๋ณด์ž

์•„์ง ์›ํŒ์ด 2๊ฐœ ์ด์ƒ ์žˆ๋Š” ๊ฒฝ์šฐ์—๋Š” ์›ํŒ์„ ๋‹คํšŒ ์ด๋™ํ•ด์•ผ ํ•œ๋‹ค.

3๊ฐœ์˜ ์›ํŒ์œผ๋กœ ์˜ˆ์‹œ๋ฅผ ๋“ค์–ด๋ณด์ž

  -
 ---
-----
  A      B      C

์‹œ์ž‘์—๋Š” A ์œ„์น˜์— ์›ํŒ 3๊ฐœ ๋ชจ๋‘ ๋น„์น˜๋˜์–ด์žˆ๊ณ , ์šฐ๋ฆฌ์˜ ๋ชฉํ‘œ๋Š” ๋ชฉ์ ์ง€์ธ C์— 3๊ฐœ์˜ ์›ํŒ์„ ๋ชจ๋‘ ์ด๋™์‹œํ‚ค๋Š” ๊ฒƒ์ด๋‹ค.

๊ธธ์ด 1์˜ ์›ํŒ์„ 1๋ฒˆ ์›ํŒ, ๊ธธ์ด 3์˜ ์›ํŒ์„ 2๋ฒˆ ์›ํŒ, ๊ธธ์ด 5์˜ ์›ํŒ์„ 3๋ฒˆ ์›ํŒ์ด๋ผ ๊ฐ€์ •ํ•˜์ž.

3๋ฒˆ ์›ํŒ๋ถ€ํ„ฐ ์ฐจ๋ก€๋กœ C์— ๋„๋‹ฌํ•ด์•ผ ๋˜๊ธฐ ๋•Œ๋ฌธ์— 1๋ฒˆ๊ณผ 2๋ฒˆ ์›ํŒ์€ B์— ์œ„์น˜ํ•ด์•ผ ํ•œ๋‹ค๋Š” ๊ฒƒ์„ ์•Œ ์ˆ˜ ์žˆ๋‹ค. 2๋ฒˆ ์›ํŒ์ด B์— ์žˆ์–ด์•ผ 1๋ฒˆ ์›ํŒ์„ ๊ทธ ์œ„์— ์Œ“์„ ์ˆ˜ ์žˆ๊ธฐ ๋•Œ๋ฌธ์— 1๋ฒˆ ์›ํŒ์„ ์ด๋™ํ•˜๋Š” ์‹œ์ ์—๋Š” B๊ฐ€ ๋น„์–ด์žˆ์–ด์•ผ ํ•œ๋‹ค. ๊ทธ๋ž˜์„œ ์šฐ๋ฆฌ๋Š” 1๋ฒˆ ์›ํƒ‘์„ C๋กœ ์ด๋™์‹œํ‚จ๋‹ค.

 ---
-----           -
  A      B      C

๊ทธ ๋‹ค์Œ 2๋ฒˆ ์›ํƒ‘์„ ์›€์ง์ผ ์ˆ˜ ์žˆ์œผ๋‹ˆ B๋กœ ์ด๋™์‹œํ‚จ๋‹ค.

-----   ---     -
  A      B      C

์ด์ œ 3๋ฒˆ ์›ํŒ์„ C๋กœ ์ด๋™์‹œ์ผœ์•ผ ํ•˜๋‹ˆ C์— ์žˆ๋Š” 1๋ฒˆ ์›ํŒ์„ B๋กœ ์ด๋™ ์‹œํ‚ค์ž. B์— ์žˆ๋Š” 2๋ฒˆ ์›ํŒ๋ณด๋‹ค 1๋ฒˆ ์›ํŒ์˜ ๊ธธ์ด๊ฐ€ ๋” ์งง์œผ๋‹ˆ 2๋ฒˆ ์œ„์— ์˜ฌ๋ฆด ์ˆ˜ ์žˆ๋‹ค.

	     -
-----   ---
  A      B      C

์ด์ œ A์— ์žˆ๋Š” 3๋ฒˆ ์›ํŒ์„ ์›€์ง์ผ ์ˆ˜ ์žˆ๋‹ค. C๋กœ ์ด๋™ ์‹œํ‚ค์ž.

	     -
        ---   -----
  A      B      C

B์— ์žˆ๋Š” 1๋ฒˆ๊ณผ 2๋ฒˆ ์›ํŒ๋„ C๋กœ ์˜ฎ๊ฒจ์ฃผ๋ ค๋ฉด 2๋ฒˆ ์›ํŒ๋ถ€ํ„ฐ 3๋ฒˆ ์›ํŒ ์œ„๋กœ ์˜ฎ๊ฒจ์ค˜์•ผ ํ•œ๋‹ค. ๊ทธ๋Ÿฌ๊ธฐ ์œ„ํ•ด์„œ๋Š” 1๋ฒˆ ์›ํŒ์„ A๋กœ ์˜ฎ๊ธด ๋‹ค์Œ, 2๋ฒˆ ์›ํŒ์„ C๋กœ ์ด๋™์‹œํ‚ค์ž.

                                             ---
  -     ---   -----     ->      -           -----
  A      B      C               A      B      C

๋งˆ์ง€๋ง‰์œผ๋กœ A์˜ 1๋ฒˆ ์›ํŒ์„ C๋กœ ์ด๋™์‹œ์ผœ์„œ ํ•˜๋…ธ์ด ์›ํƒ‘์„ ์™„์„ฑ์‹œํ‚จ๋‹ค.

                -
               ---
              -----
  A      B      C

์—ฌํƒœ๊นŒ์ง€์˜ ๊ณผ์ •์„ "X" ์œ„์น˜์˜ ๊ฐ€์žฅ ์œ„ ์›ํŒ์„ "Y" ์œ„์น˜๋กœ ์ด๋™ํ•œ๋‹ค๋Š” ์˜๋ฏธ์—์„œ "X Y"๋กœ ํ‘œํ˜„ํ•ด๋ณด๋ฉด ๋‹ค์Œ๊ณผ ๊ฐ™๋‹ค

A C
A B
C B
A C
B A
B C
A C

A๋ฅผ 1, B๋ฅผ 2, C๋ฅผ 3์œผ๋กœ ๋ฐ”๊ฟ”์„œ ๋ณด๋ฉด #1914์—์„œ ์˜ˆ์‹œ ์ž…์ถœ๋ ฅ๊ณผ ๊ฐ™์Œ์„ ํ™•์ธํ•  ์ˆ˜ ์žˆ๋‹ค.

ํ•ด๊ฒฐ๋ฐฉ์•ˆ ๊ณ ์•ˆ

1. ์žฌ๊ท€ base case

์žฌ๊ท€๋ฅผ ํƒˆ์ถœํ•˜๋Š” ๋ฒ ์ด์Šค ์ผ€์ด์Šค์˜ ์กฐ๊ฑด์€ ์›ํŒ์˜ ์ˆ˜๊ฐ€ 1๊ฐœ์ผ ๋•Œ๋‹ค. ์ด ๋•Œ๋Š” ํ˜„์žฌ ์›ํŒ์˜ ์œ„์น˜์—์„œ ๋„์ฐฉ์ง€์˜ ์œ„์น˜๋กœ ์ด๋™ํ•˜๋ฉด ๋์ด๋‹ค.

์ฆ‰, start์„ ํ˜„์žฌ ์œ„์น˜๋ผ ๊ฐ€์ •ํ•˜๊ณ , dest๊ฐ€ ๋ชฉ์ ์ง€๋ฉด ์ด ๊ฒฝ์šฐ์˜ ๊ฒฝ๋กœ๋Š” start ํƒ‘์˜ ์›ํŒ์„ dest ํƒ‘์œผ๋กœ ์˜ฎ๊ธฐ๋Š” ๊ฒƒ์ด๋‹ค.

2. ์žฌ๊ท€ ๋ฐ˜๋ณต

๊ฒฐ๊ตญ ์›ํƒ‘์„ ์‹œ์ž‘์ ์—์„œ ๋ชฉ์ ์ง€๋กœ ์ด๋™ํ•˜๊ธฐ ์œ„ํ•ด์„œ๋Š” ๋‹ค์Œ์„ ์ˆ˜ํ–‰ํ•œ๋‹ค.

  1. N-1๊ฐœ์˜ ์›ํŒ์„ ์ค‘๊ฐ„์ง€์ ์œผ๋กœ ์˜ฎ๊ธด๋‹ค.
  2. ๊ฐ€์žฅ ํฐ ์›ํŒ์„ ๋ชฉ์ ์ง€๋กœ ์˜ฎ๊ธด๋‹ค.
  3. N-1๊ฐœ์˜ ์›ํŒ์„ ๋ชฉ์ ์ง€๋กœ ์˜ฎ๊ธด๋‹ค.

์ฝ”๋“œ๋กœ ์งœ๋ณด๋ฉด ๋‹ค์Œ๊ณผ ๊ฐ™๋‹ค.

static void hanoi(int numPlates, int start, int by, int dest) {
	if (N == 1) { // ๋ฒ ์ด์Šค์ผ€์ด์Šค
    	sb.append(start).append(" ").append(dest).append("\n");
        return;
    } else {
    	hanoi(numPlates - 1, start, dest, by);
        sb.append(start).append(" ").append(dest).append(NEW_LINE);
        hanoi(numPlates - 1, by, start, dest);
    }
}

์ด ์ด๋™ํšŸ์ˆ˜ ๊ณ„์‚ฐ

์‚ฌ์‹ค ํ•˜๋…ธ์ด ํƒ‘ ๋ฌธ์ œ ์ค‘์—์„œ๋Š” ๊ทธ๋ƒฅ ์žฌ๊ท€ํ•จ์ˆ˜ ์•ˆ์—์„œ ๋ฒ ์ด์Šค์ผ€์ด์Šค ํ˜ธ์ถœ ํšŸ์ˆ˜์— ๋Œ€ํ•ด ์นด์šดํ„ฐ๋ฅผ ์ฆ๊ฐ€์‹œ์ผœ ์ด ์ด๋™ํšŸ์ˆ˜๋ฅผ ๊ฒŒ์‚ฐํ•  ์ˆ˜ ์žˆ๋Š” ๋ฌธ์ œ๋“ค๋„ ์žˆ๋‹ค.
ํ•˜์ง€๋งŒ ํ•˜๋…ธ์ดํƒ‘ #1914 ์™€ ๊ฐ™์€ ๊ฒฝ์šฐ์—๋Š” N ์ž…๋ ฅ๊ฐ’์ด 20 ์ดˆ๊ณผ๋ฉด ์žฌ๊ท€ ํ•จ์ˆ˜๋ฅผ ํ˜ธ์ถœํ•˜๋Š” ๊ฒƒ์ด ์•„๋‹Œ ์ด๋™ ํšŸ์ˆ˜๋งŒ ์ถœ๋ ฅํ•˜๋ฉด ๋˜๊ธฐ ๋•Œ๋ฌธ์— ๊ณ„์‚ฐ์„ ํ•ด์•ผ ํ•œ๋‹ค. ํŠนํžˆ ๊ทธ ์ •๋„๋กœ ํฐ ์ž…๋ ฅ๊ฐ’์ด๋ฉด ์žฌ๊ท€๊ฐ€ ๋ฏธ์นœ๋“ฏ์ด ๊นŠ์–ด์งˆ ๊ฒƒ์ด๋‹ค.

#1914์—์„œ ์ด๋™ ํšŸ์ˆ˜ ์ถœ๋ ฅ ์ด์Šˆ

๋ฐฑ์ค€ #1914์—์„œ N์˜ ์ตœ๋Œ€ ์ž…๋ ฅ๊ฐ’์€ 100์ด๊ธฐ ๋•Œ๋ฌธ์— 3๋ฒˆ์—์„œ ํ™•์ธํ•œ ์ด ์ด๋™ํšŸ์ˆ˜ ๊ณ„์‚ฐ์‹์„ ๋”ฐ๋ฅด๋ฉด 2^100-1์œผ๋กœ long ํƒ€์ž…์˜ ๋ฒ”์œ„๋ฅผ ๋ฒ—์–ด๋‚˜๊ฒŒ ๋œ๋‹ค.

๊ทธ๋ž˜์„œ long๋ณด๋‹ค ํฐ ๋ฒ”์œ„๋ฅผ ํ—ˆ์šฉํ•˜๋Š” java.math.BigInteger๋ฅผ ํ™œ์šฉํ•ด์•ผ ํ•œ๋‹ค.

[JAVA] long๋ณด๋‹ค ํฐ ์ˆซ์ž BigInteger

๊ฐ„๋‹จํ•œ ์ œ๊ณฑ ์—ฐ์‚ฐ ๋ฉ”์„œ๋“œ๋ฅผ ํ†ตํ•ด ๊ตฌํ•˜๋ฉด ๋œ๋‹ค.

private static BigInteger solve(int N) {
	BigInteger two = new BigInteger("2");
    return two.pow(N).subtract(new BigInteger("1"));
}

์˜คํฐ์ˆ˜ #17298

๊ณจ๋“œ4

๋ฌธ์ œ ์ดํ•ด

์ˆซ์ž ๋ฐฐ์—ด์ด ์ฃผ์–ด์ง„๋‹ค.
๋‚˜์˜ ์˜ค๋ฅธ์ชฝ์— ์žˆ๋Š” ์ˆ˜ ์ค‘ ๋‚˜๋ณด๋‹ค ํฐ ๊ฐ€์žฅ ์™ผ์ชฝ์˜ ์ˆ˜๋ฅผ ์ฐพ๋Š” ๊ฒƒ.

nums[i]์˜ ์˜คํฐ์ˆ˜์ธ nums[j]๋Š” ๋‹ค์Œ ์กฐ๊ฑด์„ ๋งŒ์กฑํ•œ๋‹ค

  • i < j
  • nums[i] < nums[j]
  • ์œ„ ์กฐ๊ฑด์„ ๋งŒ์กฑํ•˜๋Š” ์ตœ์†Œ j ๊ฐ’

ํ•ด๊ฒฐ ๋ฐฉ์•ˆ ๊ณ ์•ˆ

๋ฐฐ์—ด์„ ์Šคํƒ์— ๋‹ด์•„ ํ’€์ดํ•˜๊ณ ์ž ํ•œ๋‹ค.

์Šคํƒ์—๋Š” ์•„์ง ์˜คํฐ์ˆ˜๋ฅผ ๋งŒ๋‚˜์ง€ ๋ชปํ•œ ์ˆซ์ž๋“ค์˜ ์ธ๋ฑ์Šค๋ฅผ ๋‹ด๊ณ , ๋ฐฐ์—ด์˜ ์ธ๋ฑ์Šค๋ฅผ 1๋ถ€ํ„ฐ ์ˆœ์ฐจ์ ์œผ๋กœ ๋น„๊ตํ•œ๋‹ค.

๋งŒ์•ฝ ์Šคํƒ์˜ ๋จธ๋ฆฌ ๊ฐ’๋ณด๋‹ค ํฐ ๊ฐ’์„ ๋ฐฐ์—ด์—์„œ ๋งŒ๋‚˜๋ฉด, ์ด๋Š” ์Šคํƒ์˜ ๋ชจ๋“  ์š”์†Œ๋ณด๋‹ค ํฌ๋‹ค๋Š” ๊ฒƒ์„ ์˜๋ฏธํ•˜๊ธฐ ๋•Œ๋ฌธ์— stack์˜ ๋ชจ๋“  ์ธ๋ฑ์Šค์— ์ด ๋ฐฐ์—ด ๊ฐ’์„ ์˜คํฐ์ˆ˜๋กœ ์ €์žฅํ•˜๋ฉด ๋œ๋‹ค.

์˜ˆ์ œ๋ฅผ ํ†ตํ•ด ์ดํ•ดํ•ด๋ณด์ž.

arr = {3, 5, 2, 7};

์Šคํƒ์€ ์ฒซ ์ธ๋ฑ์Šค 0์„ ๋‹ด๊ณ  ์‹œ์ž‘ํ•œ๋‹ค.

  1. ์ฒซ ๋ฃจํ”„

์Šคํƒ์˜ ๋จธ๋ฆฌ๋Š” 3์ด๋‹ค.
๋ฐฐ์—ด์„ 5๋ถ€ํ„ฐ ์ˆœํšŒํ•˜๋Š”๋ฐ, 5๊ฐ€ 3๋ณด๋‹ค ํฌ๊ณ , ๊ฐ€์žฅ ์ธ๋ฑ์Šค๊ฐ€ ์ž‘์€ ๊ฐ’์ด๊ธฐ์— 3์˜ ์˜คํฐ์ˆ˜๋Š” 5๋‹ค.

๊ทธ ๋‹ค์Œ 5๋ฅผ ์Šคํƒ์— ์ถ”๊ฐ€ํ•œ๋‹ค

  1. ๋‘๋ฒˆ์งธ ๋ฃจํ”„

์Šคํƒ์˜ ๋จธ๋ฆฌ๋Š” 5๋‹ค.
๋ฐฐ์—ด์„ 2๋ถ€ํ„ฐ ์ˆœํšŒํ•œ๋‹ค.

2-1. 2๋Š” 5๋ณด๋‹ค ์ž‘์•„์„œ ์˜คํฐ์ˆ˜๊ฐ€ ๋˜์ง€๋Š” ๋ชปํ•œ๋‹ค.
์Šคํƒ์— ์ถ”๊ฐ€ํ•œ๋‹ค.

2-2. ๊ทธ ๋‹ค์Œ 7์€ 5๋ณด๋‹ค ์ปค์„œ ์˜คํฐ์ˆ˜๋‹ค.
์ด ๋ง์€ ๊ณง ์ฆ‰์Šจ, 7์ด 2์˜ ์˜คํฐ์ˆ˜๋ผ๋Š” ๋œป์ด๋‹ค.
๊ทธ๋ž˜์„œ ์Šคํƒ์ด ๋นŒ ๋•Œ๊นŒ์ง€ popํ•˜๋ฉด์„œ ์˜คํฐ์ˆ˜์— ์ €์žฅํ•œ๋‹ค.

์ฝ”๋“œ

์˜คํฐ์ˆ˜ #17298


์š”์„ธํ‘ธ์Šค ๋ฌธ์ œ

์‹ค๋ฒ„#4

๋ฌธ์ œ ์ดํ•ด

  • N๋ช…์˜ ์‚ฌ๋žŒ์ด 1๋ฒˆ๋ถ€ํ„ฐ N๋ฒˆ๊นŒ์ง€ ์ˆœ์„œ๋Œ€๋กœ ์›์„ ์ด๋ค„ ์•‰์•„์žˆ์Œ
  • ์–‘์ˆ˜ K๊ฐ€ ์ฃผ์–ด์ง€๋ฉด, ์ˆœ์„œ๋Œ€๋กœ K๋ฒˆ์งธ ์‚ฌ๋žŒ์„ ์ œ๊ฑฐํ•œ๋‹ค
  • ์›์—์„œ ์‚ฌ๋žŒ๋“ค์ด ์ œ๊ฑฐ๋˜๋Š” ์ˆœ์„œ๋ฅผ ์ถœ๋ ฅํ•œ๋‹ค

ํ•ด๊ฒฐ ๋ฐฉ์•ˆ ๊ณ ์•ˆ

  • ์ˆœ์„œ๊ฐ€ ์žˆ๋Š” ๋ฐ์ดํ„ฐ์˜ ์ง‘ํ•ฉ์ด๋ผ ArrayDeque๊ณผ ๊ฐ™์€ ์ž๋ฃŒ๊ตฌ์กฐ๋ฅผ ์ž˜ ํ™œ์šฉํ•  ์ˆ˜ ์žˆ๋Š” ๋ฌธ์ œ๋‹ค
  • ํ•˜!์ง€!๋งŒ! ๋งํฌ๋“œ๋ฆฌ์ŠคํŠธ ๊ตฌํ˜„ํ•œ์ง€๊ฐ€ ์˜ค๋ž˜๋˜์–ด ๋‚˜๋Š” ๋งํฌ๋“œ๋ฆฌ์ŠคํŠธ๋กœ ๊ตฌํ˜„ํ•ด๋ณด์•˜๋‹ค (์ €๋ฒˆ์ฃผ์— ๋ฐฐ์šดlistIterator์—์„œ ์˜๊ฐ์„ ๋ฐ›์Œ)

ํ’€์ด ์ฝ”๋“œ

1. Node ํด๋ž˜์Šค

์‚ฌ๋žŒ์˜ ๋ฒˆํ˜ธ๋ฅผ ์ €์žฅํ•  data ํ•„๋“œ, ๋‚ด ์™ผ์ชฝ์— ์•‰์•„์žˆ๋Š” ์‚ฌ๋žŒ(Node)์— ๋Œ€ํ•œ ํฌ์ธํ„ฐ์ธ prev ํ•„๋“œ, ๊ทธ๋ฆฌ๊ณ  ๋‚ด ์˜ค๋ฅธ์ชฝ ์‚ฌ๋žŒ์— ๋Œ€ํ•œ ํฌ์ธํ„ฐ์ธ next ํ•„๋“œ๊ฐ€ ์กด์žฌํ•œ๋‹ค.

๋ฉ”์„œ๋“œ๋Š” ์ƒ์„ฑ์ž๋งŒ ํ•„์š”ํ•˜๋‹ค.

2. CircularLinkedList

๋งํฌ๋“œ๋ฆฌ์ŠคํŠธ์˜ ์ฒซ ๋…ธ๋“œ๋ฅผ ์ €์žฅํ•  Node head, ๋งˆ์ง€๋ง‰ ๋…ธ๋“œ๋ฅผ ์ €์žฅํ•  Node tail, ๋งํฌ๋“œ๋ฆฌ์ŠคํŠธ์˜ ํฌ๊ธฐ๋ฅผ ์ €์žฅํ•  int size, ๊ทธ๋ฆฌ๊ณ  ์–ด๋А ๋…ธ๋“œ๋ฅผ ์ œ๊ฑฐํ• ์ง€ ํŠธ๋ž™ํ‚นํ•  Node cursor ํ•„๋“œ๋ฅผ ๊ฐ–๋Š”๋‹ค.

๋ฉ”์„œ๋“œ๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™์ด ํ•„์š”ํ•˜๋‹ค

  • ์ƒ์„ฑ์ž: ๋งํฌ๋“œ๋ฆฌ์ŠคํŠธ์˜ ํฌ๊ธฐ๋ฅผ 0์œผ๋กœ ์ดˆ๊ธฐํ™”ํ•œ๋‹ค
  • boolean isEmpty(): ๋งํฌ๋“œ๋ฆฌ์ŠคํŠธ์˜ ํฌ๊ธฐ๊ฐ€ 0์ธ์ง€ ๋ถˆ๋ฆฌ์–ธ ๊ฐ’์œผ๋กœ ๋ฐ˜ํ™˜ํ•œ๋‹ค
  • void add(Node newNode): ์ฒซ ๋…ธ๋“œ ์ถ”๊ฐ€, ๋‘๋ฒˆ์งธ ๋…ธ๋“œ ์ถ”๊ฐ€, ์ด์™ธ ๋…ธ๋“œ ์ถ”๊ฐ€๋ฅผ ๊ตฌ๋ถ„ํ•˜์—ฌ ๊ตฌํ˜„ํ–ˆ๋‹ค. ์‚ฌ์ด์ฆˆ ํฌ๊ธฐ๋ฅผ 1 ์ฆ๊ฐ€์‹œํ‚จ๋‹ค
  • int next(): cursor๋ฅผ ์˜ค๋ฅธ์ชฝ์œผ๋กœ ํ•œ์นธ ์›€์ง์ธ๋‹ค. listIterator์˜ ๋ฉ”์„œ๋“œ๋ฅผ ๋ชจ๋ฐฉํ–ˆ๋‹ค
  • int remove(): ํ˜„์žฌ ์ปค์„œ์— ํ•ด๋‹นํ•˜๋Š” ๋…ธ๋“œ๋ฅผ ์ œ๊ฑฐํ•œ๋‹ค. ์ปค์„œ ๋…ธ๋“œ๊ฐ€ ๋จธ๋ฆฌ ๋˜๋Š” ๊ผฌ๋ฆฌ์˜€๋‹ค๋ฉด reassign ์ž‘์—…๋„ ์ง„ํ–‰ํ•œ๋‹ค

3. ์ „๋ฐ˜์ ์ธ ๋กœ์ง ๊ตฌ์„ฑ

์ž…๋ ฅ๋œ N์— ๋Œ€ํ•˜์—ฌ 1~N๊นŒ์ง€ ์›ํ˜• ๋งํฌ๋“œ๋ฆฌ์ŠคํŠธ์— ์ถ”๊ฐ€ํ•œ๋‹ค. ์›ํ˜€ ๋งํฌ๋“œ๋ฆฌ์ŠคํŠธ๊ฐ€ ๋ชจ๋‘ ์†Œ๋ชจ๋  ๋•Œ๊นŒ์ง€ K๋ฒˆ์งธ ๋…ธ๋“œ๋ฅผ ์ฐพ์•„ (next()) ์ œ๊ฑฐ(remove())ํ•˜๊ณ , ์ด ์ œ๊ฑฐ๋œ ๋ฐ์ดํ„ฐ ๊ฐ’์„ ์ˆœ์—ด์— ์ €์žฅํ•œ๋‹ค.

๋งˆ์ง€๋ง‰์œผ๋กœ ์ˆœ์—ด์„ ์ถœ๋ ฅํ•œ๋‹ค.

์š”์„ธํ‘ธ์Šค ๋ฌธ์ œ #1158 ํ’€์ด์ฝ”๋“œ


ํ’์„  ํ„ฐ๋œจ๋ฆฌ๊ธฐ

์‹ค๋ฒ„#3

๋ฌธ์ œ ์ดํ•ด

  • 1๋ฒˆ๋ถ€ํ„ฐ N๋ฒˆ๊นŒ์ง€ N๊ฐœ์˜ ํ’์„ ์ด ์›ํ˜•์œผ๋กœ ๋ฒˆํ˜ธ์ˆœ๋Œ€๋กœ ๋†“์—ฌ์ ธ์žˆ๋‹ค.
  • ์ฒซ ์‹œ๋„์—๋Š” ๋ฌด์กฐ๊ฑด 1๋ฒˆ ํ’์„ ์„ ํ„ฐ๋œจ๋ฆฐ๋‹ค.
  • ํ„ฐ๋œจ๋ฆฐ ํ’์„ ์˜ ๋ฐ์ดํ„ฐ๊ฐ’ K๋ฅผ ๋ฐ›์•„ K๋ฒˆ์งธ ํ’์„ ์„ ํ„ฐ๋œจ๋ฆฐ๋‹ค
    • ๋ชจ๋“  ํ’์„ ์„ ํ„ฐ๋œจ๋ฆด ๋•Œ๊นŒ์ง€ ์ด ์ž‘์—…์„ ๋ฐ˜๋ณตํ•œ๋‹ค
    • K๋Š” ์Œ์ˆ˜๊ฑฐ๋‚˜ ์–‘์ˆ˜๋‹ค.

ํ•ด๊ฒฐ ๋ฐฉ์•ˆ ๊ณ ์•ˆ

  • <์š”์„ธํ‘ธ์Šค> ๋ฌธ์ œ์—์„œ ๊ตฌํ˜„ํ•œ ๋งํฌ๋“œ๋ฆฌ์ŠคํŠธ๋ฅผ ์ตœ๋Œ€ํ•œ ํ™œ์šฉํ•ด๋ณด์•˜๋‹ค
  • ์ปค์„œ๊ฐ€ ์™ผ์ชฝ(์Œ์ˆ˜)์ด๋‚˜ ์˜ค๋ฅธ์ชฝ(์–‘์ˆ˜)์œผ๋กœ ์ด๋™ํ•  ์ˆ˜ ์žˆ๊ธฐ ๋•Œ๋ฌธ์— next() ๋ฉ”์„œ๋“œ ๋Œ€์‹ ์— move() ๋ฉ”์„œ๋“œ๋ฅผ ๊ตฌํ˜„ํ•˜์—ฌ ์™ผ์ชฝ๊ณผ ์˜ค๋ฅธ์ชฝ ์ด๋™์„ ๋ชจ๋‘ ๊ตฌํ˜„ํ–ˆ๋‹ค.

ํ’€์ด ์ฝ”๋“œ

<์š”์„ธํ‘ธ์Šค ๋ฌธ์ œ>์˜ Node์™€ CircularLinkedList ํด๋ž˜์Šค๋ฅผ ๊ทธ๋Œ€๋กœ ์‚ฌ์šฉํ–ˆ๋‹ค.

void move(int times) ๋ฉ”์„œ๋“œ

์ด๋™ ํšŸ์ˆ˜๋ฅผ ์ธ์ž๊ฐ’์œผ๋กœ ๋ฐ›์•„์„œ ์ปค์„œ๋ฅผ ์ด๋™์‹œํ‚จ๋‹ค. ์ธ์ž๊ฐ’์ด ์Œ์ˆ˜๋ฉด ํ˜„์žฌ ์ปค์„œ์˜ .prev ๋…ธ๋“œ๋กœ ์ด๋™ํ•˜๊ณ , ์–‘์ˆ˜๋ฉด ํ˜„์žฌ ์ปค์„œ์˜ .next ๋…ธ๋“œ๋กœ ์ด๋™ํ•œ๋‹ค.

ํ’์„  ํ„ฐ๋œจ๋ฆฌ๊ธฐ #2346 ํ’€์ด ์ฝ”๋“œ

profile
์šฐ๋‹นํƒ•ํƒ•

0๊ฐœ์˜ ๋Œ“๊ธ€