Skip to content

Conversation

@YooGyeongMo
Copy link
Collaborator

๐Ÿ”— ๋ฌธ์ œ ๋งํฌ

๋กœ๋ด‡ ์ฒญ์†Œ๊ธฐ

์–ธ์ œ ๋กœ๋ด‡ ์ฒญ์†Œ๊ธฐ์‚ฝ๋‹ˆ๊นŒ ์ง„์งœ... ํ•˜..

แ„‰แ…ณแ„แ…ณแ„…แ…ตแ†ซแ„‰แ…ฃแ†บ 2025-05-11 แ„‹แ…ฉแ„’แ…ฎ 11 51 12

โœ”๏ธ ์†Œ์š”๋œ ์‹œ๊ฐ„

40๋ถ„ + @

โœจ ์ˆ˜๋„ ์ฝ”๋“œ

๋ฌธ์ œ์™€ ๋ง ์žฅ๋‚œ์„ ์ดํ•ดํ•˜๋Š”๋ฐ ๊ฝค๋‚˜ ์‹œ๊ฐ„์ด ๊ฑธ๋ ธ์Šต๋‹ˆ๋‹ค.

๋ฌผ๋ก  ๋ฌธ์ œ๋ฅผ ๋”ฑ ๋งˆ์ฃผํ•˜์ž๋งˆ์ž ์ด๊ฑด DFS/BFS๋ฉด ์†์‰ฝ๊ฒŒ ํ’€๋ฆฌ๊ฒ ๊ตฌ๋‚˜! ๋ผ๊ณ  ์ƒ๊ฐํ•˜์‹ค๊ฒ๋‹ˆ๋‹ค.

์ €๋Š” DFS๋ฅผ ์„ ํƒํ–ˆ๋Š”๋ฐ์š” ! ๊ทธ ์ด์œ ๋Š” ! ๋ฌธ์ œ๊ฐ€ ๋Œ€๋†“๊ณ  Depth๊ฐ€ ์žˆ์–ด์š”. ํ•ด๋‹น ์กฐ๊ฑด๋“ค์„ ๋‚˜์—ดํ•˜๊ณ  ์กฐ๊ฑด์ด ์•ˆ๋ ์‹œ์— ๋‹ค์‹œ ๋‚˜์˜ค๊ณ . ์ด๊ฒŒ ์žฌ๊ท€๋กœ ํ’€๋ฉด ์ข€ ๋” ์ง๊ด€์ ์ด์ง€ ์•Š์„๊นŒ? ํ•ด์„œ ์„ ํƒํ–ˆ์Šต๋‹ˆ๋‹ค.

image
์ค„์ค„ ์ ์–ด๋ณธ ๊ฒƒ์ธ๋ฐ์š”.
๋จผ์ € ๋กœ๋ด‡ ์‰‘์€ ใ…‹ ์ง„์งœ ๊ฐ„๋‹จํ•ฉ๋‹ˆ๋‹ค. ์ €ํฌ ์ผ๋ฐ˜ ๋กœ๋ด‡ ์ฒญ์†Œ๊ธฐ ๋กœ์ง ์ƒ๊ฐํ•˜๋ฉด๋ผ์š”.

์•ž์œผ๋กœ ๊ฐ€๋‹ค๊ฐ€, ์žฅ์• ๋ฌผ์ด ์žˆ์œผ๋ฉด ๋ฐฉํ–ฅ์„ ๋Œ๊ณ , ์ฒญ์†Œํ•  ๋ฐ ์—†์œผ๋ฉด ๋’ค๋กœ ๊ฐ€๊ณ ,
๋”ฑ ๊ทธ ์ˆ˜์ค€์ž…๋‹ˆ๋‹ค. ๋ณต์žกํ•  ๊ฒŒ ์—†์–ด์š”.
๊ทผ๋ฐ ๋ฌธ์ œ๋Š”โ€ฆ ๊ทธ๊ฑธ ๋ง๋กœ ์„ค๋ช…ํ•˜๋‹ˆ๊นŒ ์—„์ฒญ ์–ด๋ ต๊ฒŒ ๋А๊ปด์ง„๋‹ค๋Š” ๊ฑฐ์ฃ .
(์™ผ์ชฝ์œผ๋กœ ๋ˆ๋‹ค โ†’ ๊ทธ ๋ฐฉํ–ฅ์— ์ฒญ์†Œํ•  ๊ณต๊ฐ„์ด ์žˆ์œผ๋ฉด ์ „์ง„ โ†’ ๊ทธ๊ฒŒ ์—†๋‹ค๋ฉด ๋‹ค์‹œ ์™ผ์ชฝโ€ฆ ์ด๊ฑธ ๋„ค ๋ฒˆ ๋ฐ˜๋ณตโ€ฆ ์–ดํœด ๐Ÿ˜ตโ€๐Ÿ’ซ)

๋ง๋กœ๋Š” ๊ดด๋ž„ํ–ˆ์ง€๋งŒ, ๋กœ์ง ์ž์ฒด๋Š” ์šฐ๋ฆฌ๊ฐ€ ์ง‘์—์„œ ๋ณด๋˜ ๊ทธ ๋กœ๋ด‡ ์ฒญ์†Œ๊ธฐ ๊ทธ๋Œ€๋กœ์˜€๊ณ , ๊ทธ๋ž˜์„œ ์ €๋Š” DFS๋กœ ํ•œ ์นธ ํ•œ ์นธ ๋”ฐ๋ผ๊ฐ€๋ฉฐ ์žฌ๊ท€๋กœ ๊ตฌํ˜„ํ–ˆ์Šต๋‹ˆ๋‹ค.

// ์™ผ์ชฝ90๋„๋Š” ์˜ค๋ฅธ์ชฝ์œผ๋กœ +3
func turnLeft(from direction: Int) -> Int {
    return (direction + 3) % 4
}

๋ฌธ์ œ ์ˆœ์„œ์—์„œ๋Š” ๋’ท์ชฝ์— ๋‚˜์™”์ง€๋งŒ, ๋ฌธ์ œ ์กฐ๊ฑด๋“ค์„ ๊ฑฐ๊พธ๋กœ ๋ณธ๋‹ค๋ฉด ๋ถ๋™๋‚จ์„œ ๋ฐฉํ–ฅ์„ ์ฒญ์†Œ ์•ˆํ•œ ๊ณณ์„ ์™ผ์ชฝ๋ถ€ํ„ฐ ์ฒดํฌํ•˜๋ฉด ๋ฉ๋‹ˆ๋‹ค.

๊ทธ๋ž˜์„œ ์ €๋Š” +3์„ ํ•ด์ฃผ์—ˆ๊ณ  % 4 -> ์ด ๋กœ์ง์€ ์‹œ๋ฎฌ๋ ˆ์ด์…˜, ๊ตฌํ˜„์—์„œ ์ƒํ•˜์ขŒ์šฐ ๋น„๊ต์‹œ ๊ผญ ๋‚˜์˜ค๋‹ˆ ์™ธ์šฐ์‹œ๋ฉด ์ข‹์Šต๋‹ˆ๋‹ค.

๊ทธ ๋‹ค์Œ, dfs๋Š” ๊ฑฐ์˜ ๊ตฌ์กฐ์ ์œผ๋กœ ๋‹ฌ๋ผ์งˆ ๊ฒƒ์€ ์—†์—ˆ์–ด์š”.

  1. ํ˜„์žฌ ์œ„์น˜ ์ฒญ์†Œ

  2. ์™ผ์ชฝ ๋ฐฉํ–ฅ๋ถ€ํ„ฐ 4๋ฐฉํ–ฅ ํƒ์ƒ‰
    โ€ข ์ฒญ์†Œ ์•ˆ ๋œ ์นธ ์žˆ์œผ๋ฉด โ†’ ํšŒ์ „ โ†’ ์ „์ง„ โ†’ ์žฌ๊ท€ ํ˜ธ์ถœ
    โ€ข ์—†์œผ๋ฉด โ†’ 4๋ฐฉ ๋ชจ๋‘ ๋Œ์•˜๋‹ค๋Š” ์˜๋ฏธ โ†’ ํ›„์ง„

  3. ํ›„์ง„ ์ฒ˜๋ฆฌ
    โ€ข ๋’ค์ชฝ์ด ๋ฒฝ์ด๋ผ๋ฉด ์ข…๋ฃŒ (exit(0) ์‚ฌ์šฉ)
    โ€ข ์•„๋‹ˆ๋ผ๋ฉด ๊ฐ™์€ ๋ฐฉํ–ฅ์œผ๋กœ ๋’ค๋กœ ํ•œ ์นธ ์ด๋™ํ•ด ๋‹ค์‹œ dfs

Tip. ์—ฌ๊ธฐ์„œ ํ•ต์‹ฌ์€ ์ œ๊ฐ€ ๊ฝค๋‚˜ ๊ณ ์ƒํ•œ๊ฑด๋ฐ,,, ๊ฐ€๋กœ ์„ธ๋กœ ๊ฐœ๋…์ด ์ขŒํ‘œ๊ณ„์—์„  ๋ฐ˜๋Œ€๊ฐ€ ๋œ๋‹ค๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค.

x ๋Š” ๊ฐ€๋กœ, y๊ฐ€ ์„ธ๋กœ์ž–์•„์š”.

column์ด ๊ฐ€๋กœ๋กœ ์ปค์ ธ์•ผํ•˜๊ณ , row๊ฐ€ ์„ธ๋กœ๋กœ ์ปค์ ธ์•ผํ•ด์š”.

๊ทธ๋ž˜์„œ board[y][x]๋กœ [r][c] ์ˆœ์œผ๋กœ ํ•ด์ค˜์•ผํ•ฉ๋‹ˆ๋‹ค.

๋˜ํ•œ =2 ์ฒ˜๋Ÿผ ๊ผญ 2๊ฐ€ ์•„๋‹ˆ๋”๋ผ๋„ ๋‚ด๊ฐ€ ์ฒญ์†Œํ–ˆ๋‹ค๋ผ๋Š” ๊ฒฝ๊ณ„๊ฐ’ ์„ ์ •๋„ ์ค‘์š”ํ• ๋“ฏํ•ฉ๋‹ˆ๋‹ค.

์•„๋ž˜์™€ ๊ฐ™์ด ์ผ๊ด€์„ฑ ์žˆ๊ฒŒ ์ฒ˜๋ฆฌํ•ด์ค˜์•ผํ•ฉ๋‹ˆ๋‹ค.

0 -> ์ฒญ์†Œํ•˜์ง€์•Š์€์นธ
1 -> ๋ฒฝ
2 -> ์ฒญ์†Œํ•œ์นธ

๋ฌธ์ œ์—์„œ์˜ ์กฐ๊ฑด ์ธ๋ฑ์‹ฑ์€ ์†์ง€๋ง์•„์•ผํ•ฉ๋‹ˆ๋‹ค.

์ฒซ ์ขŒํ‘œ๋Š” r+1, c+1๋ฅผ ๊ฐ€๋ฆฌํ‚จ๋‹ค.

๊ฐ€์žฅ ๋ถ์„œ์ชฝ์€ 0,0, ๊ฐ€์žฅ ๋‚จ๋™์ชฝ์€ N-1,M-1

๊ทธ๋ƒฅ ์ธ๋ฑ์Šค์ž…๋‹ˆ๋‹ค. ์ž…๋ ฅ์„ ์ž˜ ๋ณด๊ณ  ํ—ท๊ฐˆ๋ฆฌ์ง€ ๋ง์•„์•ผํ•ฉ๋‹ˆ๋‹ค !!

๐Ÿ“š ์ƒˆ๋กญ๊ฒŒ ์•Œ๊ฒŒ๋œ ๋‚ด์šฉ

  1. ์ขŒํ‘œ๊ณ„์™€ ๋ฐฐ์—ด ์ธ๋ฑ์Šค๋Š” ๋‹ค๋ฅด๋‹ค
    โ€ข ๋ฌธ์ œ์—์„œ (r, c)๋ผ๊ณ  ํ‘œํ˜„ํ•˜๊ณ , (0, 0)์ด ๊ฐ€์žฅ ๋ถ์„œ์ชฝ์ด๋ผ๊ณ  ๋งํ•˜์ง€๋งŒ, ์‹ค์ œ๋กœ๋Š” ๊ทธ๋ƒฅ 2์ฐจ์› ๋ฐฐ์—ด์˜ ์ธ๋ฑ์Šค์ผ ๋ฟ์ด๋‹ค.
    โ€ข x๋Š” ๊ฐ€๋กœ(โ†’), y๋Š” ์„ธ๋กœ(โ†“)์˜ ์˜๋ฏธ๋ฅผ ๊ฐ–์ง€๋งŒ, ๋ฐฐ์—ด์—์„œ๋Š” board[y][x] ์ˆœ์œผ๋กœ ์ ‘๊ทผํ•ด์•ผ ํ•˜๋ฏ€๋กœ ํ•ญ์ƒ ์ฃผ์˜๊ฐ€ ํ•„์š”ํ•˜๋‹ค.

  2. ๋ฐฉํ–ฅ ํšŒ์ „์€ +3 % 4๋กœ ์ฒ˜๋ฆฌํ•˜๋ฉด ๊น”๋”ํ•˜๋‹ค
    โ€ข ๋ถ(0), ๋™(1), ๋‚จ(2), ์„œ(3) ๊ธฐ์ค€์œผ๋กœ ์™ผ์ชฝ ํšŒ์ „์€ (dir + 3) % 4๋กœ ํ‘œํ˜„ํ•˜๋ฉด ๋œ๋‹ค.
    โ€ข ๊ตฌํ˜„/์‹œ๋ฎฌ๋ ˆ์ด์…˜ ๋ฌธ์ œ์—์„œ ๋ฐฉํ–ฅ ํšŒ์ „์€ ์ž์ฃผ ๋“ฑ์žฅํ•˜๋ฏ€๋กœ ๋ฐ˜๋“œ์‹œ ์™ธ์›Œ๋‘๋ฉด ์ข‹๋‹ค.

  3. ์ฒญ์†Œ ์—ฌ๋ถ€๋Š” ๊ฐ’์œผ๋กœ ๊ตฌ๋ถ„ํ•˜๋ฉด ๋œ๋‹ค
    โ€ข board[y][x] = 2์ฒ˜๋Ÿผ, ์ฒญ์†Œํ•œ ์นธ์„ ์ˆซ์ž ๊ฐ’์œผ๋กœ ํ‘œํ˜„ํ•ด๋„ ๋œ๋‹ค. ์ค‘์š”ํ•œ ๊ฑด ์ผ๊ด€์„ฑ ์žˆ๊ฒŒ ์ฒ˜๋ฆฌํ•˜๋Š” ๊ฒƒ.
    โ€ข ๊ผญ 2๊ฐ€ ์•„๋‹ˆ์–ด๋„ ์ƒ๊ด€์—†์ง€๋งŒ, โ€œ์ฒญ์†Œํ•œ ์นธโ€์ด๋ผ๋Š” ์ƒํƒœ ํ‘œํ˜„์ด ์ฝ”๋“œ ๋‚ด์— ๋ช…ํ™•ํžˆ ๋“œ๋Ÿฌ๋‚˜์•ผ ํ•œ๋‹ค.

  4. ์ž…๋ ฅ๋„ 0-based ์ธ๋ฑ์Šค๋‹ค
    โ€ข ๋ฌธ์ œ ์„ค๋ช…์ด ์ขŒํ‘œ์ฒ˜๋Ÿผ ๋А๊ปด์งˆ ์ˆ˜ ์žˆ์ง€๋งŒ, ์ž…๋ ฅ๊ฐ’ ์ž์ฒด๋Š” 0๋ถ€ํ„ฐ ์‹œ์ž‘ํ•˜๋ฏ€๋กœ -1 ๊ฐ™์€ ๋ณด์ •์€ ํ•„์š” ์—†๋‹ค.
    โ€ข (3, 4)๋Š” ๊ณง board[3][4]๋ฅผ ์˜๋ฏธํ•œ๋‹ค.

update: commit ํƒ€์ดํ‹€๋ณ€๊ฒฝ
Copy link
Member

@giljihun giljihun left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

๋ฐ๋ฏธ์•ˆ ์™„์ „ ์‹œ๋ฎฌ๋ ˆ์ด์…˜ + ์–ด๋–ค ์•Œ๊ณ ๋ฆฌ์ฆ˜์œผ๋กœ ํ’€์–ด๋ณผ๋ž˜์˜ ์ •์„ ๋ฌธ์ œ๋„ค์š” ใ…Žใ…Ž
๋˜ ์–ด๋–ป๊ฒŒ ๋ณด๋ฉด ์ „ํ˜•์ ์ธ DFS๋ฌธ์ œ๊ฐ™๊ธฐ๋„ํ•˜๊ณ ์š”.

์ฝ”๋“œ๊ฐ€ ์‹ค์ œ ์„ธ์ƒ์„ ๋ฐ˜์˜ํ•œ๋‹ค๋Š” ๊ฐ€์น˜๊ฐ€ ๋‹ด๊ธด ์ง๊ด€์ ์ธ ์„ค๊ณ„ ์•„์ฃผ ์ข‹์•˜์Šต๋‹ˆ๋‹ค.
๋ฐ๋ฏธ์•ˆ pr์€ ์ˆ˜๋„์ฝ”๋“œ์—๋„ ใ…์ฝ”๋ฉ˜ํŠธ๋ฅผ ๋‹ฌ๊ณ ์‹ถ์„ ์ •๋„๋กœ ์ž˜ ์ฝํžˆ๊ณ  ๋ญ”๊ฐ€ ๊ฐ™์ด ํ’€๊ณ ์žˆ๋‹ค๋ผ๋Š” ๋А๋‚Œ์ด ๋“ค์–ด์š” ใ…‹ใ…‹

์ €๋Š” ํ๊ธฐ๋ฐ˜ bfs๋กœ ๋‹ค์‹œ ๋„์ „ํ•ด๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค.

Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

์‚ฌ์†Œํ•œ ์งˆ๋ฌธ๊ฐ™๊ธฐ๋„ ํ•œ๋ฐ ๊ถ๊ธˆํ•ด์„œ ์—ฌ์ญค๋ณผ๊ฒŒ์š”!

์ด ํŒŒ๋ผ๋ฏธํ„ฐ๊ฐ€ 4๊ฐœ์ธ ํ•จ์ˆ˜๋ฅผ ๋ดค์„ ๋•Œ, ๋ฐ๋ฏธ์•ˆ์€ ์–ด๋–ค ํŒŒ๋ผ๋ฏธํ„ฐ๊ฐ€ ๊ฐ€์žฅ ์ค‘์š”ํ•˜๋‹ค๊ณ  ์ƒ๊ฐ์ด ๋“œ์‹œ๋‚˜์š”?
์ €๋Š” ๋ญ”๊ฐ€ x,y๋ฅผ ์•ž์— ๋‘๋Š”๊ฒŒ ์–ด๋–ค๊ฐ€? ํ•˜๋Š” ๊ฐ€๋ฒผ์šด ์ƒ๊ฐ์ด ๋“ค์—ˆ์Šต๋‹ˆ๋‹ค!
๊ฐ‘์ž๊ธฐ ํŒŒ๋ผ๋ฏธํ„ฐ์˜ ์ˆœ์„œ์— ๋”ฐ๋ผ์„œ๋„ ํ•จ์ˆ˜๋ฅผ ์ดํ•ดํ•˜๋Š” ๊ฐ€๋…์„ฑ์„ ์กฐ๊ธˆ ๋” ๋†’์ผ ์ˆ˜ ์žˆ์ง€ ์•Š์„๊นŒ? ํ•˜๋Š” ์ƒ๊ฐ์ด ๋“ค์—ˆ๋„ค์š” ใ…‹ใ…‹
๋ฌผ๋ก  ์ง€๊ธˆ๋„ ์ถฉ๋ถ„ํžˆ ์ดํ•ด๋˜๋Š” ์ˆœ์„œ์ž…๋‹ˆ๋‹ค !

Copy link
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

์ข‹์€ ํ”ผ๋“œ๋ฐฑ์ด๋„ค์š” ๊ธธ ์ €๋„ ๊ทธ๋Ÿฐ ์ƒ๊ฐ์ด ๋“ค์—ˆ์Šต๋‹ˆ๋‹ค.

Copy link
Collaborator

@bishoe01 bishoe01 May 18, 2025

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

์ข‹์€ ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค..! ์ €๋Š” ๋ณต์žกํ• ์ˆ˜๋ก ํŒŒ๋ผ๋ฏธํ„ฐ ์ˆœ์„œ์—์„œ ๋’ค๋กœ ๋ฏธ๋ฃจ๋Š” ๊ฒƒ ๊ฐ™์•„์š”.

Copy link
Collaborator Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

@giljihun ์‚ฌ์‹ค ๊ธธ ์ด์•ผ๊ธฐ๋ฅผ ๋“ฃ๊ณ  ๋ณด๋‹ˆ... ํ•จ์ˆ˜ ํŒŒ๋ผ๋ฏธํ„ฐ ์„ ์ •์‹œ์— ์ค‘์š”๋„ ํ˜น์€, ๊ฐ€๋…์„ฑ์„ ์ƒ๊ฐํ•˜์ง€ ์•Š๋Š” ๊ฒฝํ–ฅ์ด ์žˆ๋Š”๊ฑฐ ๊ฐ™์•„์š” ใ…œใ…œ ๋ฐ˜์„ฑํ•˜๊ฒŒ ๋ฉ๋‹ˆ๋‹ค. ์‚ฌ์‹ค ์ค‘์š”๋„ ์ธก๋ฉด์—์„œ ์ƒ๊ฐํ•˜๊ธฐ ๋ณด๋‹ค๋Š” ์„ค๊ณ„ํ• ๋•Œ ์ผ๋‹จ ๊ตฌํ˜„ํ•˜๊ณ  ๋ณด์ž๋ผ๋Š” ์ƒ๊ฐ์œผ๋กœ ํ•จ์ˆ˜์— ๋‹ค ๋•Œ๋ ค๋„ฃ์„๋•Œ ํŠนํžˆ dfs/bfs ํ’€๋•Œ๋Š” ๊ทธ๋ƒฅ ๋„ฃ๊ฒŒ ๋˜๋Š”๋ฐ ๋งž๋„ค์š”.. ์ƒ๊ฐํ•ด๋ณด๋‹ˆ x,y๊ฐ€ ์•ž์—์žˆ๋‹ค๋ฉด ? ์•„์ฃผ ์ข‹์•˜์„๊บผ๊ฐ™์•„์š”.

  • ๋‹ค๋งŒใ…‹ใ…‹ dfs/bfs๋ฌธ์ œ ํ‘ผ๊ฑธ๋ณด๋‹ˆ ์žฌ๊ท€์ผ๋•Œ ์ขŒํ‘œ๋Š” ๋’ค์ชฝ์— ์ฐ๋Š” ๊ฒฝ์šฐ๊ฐ€ ๋งŽ๋”๊ตฐ์š” ์ €๋Š” ์ƒ๊ฐํ•˜๊ณ  ์ ์–ด๋ด์•ผ๊ฒ ์–ด์š” ๊ธธ ์„ผ์„ธ์™€ swift ์ปจ๋ฒค์…˜keeper @MuchanKim ์กฐ์–ธ์ด๋ผ๋ฉด ๋ฐ›์„์–ด์•ผ์ฃ  ํ˜ธํ˜ธ

Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

์˜ค.. ๊ทธ๋ ‡๊ตฐ์š” ใ…Žใ…Ž
์ €๋„ ๋ฐ˜์„ฑํ•˜๋Š” ๋ถ€๋ถ„์ด๋ผ ์ฝ”๋ฉ˜ํŠธ ๋‚จ๊ฒจ๋ณด์•˜๋˜ ๊ฒƒ์ž…๋‹ˆ๋‹ค !! ๊ฐ์‚ฌํ•ด์š”

Comment on lines +97 to +98
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

์—ฌ๊ธฐ ์ฝ”๋“œ์— ์˜๋ฌธ์ด ์žˆ์–ด์š”!

dfs๋ฅผ ๋“ค์–ด๊ฐ€๋ฉด, ํ˜„์žฌ ์œ„์น˜๊ฐ€ ์ฒญ์†Œ๋˜์—ˆ๋‚˜? ์ฒดํฌํ•˜๊ณ  ์ฒญ์†Œ๋ฅผ ํ•˜์ž–์•„์š”

// 1. ํ˜„์žฌ ์œ„์น˜๊ฐ€ ์ฒญ์†Œ๋˜์ง€ ์•Š์•˜๋‹ค๋ฉด -> ์ฒญ์†Œ
    if board[y][x] == 0 {
        board[y][x] = 2
    }

์—ฌ๊ธฐ์„œ ์ฒ˜๋ฆฌ๋ฅผ ํ•œ๋‹ค๊ณ  ์ดํ•ด๋ฅผ ํ–ˆ๋Š”๋ฐ,
๋ฉ”์ธ์ฝ”๋“œ์—์„œ ์ œ์ž๋ฆฌ ์ฒญ์†Œ๋ฅผ ์ฒดํ‚นํ•˜๊ณ  ํ•จ์ˆ˜๋กœ ๋„˜์–ด๊ฐ€๋Š” ์ด์œ ๊ฐ€ ์žˆ์„๊นŒ์š” ??

Copy link
Collaborator Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

์˜ค ๊ธธ, ์ค‘๋ณต์ฒญ์†Œ๊ธดํ•˜๋„ค์š”. ๋‹ค์‹œ ๊ธฐ์–ต์„ ๋”๋“ฌ์–ด๋ณด๋‹ˆ , ์ €๋„ ์‚ฌ์‹ค ์ฒ˜์Œ์— ๊ทธ๋ƒฅ ์• ์ดˆ์— ์ฒญ์†Œํ•œ๊ฑฐ๋ผ๊ณ  countํ•˜๊ณ  ์‹œ์ž‘ํ• ๊นŒ ์•„๋‹ˆ๋ฉด ์–ด๋–ป๊ฒŒํ• ๊นŒ ? ๊ณ ๋ฏผํ–ˆ์—ˆ๋Š”๋ฐ์š” .
์ฆ‰, board[r][c] = 2๋ฅผ ํ•œ ์ด์œ ๋Š” dfs ์•ˆ์—์„œ๋Š” โ€œ์ฒญ์†Œ ์•ˆ ๋˜์–ด ์žˆ๋Š” ์นธโ€๋งŒ ์ฒญ์†Œํ•˜๋ฏ€๋กœ ์‹œ์ž‘ ์œ„์น˜๋ฅผ ๋ฏธ๋ฆฌ ์ฒญ์†Œ ์ฒ˜๋ฆฌํ•˜๊ณ , result = 1๋กœ ์‹œ์ž‘ํ•ด์„œ โ€œ๋ฐฉ 1๊ฐœ๋Š” ์ฒญ์†Œํ•จโ€์ด๋ผ๊ณ  ์…€ ์ˆ˜ ์žˆ๊ฒŒ ํ•œ ๊ฒƒ์ด๋ž€ ์˜๋„๊ฐ€ ์žˆ์—ˆ์–ด์š”.

๋งŒ์•ฝ์— ์ € ์ฝ”๋“œ๊ฐ€ ์—†๋‹ค๋ฉด dfs ๋‚ด๋ถ€์—์„œ ์ฒซ ์ฒญ์†Œ๊ฐ€ ์ผ์–ด๋‚˜๊ณ , count = 0์—์„œ ์‹œ์ž‘ํ•ด๋„ ๊ฒฐ๊ณผ๋Š” ๋™์ผํ•˜๋‹ค๊ณ  ์ƒ๊ฐํ–ˆ์–ด์š”. ์ฆ‰, ์‹œ์ž‘ ์œ„์น˜ ์ฒญ์†Œ๋ฅผ ์–ด๋””์„œ ์ •ํ• ์ง€์— ๋Œ€ํ•œ ์ƒ๊ฐ ์ฐจ์ด์˜€๋˜๊ฑฐ๊ฐ™์•„์š”.

board[r][c] = 2         // ๋ฏธ๋ฆฌ ์ฒญ์†Œํ–ˆ๋‹ค๊ณ  ์„ ์–ธํ•˜๊ณ 
var result = 1          //  "1์นธ ์ฒญ์†Œํ–ˆ์Œ" ์œผ๋กœ ์‹œ์ž‘
dfs(result, d, c, r)    // ๊ทธ๋ž˜์„œ dfs์—์„  ์ด๋ฏธ ์ฒญ์†Œ๋๋‹ค๊ณ  ์ „์ œ

ํ˜น์‹œ ๋‹ต๋ณ€์ด ๋˜์—ˆ์„๊นŒ์šฉ ? ๊ทผ๋ฐ ์‚ฌ์‹ค ์ค‘๋ณต์ฝ”๋“œ ๊ฐ™์•„์„œ ๋ฆฌํŒฉํ† ๋งํ•  ํ•„์š”๊ฐ€ ์žˆ์–ด๋ณด์ž…๋‹ˆ๋‹ค.

Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

์ข‹์€ ๋‹ต๋ณ€ ๊ฐ์‚ฌํ•ฉ๋‹ˆ๋‹ค!
์ฝ”ํ…Œ๋ฅผ ํ•˜๋ฉด ์ค‘๋ณต ์ฝ”๋“œ๊ฐ€ ์ •๋ง ๋งŽ์•„์ง€์ฃ !
๋ฌผ๋ก  ์ฝ”ํ…Œ์ธก๋ฉด์—์„œ๋Š” ๋ณ„ ๋ฌธ์ œ๊ฐ€ ์—†์œผ๋‹ˆ ์ž˜ ์ง  ์ฝ”๋“œ๋ผ๊ณ  ์ƒ๊ฐํ•ด์š”!!
์ €๋„ ์ด๋Ÿฐ ์ค‘๋ณต ์ฝ”๋“œ์— ๋Œ€ํ•œ ๋ฐ˜์„ฑ & ์ธ์‚ฌ์ดํŠธ๋ฅผ ์–ป๊ฒŒํ•ด์ฃผ์…”์„œ ๊ฐ์‚ฌํ•ฉ๋‹ˆ๋‹ค. :)

Comment on lines +56 to +73
Copy link
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

๋ฌธ์ œ๊ฐ€ ์—„์ฒญ ๋ณต์žกํ•˜๋‹ค๊ณ  ์ƒ๊ฐ์„ ํ–ˆ๋Š”๋ฐ, ์ด๋ ‡๊ฒŒ dfs๋กœ ์ •๋ฆฌ๋œ๊ฒƒ ๋ณด๋‹ˆ๊นŒ ํ›„์ง„์„ ๋’ค๋กœ ๋นผ์ฃผ๋ฉด turnleft์žˆ๋Š” ๊น”๋”ํ•œ dfs๋„ค์š” ์ž˜๋ดค์Šต๋‹ˆ๋‹ค ~ ๊ทธ๋ฆฌ๊ณ  ์ด ๋ฒ”์œ„ ์ฒ˜๋ฆฌ ํ•ด์ฃผ๋Š” ๊ฒƒ์€ ์‚ฌ๋žŒ๋งˆ๋‹ค ๋‹ค์–‘ํ•˜๋„ค์š” isRange ํ•จ์ˆ˜๋กœ ์•ˆ๋นผ์ฃผ๊ณ  ๊ทธ๋ƒฅ continue ๋ฐ”๋กœ ํ•ด์ฃผ๋‹ˆ๊นŒ ๊ฐ„๊ฒฐํ•ด์„œ ๋ณด๊ธฐ ์ข‹์•„์š” ๋‹ค์Œ์— ํ•œ ๋ฒˆ ์‚ฌ์šฉํ•ด๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค.

Copy link
Collaborator Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

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

Copy link
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

์—„~์ฒญ ์˜ˆ์ „์—๋ณด๊ณ  ๋ณธ์ ์ด์—†๋„ค์š”...!
์ฑ…์€ ๊ฐ€์ ธ์™”์–ด์š”!! ์˜ค๋Š˜๊ฐ€์„œ ํ•œ ๋ฒˆ ๋‘˜๋Ÿฌ๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค ๊ฐ์‚ฌํ•ด์š”

Copy link
Collaborator

@bishoe01 bishoe01 left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

์ฒญ์†Œ๊ธฐ๋ฌธ์ œ์ธ๋ฐ, ํ•˜๋ฉด์„œ ๋ญ”๊ฐ€ ์ƒ‰์น ๋กœ ์ธ์‹์„ ํ•ด์„œ ์ฃผ์„์ด ์ƒ‰์น ๋กœ ๋˜์–ด์žˆ์Šต๋‹ˆ๋‹ค..! ์˜๋ฏธ๋Š” ๊ฐ™์•„์š” ~

์ฒ˜์Œ์— ๊ทธ๋ƒฅ ํ…Œ๋‘๋ฆฌ๋งŒ ์•ˆ๋‚˜๊ฐ€๋ฉด ๋˜๋Š”์ง€์•Œ๊ณ  ํ’€์—ˆ๋Š”๋ฐ, 1๋„ ์•ˆ๋˜๋”๋ผ๊ตฌ์š”..! ์ €๋Š” 1์€ ์ด๋ฏธ ์ƒ‰์น ๋œ ๊ณต๊ฐ„์œผ๋กœ ์ธ์‹์„ ํ•˜๊ณ  ํ’€๋‹ค๊ฐ€ ์ข€ ์˜ค๋ž˜ ๊ฑธ๋ ธ์Šต๋‹ˆ๋‹ค..

์ด๋ฒˆ๊นŒ์ง€๋งŒ ์ข€ struct ์“ฐ๋ฉด์„œ ํ”„๋กœ๊ทธ๋žจ์Šค๋Ÿฝ๊ฒŒ ์งœ๋ณด๋Š” ์—ฐ์Šต์„ ํ–ˆ๋Š”๋ฐ, ์‹œ๊ฐ„์ด ๋„ˆ๋ฌด ์˜ค๋ž˜๊ฑธ๋ ค์„œ ๋‹ค์Œ๋ถ€ํ„ฐ๋Š” ์ข€ ์‹œ๊ฐ„์ง„์งœ ํƒ€์ด๋จธ ์žฌ๋ฉด์„œ 1์‹œ๊ฐ„ ์•ˆ์— ํ‘ธ์ˆ˜ ์žˆ๊ฒŒ๋” ์ปคํŠธ๋ผ์ธ์„ ๋‘ฌ๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค.
๊ทผ๋ฐ ์›๋ž˜ ์ด๋Ÿฐ์‹์œผ๋กœ ์ž˜ ์•ˆ์งœ๋ฒ„๋ฆ‡ํ•ด์„œ ์ข€ ํ•™์Šต์€ ํ•  ์ˆ˜ ์žˆ์—ˆ๋˜ ๊ฒƒ ๊ฐ™์•„์š”.. ์•ˆ๋ฐ”์ ๋•Œ ์–ด๋ ค์šด๋ฌธ์ œ ๊ฐ€๋”ํ•ด๋ณด๋ฉด ์ข‹์„๋“ฏ?!

import Foundation

var Direction: [Int: (i: Int, j: Int)] = [0: (-1, 0), 1: (0, 1), 2: (1, 0), 3: (0, -1)]

struct Robot {
    var direction: Int
    var position: (i: Int, j: Int)
    let N: Int
    let M: Int
    var count = 1
    // ๊ธธ ์„ ์ƒ๋‹˜๋ฌธ์ œ์—์„œ๋ณธ ์ขŒํ‘œ ํŒ๋‹จ contains๋กœ ํ•ด์ฃผ๊ธฐ
    func isRange(_ i: Int, _ j: Int) -> Bool {
        return (0 ..< self.N).contains(i) && (0 ..< self.M).contains(j)
    }

    mutating func turnLeft() {
        self.direction = (self.direction + 3) % 4
    }

    // 4๋ฐฉํ–ฅ์ค‘์— ์ƒ‰์น ํ•  ๊ณณ ์žˆ๋‚˜์š” ?!
    func judgeAll(_ graph: [[Int]]) -> Bool {
        for dir in 0 ..< 4 {
            let next_move = Direction[dir]!
            let next_pos = (i: self.position.i + next_move.i, j: self.position.j + next_move.j)
            if self.isRange(next_pos.i, next_pos.j), graph[next_pos.i][next_pos.j] == 0 {
                return true
            }
        }
        return false
    }

    // ์•ž์œผ๋กœ๋Š” ๊ฐˆ ์ˆ˜ ์žˆ๋‚˜์š” ? (์ƒ‰์น  ๊ฐ€๋Šฅ? )
    func judgeForward(_ graph: [[Int]]) -> Bool {
        let next_move = Direction[self.direction]!
        let next_pos = (i: self.position.i + next_move.i, j: self.position.j + next_move.j)
        return self.isRange(next_pos.i, next_pos.j) && graph[next_pos.i][next_pos.j] == 0
    }

    // ๋ฐฉํ–ฅ๋Œ€๋กœ ์ด๋™ํ–ˆ์„๋•Œ์˜ ํฌ์ง€์…˜
    func forwardPosition() -> (i: Int, j: Int) {
        let next_move = Direction[self.direction]!
        let next_pos = (i: self.position.i + next_move.i, j: self.position.j + next_move.j)
        return next_pos
    }

    // ํ›„์ง„
    func goBack() -> (i: Int, j: Int) {
        // ๋’ค๋Œ๊ธฐ
        let next_move = Direction[(self.direction + 2) % 4]!
        let next_pos = (i: self.position.i + next_move.i, j: self.position.j + next_move.j)
        return next_pos
    }
}

func solution(_ N: Int, _ M: Int, _ robot: (i: Int, j: Int, d: Int), _ graph: [[Int]]) -> Int {
    var graph = graph
    var robot = Robot(direction: robot.d, position: (i: robot.i, j: robot.j), N: N, M: M)
    graph[robot.position.i][robot.position.j] = 2
    while true {
        // 4๋ฐฉํ–ฅ ์ค‘์— ์ƒ‰์น ํ•  ๊ณณ ์žˆ์–ด์š” !
        if robot.judgeAll(graph) {
            ์ฃผ๋ณ€ํƒ๋ฐฉ: for _ in 0 ..< 4 {
                // ์žˆ์œผ๋‹ˆ๊นŒ 2๋ฒˆ์ƒํ™ฉ -> ์ผ๋‹จ ์ขŒํšŒ์ „
                robot.turnLeft()
                // ์ขŒํšŒ์ „ ํ•˜๋‹ˆ๊นŒ ์ด๊ฑฐ ์ƒ‰์น  ๊ฐ€๋Šฅ ?
                if robot.judgeForward(graph) {
                    let nextPosition = robot.forwardPosition()
                    robot.position = nextPosition
                    // 0์ด๋ž‘ 1์„ ํ”ผํ•ด์„œ ๊ทธ๋ƒฅ 2๋ผ๊ณ  ๋‹ฌ์Œ
                    graph[nextPosition.i][nextPosition.j] = 2
                    robot.count += 1
                    break ์ฃผ๋ณ€ํƒ๋ฐฉ
                }
            }
        }
        else {
            let backPosition = robot.goBack()
            // ๋ฒฝ์— ์•ˆ๋‹ฟ์œผ๋ฉด์„œ๋„ ๊ฐˆ ์ˆ˜ ์žˆ๋Š” ๊ณณ์ธ์ง€ ํŒ๋‹จ
            if robot.isRange(backPosition.i, backPosition.j) && graph[backPosition.i][backPosition.j] != 1 {
                robot.position = backPosition
            }
            else {
                break
            }
        }
    }
    return robot.count
}

๋กœ์ง์€ ๋ฌธ์ œ์— ๋‚˜์˜จ ์ˆœ์„œ๋Œ€๋กœ ์ธ๊ฒƒ๊ฐ™์•„์š”. ๋ฐฉํ–ฅ๋„ ์žˆ๊ณ  ํ›„์ง„๋„ํ•˜๊ณ  ํ•˜๋‹ค๋ณด๋‹ˆ ์ข€ ๋ณต์žกํ•ด์ง„๋“ฏ..!

์ „์ฒด ๋กœ์ง

  1. 4๋ฐฉํ–ฅ ์ค‘์— ์ƒ‰์น ํ•  ๊ณณ ์žˆ๋Š”์ง€ ํŒ๋‹จ
    1 - 2. ๊ทธ๋Ÿฌ๋ฉด ์ด์ œ๋ถ€ํ„ฐ turnLeftํ•ด์ฃผ๋ฉด์„œ ๋ˆˆ ์•ž์— ์ƒ‰์น ํ•  ๊ณณ ์žˆ๋Š”์ง€ ํŒ๋‹จ
    1 - 3. ์ฐพ์œผ๋ฉด count +1

  2. 4๋ฐฉํ–ฅ์ค‘์— ์ƒ‰์น ํ• ๊ฑฐ ์—†์Œ
    2 - 1. ๊ทธ๋Ÿฌ๋ฉด ํ›„์ง„ํ•ด์ฃผ๋ฉด์„œ ๋ฒฝ์ธ์ง€ ํŒ๋‹จ
    2 - 2. ๋ฒฝ์ด ์•„๋‹ˆ๋ฉด ํ›„์ง„ํ•ด์ฃผ๊ณ  ๋‹ค์‹œ 1๋ฒˆ์œผ๋กœ ๋Œ์•„๊ฐ€๊ธฐ
    2 - 3. ๋ฒฝ์ด๋ฉด ๋๋‚ด๊ธฐ

Copy link
Collaborator

@MuchanKim MuchanKim left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

๋‹ค๋ฅธ๋ถ„๋“ค ํ‘ผ ๊ฑฐ๋ณด๋ฉด ํ™•์‹คํžˆ ์ฝ”ํ…Œ๋ฅผ ์ค€๋น„ํ•˜๋Š” ๋А๋‚Œ์ด ํ™• ๋“œ๋„ค์š”.(๋Œ€์ถฉ ๊ณ ์ˆ˜๋ผ๋Š” ๋œป)

์ „ ํšจ์œจ๋ณด๋‹ค๋Š” ๊ตฌ์กฐ์ ์œผ๋กœ ์ž˜์งœ๋Š”๋ฐ ์ค‘์ ์„ ๋‘” ๊ฒƒ ๊ฐ™์•„์š”. ๊ทธ๋ ‡์ง€๋งŒ. ์ž˜์งฐ๋‹ค๊ณ ๋Š” ์ƒ๊ฐ์ด ์•ˆ๋“œ๋„ค์š”.
๊ธฐ์กด์— ํ•˜๋“œ์ฝ”๋”ฉํ–ˆ๋‹ค๊ฐ€ ํ•จ์ˆ˜๋กœ ๋นผ๋ ค๋‹ˆ๊นŒ ๋„ˆ๋ฌด ๋ณต์žกํ•˜๊ฒŒ ํ•˜๋Š” ๊ฒƒ ๊ฐ™๊ณ  ๋จธ๋ฆฌ์•„ํŒŒ์„œ ๋‚ด๋ถ€์— ํ•จ์ˆ˜๋กœ ๋ถ„๋ฆฌํ•ด๋’€์–ด์š”. ๊ทผ๋ฐ ์ด๊ฒŒ ์ค‘์ฒฉํ•จ์ˆ˜๊ฐ€ ๋งŽ์•„์ง€๋‹ˆ๊นŒ ์•ˆ์ข‹์•„๋ณด์ด๋„ค์š”.

์—ด๊ฑฐํ˜•๋„ ์ž˜ ํ™œ์šฉํ•˜๊ณ  ์‹ถ์–ด์„œ ์ตœ๊ทผ ๊ตฌํ˜„๋ฌธ์ œ์— ๋งŽ์ด ์“ฐ๊ณ ์žˆ๋Š”๋ฐ ์ด๋ฒˆ์— ์ด๊ฑฐ์“ฐ๋А๋ผ ๋” ์‹œ๊ฐ„ ๊ฑธ๋ฆฐ ๋“ฏ ๋„ˆ๋ฌด ์–ด๋ ต๊ฒŒ ํ’€๋ ค๊ณ  ํ–ˆ๋‚˜๋ด…๋‹ˆ๋‹ค~~

+ ๋ฐ๋ฏธ์•ˆ ์ฝ”๋“œ๋ž‘ ์„ฑ๋Šฅ ๋น„๊ตํ•ด๋ณด๋ ค๊ณ  ๋Œ๋ ค๋ดค๋Š”๋ฐ ์ปดํŒŒ์ผ ์—๋Ÿฌ๋œจ๋˜๋ฐ ์ฝ”๋“œ ์ž˜๋ชป์˜ฌ๋ฆฌ์‹ ๊ฒŒ ์•„๋‹Œ๊ฐ€..! ํ™•์ธ๋ถ€ํƒ๋“œ๋ฆฌ์˜ต๋‹ˆ๋‹ค.

// ์ฒญ์†Œ ์ƒํƒœ ๊ด€๋ฆฌํ•  ๋ฐฐ์—ด ํ•„์š”ํ•จ - 0(์ฒญ์†Œ ์•ˆ๋จ), 1(์ฒญ์†Œ๋จ), 2(๋ฒฝ)์œผ๋กœ ์ €์žฅํ•˜์ž
// ๋ฐฉํ–ฅ ์ „ํ™˜์€ dx, dy ๋ฐฐ์—ด๋กœ ๊ด€๋ฆฌํ•˜๋ฉด ์‰ฌ์šธ ๋“ฏ -> ์—ด๊ฑฐํ˜•์ด ๋” ์ข‹์•„๋ณด์ž„. - ๋ถ(0), ๋™(1), ๋‚จ(2), ์„œ(3)
// ๋กœ๋ด‡ ํ˜„์žฌ ์œ„์น˜/๋ฐฉํ–ฅ ๋”ฐ๋กœ ๋ณ€์ˆ˜ ๊ด€๋ฆฌํ•˜๊ณ , ๊ณ„์† ๊ฐฑ์‹ ํ•ด๊ฐ€๋ฉด์„œ ์›€์ง์ž„ ์ถ”์ 
// 1. ํ˜„์žฌ ์œ„์น˜ ์ฒญ์†Œ
// 2. ์™ผ์ชฝ๋ถ€ํ„ฐ ๋Œ๋ฉด์„œ ๊ฐˆ ๊ณณ ์žˆ๋‚˜ ํ™•์ธ (๋ฐ˜์‹œ๊ณ„ ํšŒ์ „)
// - ์ฒญ์†Œํ•  ๊ณณ ์žˆ์œผ๋ฉด ๊ทธ๋ฆฌ๋กœ ์ด๋™ํ•˜๊ณ  1๋ฒˆ์œผ๋กœ ๋Œ์•„๊ฐ€๊ธฐ
// - 4๋ฐฉํ–ฅ ๋ชจ๋‘ ์ฒญ์†Œ๋๊ฑฐ๋‚˜ ๋ฒฝ์ด๋ฉด ํ›„์ง„ ์‹œ๋„
// 3. ํ›„์ง„๋„ ๋ชป ํ•˜๋ฉด ์ž‘์—… ์ข…๋ฃŒ, ์ฒญ์†Œํ•œ ์นธ ์ˆ˜ ๋ฐ˜ํ™˜
// ๋กœ๋ด‡์ด ๋ฐ”๋ผ๋ณด๋Š” ๋ฐฉํ–ฅ ํšŒ์ „์€ (dir + 3) % 4
// ํ›„์ง„์€ ํ˜„์žฌ ๋ฐฉํ–ฅ์—์„œ ์ •๋ฐ˜๋Œ€๋กœ (dir + 2) % 4

import Foundation

typealias Position = (x: Int, y: Int)

enum Direction: Int {
    case north = 0
    case east = 1
    case south = 2
    case west = 3
    
    var move: Position {
        switch self {
        case .north: return (-1, 0)  
        case .east:  return (0, 1)   
        case .south: return (1, 0)  
        case .west:  return (0, -1)  
        }
    }
    
    // ๋ฐ˜์‹œ๊ณ„ ๋ฐฉํ–ฅ ํšŒ์ „
    func turnLeft() -> Direction {
        return Direction(rawValue: (self.rawValue + 3) % 4)!
    }
    
    // ํ›„์ง„ ๋ฐฉํ–ฅ (180๋„ ํšŒ์ „)
    func reverse() -> Direction {
        return Direction(rawValue: (self.rawValue + 2) % 4)!
    }
}

// input
let boardSize = readLine()!.split(separator: " ").map { Int($0)! }
let (N, M) = (boardSize[0], boardSize[1])

let robotInfo = readLine()!.split(separator: " ").map { Int($0)! }
var (r, c, d) = (robotInfo[0], robotInfo[1], robotInfo[2])

var map = Array(repeating: Array(repeating: 0, count: M), count: N)
for i in 0..<N {
    let row = readLine()!.split(separator: " ").map { Int($0)! }
    for j in 0..<M {
        if row[j] == 1 {
            map[i][j] = 2
        }
    }
}

func solution(position: Position, direction: Int, roomSize: (height: Int, width: Int)) -> Int {
    // ๋กœ๋ด‡์˜ ํ˜„์žฌ ์ƒํƒœ
    var currentPosition = position
    var currentDirection = Direction(rawValue: direction)!
    var numberOfCleanedBlocks = 0
    
    // ์ขŒํ‘œ๊ฐ€ ๋งต ๋‚ด์— ์žˆ๋Š”์ง€ ํ™•์ธํ•˜๋Š” ํ•จ์ˆ˜
    func isInBounds(_ position: Position) -> Bool {
        return position.x >= 0 && position.x < roomSize.height && 
               position.y >= 0 && position.y < roomSize.width
    }
    
    // ์ฃผ์–ด์ง„ ๋ฐฉํ–ฅ์œผ๋กœ ์ด๋™ํ–ˆ์„ ๋•Œ์˜ ์ƒˆ ์œ„์น˜ ๊ณ„์‚ฐ
    func positionAfterMove(from position: Position, direction: Direction) -> Position {
        let move = direction.move
        return (position.x + move.x, position.y + move.y)
    }
    
    while true {
        // ํ˜„์žฌ ์œ„์น˜ ์ฒญ์†Œ
        if map[currentPosition.x][currentPosition.y] == 0 {
            map[currentPosition.x][currentPosition.y] = 1
            numberOfCleanedBlocks += 1
        }
        
        var foundCleanableBlock = false
        
        for _ in 0..<4 {
            // ์™ผ์ชฝ์œผ๋กœ ํšŒ์ „ (๋ฐ˜์‹œ๊ณ„ 90๋„)
            currentDirection = currentDirection.turnLeft()
            
            // ํšŒ์ „ ํ›„ ๋ฐ”๋ผ๋ณด๋Š” ๋ฐฉํ–ฅ์˜ ์œ„์น˜ ๊ณ„์‚ฐ
            let nextPosition = positionAfterMove(from: currentPosition, direction: currentDirection)
            
            // ๋ฒ”์œ„ ๋‚ด์— ์žˆ๊ณ  ์ฒญ์†Œํ•  ์ˆ˜ ์žˆ๋Š” ๋นˆ ๊ณต๊ฐ„์ธ ๊ฒฝ์šฐ
            if isInBounds(nextPosition) && map[nextPosition.x][nextPosition.y] == 0 {
                currentPosition = nextPosition  
                foundCleanableBlock = true
                break
            }
        }
        
        // ์ฒญ์†Œํ•  ๊ณต๊ฐ„์ด ์—†๋Š” ๊ฒฝ์šฐ -> ํ›„์ง„ ๋˜๋Š” ์ข…๋ฃŒ
        if !foundCleanableBlock {
            // ํ›„์ง„ํ•  ์œ„์น˜
            let backPosition = positionAfterMove(from: currentPosition, direction: currentDirection.reverse())
            
            // ํ›„์ง„ํ•  ์ˆ˜ ์žˆ๋Š”์ง€ ํ™•์ธ
            if isInBounds(backPosition) && map[backPosition.x][backPosition.y] != 2 {
                currentPosition = backPosition  
            } else {
                break
            }
        }
    }
    
    return numberOfCleanedBlocks
}

let res = solution(position: (r, c), direction: d, roomSize: (N, M))
print(res)

Comment on lines +24 to +26
Copy link
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

์ž…๋ ฅ ์กฐ๊ฑด ์ฃผ์„์œผ๋กœ ์ ์–ด๋†“์œผ์‹œ๋Š”๊ฑฐ ๊ต‰์žฅํžˆ ์ข‹์•„๋ณด์ž…๋‹ˆ๋‹ค!! ์ €๋„ ์ด๋ ‡๊ฒŒ ํ•ด์•ผ๊ฒ ์–ด์š”^~^

+ ์ž…๋ ฅ ๋ถ€๋ถ„ ๊ฐ€์ ธ๋‹ค์ผ์–ด์šฉ!

@sep037
Copy link
Collaborator

sep037 commented May 20, 2025

์ €๋Š” ๋„ˆ๋ฌด ์˜ค๋ž˜ ๊ฑธ๋ ค์„œ ๋ธ”๋กœ๊ทธ์—์„œ ์—ฌ๋Ÿฌ๊ฐœ ์งœ์ง‘๊ธฐ ํ–ˆ์๋‹ˆ๋‹ค ..
์ด๋ ‡๊ฒŒ ์ด๋™ ์ขŒํ‘œ ๊ณ„์‚ฐํ•˜๊ณ  ๋จธ๋ฆฟ์†์œผ๋กœ ๊ทธ๋ ค์•ผ ํ•˜๋Š” ๋ฌธ์ œ๋“ค์€ ํ•ญ์ƒ ๊ฒ ๋จน๊ณ  ์‹œ์ž‘ํ•˜๋Š” ๊ฒƒ ๊ฐ™์•„์š” (์–ด๋ ค์šธ ๊ฒƒ ๊ฐ™๋‹ค๋Š”)
๋ฐ๋ฏธ์•ˆ์ด ์„ ์‚ฌํ•˜์‹  ๋กœ๋ด‡์ฒญ์†Œ ๋ฌธ์ œ๋ฅผ ๋ฐœํŒ ์‚ผ์•„ ๋” ์‰ฌ์šด ์ขŒํ‘œ ๋ฌธ์ œ(?)๋กœ ์ฐจ๊ทผ ์ฐจ๊ทผ ์Œ“์•„๋‚˜๊ฐ€๋ณด๋ ค ํ•ฉ๋‹ˆ๋‹ค. ๐Ÿฅน
๋กœ๋ด‡ ์ฒญ์†Œ๊ธฐ๋ฅผ ํ˜ผ์ž ํ‘ธ๋Š” ๊ทธ๋‚ ๊นŒ์ง€
๋Šฆ์–ด์„œ ์ฃ„์†กํ•ด์š” ! ใ… 

//
//  main.swift
//  14503
//
//  Created by Seungeun Park on 5/19/25.
//

import Foundation

// ๋ฐฉํ–ฅ์„ ๋‚˜ํƒ€๋‚ด๋Š” ์ƒ์ˆ˜: ๋ถ(0), ๋™(1), ๋‚จ(2), ์„œ(3)
// ๊ฐ๊ฐ์˜ ๋ฐฉํ–ฅ์— ๋Œ€ํ•œ ์ด๋™ ์ขŒํ‘œ ๋ณ€ํ™”๋Ÿ‰ (dy, dx)
let dy = [-1, 0, 1, 0] // ๋ถ, ๋™, ๋‚จ, ์„œ
let dx = [0, 1, 0, -1]

let size = readLine()!.split(separator: " ").map { Int($0)! }
let N = size[0], M = size[1]

let robotInit = readLine()!.split(separator: " ").map { Int($0)! }
var r = robotInit[0], c = robotInit[1], d = robotInit[2] // ๋กœ๋ด‡์˜ ์ดˆ๊ธฐ ์œ„์น˜์™€ ๋ฐฉํ–ฅ

// ๋ฐฉ์˜ ์ƒํƒœ ์ €์žฅ: 0์€ ์ฒญ์†Œ ๊ฐ€๋Šฅ, 1์€ ๋ฒฝ
var map: [[Int]] = []
for _ in 0..<N {
    map.append(readLine()!.split(separator: " ").map { Int($0)! })
}

// ๋ฐฉ๋ฌธ ์—ฌ๋ถ€ ํ™•์ธ์šฉ ๋ฐฐ์—ด (์ฒญ์†Œํ–ˆ๋Š”์ง€ ์—ฌ๋ถ€)
var cleaned = Array(repeating: Array(repeating: false, count: M), count: N)
var cleanedCount = 0 // ์ฒญ์†Œํ•œ ์นธ ๊ฐœ์ˆ˜

while true {
    // ํ˜„์žฌ ์œ„์น˜๊ฐ€ ์ฒญ์†Œ๋˜์ง€ ์•Š์•˜์œผ๋ฉด ์ฒญ์†Œ
    if !cleaned[r][c] {
        cleaned[r][c] = true
        cleanedCount += 1
    }

    var moved = false // 4๋ฐฉํ–ฅ ์ค‘ ์ด๋™ํ–ˆ๋Š”์ง€ ์—ฌ๋ถ€

    // ๋ฐ˜์‹œ๊ณ„ ๋ฐฉํ–ฅ์œผ๋กœ 4๋ฒˆ๊นŒ์ง€ ํƒ์ƒ‰
    for _ in 0..<4 {
        // ์™ผ์ชฝ ๋ฐฉํ–ฅ์œผ๋กœ ํšŒ์ „
        d = (d + 3) % 4 // ๋ถ(0) โ†’ ์„œ(3) โ†’ ๋‚จ(2) โ†’ ๋™(1) ์ˆœ์„œ

        let nr = r + dy[d]
        let nc = c + dx[d]

        // ์ด๋™ํ•  ์นธ์ด ์ฒญ์†Œ ์•ˆ ๋œ ๋นˆ ์นธ์ด๋ฉด ์ด๋™
        if map[nr][nc] == 0 && !cleaned[nr][nc] {
            r = nr
            c = nc
            moved = true
            break // ์ „์ง„ํ–ˆ์œผ๋ฏ€๋กœ ๋‹ค์‹œ 1๋ฒˆ๋ถ€ํ„ฐ ์‹œ์ž‘
        }
    }

    //๋„ค ๋ฐฉํ–ฅ ๋ชจ๋‘ ์ฒญ์†Œ ๋ชปํ•˜๋ฉด โ†’ ํ›„์ง„
    if !moved {
        let back = (d + 2) % 4 // ํ˜„์žฌ ๋ฐฉํ–ฅ์˜ ๋ฐ˜๋Œ€ ๋ฐฉํ–ฅ
        let br = r + dy[back]
        let bc = c + dx[back]

        // ๋’ค๊ฐ€ ๋ฒฝ์ด๋ฉด ์ข…๋ฃŒ
        if map[br][bc] == 1 {
            break
        } else {
            // ํ›„์ง„์€ ๋ฐฉํ–ฅ ๊ทธ๋Œ€๋กœ ์œ ์ง€ํ•˜๋ฉด์„œ ์œ„์น˜๋งŒ ์ด๋™
            r = br
            c = bc
        }
    }
}

print(cleanedCount)

@YooGyeongMo YooGyeongMo merged commit 61ed446 into main May 25, 2025
2 checks passed
Copy link
Collaborator Author

@YooGyeongMo YooGyeongMo left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

ใ…‡ใ…ใ…‡ใ„ดใ…ใ„ดใ…‡ใ„ดใ…ใ…‡

Comment on lines +76 to +79
Copy link
Collaborator Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

dใ…˜ ๋ฐ๋ฏธ์•ˆ ์ด๋ ‡๊ฒŒ ์ ‘๊ทผํ•˜์…งใ„ฑใ„ด์š” !

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Projects

None yet

Development

Successfully merging this pull request may close these issues.

7 participants