๋๋ ํด๋น ๋ฌธ์ ๋ฅผ ์์ ํ์์ผ๋ก ํ์๋ค. ๊ฐํ DFS๋ ์๊ฐํด๋ด์ง๋ ๋ชปํจ,,,
์์ ํ์์ผ๋ก ๋ชจ๋ ๋ชจ์์ ๋ํ ํจ์๋ฅผ ๋ฐ๋ก ์์ฑํ๊ณ ํ์ด์ ์ฝ๋๊ฐ ๋ฌด๋ ค 287์ค์ด๋ ๋์๋ค. ใ ใ ใ ใ (์ฃผ์ํฌํจ)
๊ตฌํ์ค๋ ฅ๋ ์ค์ํ์ง๋ง, ์ค๋ต๋ ธํธ๋ ๊ผญ DFS๋ก ํด๋ณด์.๐๐ป
๐ ๋ฌธ์
https://www.acmicpc.net/problem/14500
๐ ๋์ ํ์ด
์ด๊ฒ๋ ์์ ์ ์คํฐ๋ํ ๋ ํ ๋ฒ ๋ดค๋ ๋ฌธ์ ๋ค. ๊ทธ๋์, ๋ชจ๋ ๊ฒฝ์ฐ๋ฅผ ๋ค ์ดํด๋ด์ผํ๋ค๋ ์ฌ์ค์ ์๊ณ ์์๋ค. (์์ ํ์(๋ธ๋ฃจํธํฌ์ค)๋ฌธ์ ์ด๊ธฐ๋ํ๊ณ !) ๊ทธ๋์ ๊ทธ๋ฅ,, ๋ณด์๋ง์ ์จ์ด ํฑ ๋งํ์ง๋ง, ๊ตฌํํด๋ณด๊ธฐ๋ก ํ๋ค.
ํ ํธ๋ฆฌ์ค ์กฐ๊ฐ์ ๋ค์ฏ๊ฐ๊ฐ ์๋ค. ํด๋น ๋ค์ฏ๊ฐ ๋ชจ์์ ํ์ ๋ ๊ฐ๋ฅํ๊ณ , ๋์นญ๋ ๊ฐ๋ฅํ๋ค. ํ์ ์ด์ผ for ๋ฌธ์ผ๋ก ๋๋ฆฌ๋ฉด ๋๋ค๊ณ ์๊ฐํ๊ณ ๋์นญ์ ๋ฐ๋ก ๋ง๋ค์ด์ ์๋ก์ด๋ชจ์์ผ๋ก ๋ค๋ค์ค์ผ๊ฒ ๋ค๊ณ ํ๋จํ๋ค.
๋ด๊ฐ ํ์ดํ ๋ฐฉ๋ฒ์ ๊ฐ์ฅ ํต์ฌ์ ํ์นธ์ ์์น ํด์ค๋ค๋ ์์ผ๋ก ์ ๊ทผํ๋ค.
์์ bfs๋ฌธ์ ๋ฅผ ํ๋ฏ dx, dy ๋ฐฉํฅํค๋ฅผ ์ค์ ํด๋์. ใ ก ๋ชจ์์ ์์๋ก ๋ค๋ฉด, for๋ฌธ์ 4๋ฒ ๋๋ ค์ ์ค๋ฅธ์ชฝ์นธ์ ํ๋์ฉ ํด๋น ์์น์ ์๋ ๋ด๋ถ์ ์๋ฅผ ๋ํด์ฃผ๋ฉด ๋๋ค.
๊ทธ๋ผ L ๋ชจ์์ฒ๋ผ ๊บพ์ธ๊ฑด ์ด๋ป๊ฒ ํ ๊น?
์ด๋ ๊ฒ ํ๋ฉด ๋๋ค. ์ฆ, ๋ฐฉํฅ์ ํ์ด ํ๋ฒ ํ์ํ๋ค. ์ง๊ธ ํด๋น L์ ๋ณด๋ฉด, ์ค๋ฅธ์ชฝ์ผ๋ก ์์น ์ด ๋๋ค๊ฐ, ๋ฐฉํ์ '์'๋ก ๋ฐ๋์ด์ผํ๋ค. ์ด๊ฒ์ ๋๋ direction์ด๋ผ๊ณ ๋ฐ๋ก ์ง์ ํด์ฃผ์๋ค. ๋ด๊ฐ ์ง์ ํด์ค ๋ฐฉํฅํค๋ก ๋ณด๋ฉด, '์ค๋ฅธ์ชฝ'์ dx,dy์ธ๋ฑ์ค 3์ด๋ค. 3๋ฐฉํฅ์ผ๋ก ์งํํ๋ค๊ฐ, 0 ๋ฐฉํฅ์ผ๋ก ๋ฐ๊ฟ์ฃผ๋ฉด ๋๋ค.
๋ํ์ ํ์ ๋ ๋ง์ฐฌ๊ฐ์ง๋ค. ๋ํ์ ํ์ ํ๋ ๊ฒ๋, ์์น ํ๋ ๋ฐฉํฅ์ผ๋ก ์๊ฐํ๋ฉด๋๋ค. ์ค๋ฅธ์ชฝ์ผ๋ก ๊ฐ๋ฉด์ ์์น ํ๋ค๊ฐ, ๋ฐฉํฅ์ ๋ฐ๊ฟ์ ์๋ก ๊ฐ๋ฉด์ ์์น ํ๊ณ , ๋ ๋ฐฉํฅ์ ๋ฐ๊ฟ์ ์ผ์ชฝ์ผ๋ก ๊ฐ๋ฉด์ ์์น ํ๊ณ ,, ์ด๋ฐ์์ผ๋ก ์๊ฐํ๋ฉด๋๋ค!
๋จธ๋ฆฟ์์์ ๊ทธ๋ฆผ์ ๊ทธ๋ฆฐ๋ค๊ณ ์๊ฐํ๊ณ ํ์ ํ๋ฉด์ ,, ๊ทธ๋ฆฌ๋ฉด์,, ํ์๋ค. ๐คฏ๐คฏ๐คฏ๐คฏ
๐ ์ถ๊ฐ๋ก, ๋์นญ์ด ํ์ํ ๋ํ์ ๋ฌด์์ด ์์๊น?
๋์นญ์ด ํ์ํ ๋ํ์, L๋ชจ์๊ณผ Z ๋ชจ์ ๋๊ฐ ๋ฟ์ด์๋ค. l ๋ชจ์, ใ ๋ชจ์, ใ ๋ชจ์์ ํ์ ์ผ๋ก ๋ชจ๋ ๋ชจ์์ด ๊ฐ๋ฅํ๋ค. ใ ๋ ์ค๋ฅธ์ชฝ์ผ๋ก ๋์นญํ๋ฉด ใ ๋ชจ์์ด์ง๋ง, ๊ฐ๋จํ๊ฒ ์๊ฐํ๋ฉด ใ ๋ฅผ ๋๋ฒ ํ์ ํ๋ฉด ใ ๊ฐ ๋์จ๋ค. ๊ทธ๋์ ๋ฐ๋ก ๋์นญ์ ๋ํ func์ ์๊ฐํ์ง ์์๋ ๋๋ค.
์ด ๋ชจ๋ ๊ฒ๋ค์ ๊ตฌํํด๋ณด์...
๐ ์ ๋ต์ฝ๋
์๊ฐ์ด๋ 2์ด๊ฐ ์ฃผ์ด์ก๋ค. ์ด 2์ต๋ฒ ๋์๊ฐ ์ ์๋ค. ์์ ํ์์ผ๋ก ํ์ด๋ ์๊ฐ์ ์ถฉ๋ถํ๋ค
import Foundation
// ํ์ํ ๋ณ์ ์ ์ธ
let nm = readLine()!.split(separator: " ").map{ Int($0)! }
var tetroMap = [[Int]]()
for _ in 0..<nm[0] {
let temp = readLine()!.split(separator: " ").map { Int($0)! }
tetroMap.append(temp)
}
// ์ ์๋ ์ผ ์ค
let dx = [-1, 1, 0, 0]
let dy = [0, 0, -1, 1]
// ํ
ํธ๋ก๋ฏธ๋
ธ ๋ชจ์๋ณ ํฉ์ ๊ตฌํด์ฃผ๋ func
// ๋์นญ์ด ํ์ํ ๋
์์ L ๊ณผ Z
// 1. ใ
ก
private func tetro_1(direction: Int, nx: Int, ny: Int) -> Int {
var nx = nx
var ny = ny
var total = 0
for _ in 0..<4 {
if nx < 0 || ny < 0 || nx >= nm[0] || ny >= nm[1] {
return 0
}
total += tetroMap[nx][ny]
nx += dx[direction]
ny += dy[direction]
}
return total
}
// 2. ใ
private func tetro_2(direction: Int, nx: Int, ny: Int) -> Int {
var total = 0
if nx < 0 || ny < 0 || nx+1 >= nm[0] || ny+1 >= nm[1] {
return 0
}
total += tetroMap[nx][ny]
total += tetroMap[nx+1][ny]
total += tetroMap[nx][ny+1]
total += tetroMap[nx+1][ny+1]
return total
}
// 3. L์ ๋์นญ
private func tetro_3(direction: Int, nx: Int, ny: Int) -> Int {
var direction = direction
var nx = nx
var ny = ny
var total = 0
for _ in 0..<3 {
if nx < 0 || ny < 0 || nx >= nm[0] || ny >= nm[1] {
return 0
}
total += tetroMap[nx][ny]
nx += dx[direction]
ny += dy[direction]
}
nx -= dx[direction]
ny -= dy[direction]
if direction == 3 {
direction = 1
} else if direction == 0 {
direction = 3
} else if direction == 2 {
direction = 0
} else {
direction = 2
}
nx += dx[direction]
ny += dy[direction]
if nx < 0 || ny < 0 || nx >= nm[0] || ny >= nm[1] {
return 0
}
total += tetroMap[nx][ny]
return total
}
// 3.1 L
private func tetro_3_symmetry(direction: Int, nx: Int, ny: Int) -> Int {
var direction = direction
var nx = nx
var ny = ny
var total = 0
for _ in 0..<3 {
if nx < 0 || ny < 0 || nx >= nm[0] || ny >= nm[1] {
return 0
}
total += tetroMap[nx][ny]
nx += dx[direction]
ny += dy[direction]
}
nx -= dx[direction]
ny -= dy[direction]
if direction == 3 {
direction = 0
} else if direction == 0 {
direction = 2
} else if direction == 2 {
direction = 1
} else {
direction = 3
}
nx += dx[direction]
ny += dy[direction]
if nx < 0 || ny < 0 || nx >= nm[0] || ny >= nm[1] {
return 0
}
total += tetroMap[nx][ny]
return total
}
// 4. Z
private func tetro_4(direction: Int, nx: Int, ny: Int) -> Int {
var direction = direction
var nx = nx
var ny = ny
var total = 0
for _ in 0..<2 {
if nx < 0 || ny < 0 || nx >= nm[0] || ny >= nm[1] {
return 0
}
total += tetroMap[nx][ny]
nx += dx[direction]
ny += dy[direction]
}
nx -= dx[direction]
ny -= dy[direction]
if direction == 3 {
direction = 1
} else if direction == 0 {
direction = 3
} else if direction == 2 {
direction = 0
} else {
direction = 2
}
nx += dx[direction]
ny += dy[direction]
if nx < 0 || ny < 0 || nx >= nm[0] || ny >= nm[1] {
return 0
}
total += tetroMap[nx][ny]
if direction == 1 {
direction = 3
} else if direction == 3 {
direction = 0
} else if direction == 0 {
direction = 2
} else {
direction = 1
}
nx += dx[direction]
ny += dy[direction]
if nx < 0 || ny < 0 || nx >= nm[0] || ny >= nm[1] {
return 0
}
total += tetroMap[nx][ny]
return total
}
// 4.1 Z์ ๋์นญ
private func tetro_4_symmetry(direction: Int, nx: Int, ny: Int) -> Int {
var direction = direction
var nx = nx
var ny = ny
var total = 0
for _ in 0..<2 {
if nx < 0 || ny < 0 || nx >= nm[0] || ny >= nm[1] {
return 0
}
total += tetroMap[nx][ny]
nx += dx[direction]
ny += dy[direction]
}
nx -= dx[direction]
ny -= dy[direction]
if direction == 3 {
direction = 0
} else if direction == 0 {
direction = 2
} else if direction == 2 {
direction = 1
} else {
direction = 3
}
nx += dx[direction]
ny += dy[direction]
if nx < 0 || ny < 0 || nx >= nm[0] || ny >= nm[1] {
return 0
}
total += tetroMap[nx][ny]
if direction == 0 {
direction = 3
} else if direction == 2 {
direction = 0
} else if direction == 1 {
direction = 2
} else {
direction = 3
}
nx += dx[direction]
ny += dy[direction]
if nx < 0 || ny < 0 || nx >= nm[0] || ny >= nm[1] {
return 0
}
total += tetroMap[nx][ny]
return total
}
// 5. ใ
ใ
ใ
ใ
private func tetro_5(direction: Int, nx: Int, ny: Int) -> Int {
var direction = direction
var nx = nx
var ny = ny
var total = 0
for _ in 0..<3 {
if nx < 0 || ny < 0 || nx >= nm[0] || ny >= nm[1] {
return 0
}
total += tetroMap[nx][ny]
nx += dx[direction]
ny += dy[direction]
}
nx = nx - dx[direction] - dx[direction]
ny = ny - dy[direction] - dy[direction]
if direction == 3 {
direction = 1
} else if direction == 0 {
direction = 3
} else if direction == 2 {
direction = 0
} else {
direction = 2
}
nx += dx[direction]
ny += dy[direction]
if nx < 0 || ny < 0 || nx >= nm[0] || ny >= nm[1] {
return 0
}
total += tetroMap[nx][ny]
return total
}
// main
var direction = 0
var answer = [Int]()
for i in 0..<nm[0] {
for j in 0..<nm[1] {
// 4๋ฐฉํฅ ๋๋ฆฌ๊ธฐ
for k in 0..<4 {
answer.append(tetro_1(direction: k, nx: i, ny: j))
answer.append(tetro_2(direction: k, nx: i, ny: j))
answer.append(tetro_3(direction: k, nx: i, ny: j))
answer.append(tetro_3_symmetry(direction: k, nx: i, ny: j))
answer.append(tetro_4(direction: k, nx: i, ny: j))
answer.append(tetro_4_symmetry(direction: k, nx: i, ny: j))
answer.append(tetro_5(direction: k, nx: i, ny: j))
}
}
}
print(answer.max()!)
์์ค,, ๊ธธ๊ณ ๊ธธ๋ค.. ์๊ฐํ๊ฒ์ฒ๋ผ ์ฝ๋๋ง ์~~~~ ์ง์ฌ์ง๋ฉด ํต๊ณผํ ์ ์๋ ๋ฌธ์ ๋ค. ๊ทผ๋ฐ,,, ์ด๋ฐฉํฅ ์ ๋ฐฉํฅ ํท๊ฐ๋ ค์ ํ๊ธฐ ์ฝ์ง ์์๋ค. ํ์ง๋ง, ์ฝ๋๋ฅผ๋ณด๋ฉด ์ด๋ฐ์ ๊ฐ์ ์ก์ผ๋ฉด ๋ค์ ํจ์๋ค์ ๊ฑฐ์๋ค ๋๊ฐ์ด ํ๋ฌ๊ฐ๋ค. ์ด๋ฐ์ ๊ฐ์ก๋๋ฐ ์กฐ๊ธ ์ค๋๊ฑธ๋ ธ๊ณ , ๋ค์ ํจ์๋ค์ ๋ณต๋ถํ๋ฉด์ ๋จธ๋ฆฌ๋ก ์์ ๊ทธ๋ฆผ์ ๊ทธ๋ฆฌ๋ฉด์ ํ์๋ค.
์๊ฐ๋ณด๋ค ์ฝํ ์์ ๋ง์ฃผ์ณค์๋, ๋ค๋ฅธ ์๊ณ ๋ฆฌ์ฆ ๋ฌธ์ ๋ค์ ํธ๋๊ฒ๋ณด๋ค ๊ตฌํํ๋ ๋ฌธ์ ๊ฐ ๊ฐ์ฅ ํ๋ค๋ค. ๋จธ๋ฆฌ๋ก ๊ทธ๋ฆผ์ ๊ทธ๋ ค๋๊ฐ๋๊ฒ ์๊ฐ๋ณด๋ค ํ์ด๋ค๊ณ , ์ด๊ฒ์ ์ฝ๋๋ก ๊ทธ๋๋ก ๊ตฌํํ๋๊ฒ๋ ์๋นํ ์๊ฐ์ด ํ์ํ๋ค. ์ด ๋ฌธ์ ๋ฅผ ํธ๋ ๊ฒ์ ์๋นํ ๊ท์ฐฎ์ ์ผ์ด๋ผ๊ณ ์๊ฐํ์ง๋ง ์ด๋ฐ๋ฅ์ ๋ฌธ์ ๋ฅผ ๋ง์ด ๋ง์ฃผ์น๋ฉด, ํ์คํ ์ฝํ ๋๋น๊ฐ ์ ๋ ๊ฒ ๊ฐ๋ค. (์ด ๋ฌธ์ ๋ ๋น์ทํ ๋ฌธ์ ๋ฅผ LG CNS ์ฝํ ์์ ๋ณธ์ ์ด ์๋๊ฒ๊ฐ๋ค. ๊ทธ ๋ฌธ์ ๋ ๊ฒฐ๊ตญ ๊ตฌํ๋ฌธ์ ์๊ธดํ์๋๋ฐ,,, )
ํ์ดํ ,,๊ทธ๋ฆฌ๊ณ ๋ชจ๋ ํดํผ๋ด์ด์ด์ดใ
'Algorithm > Baekjoon' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
[๋ฐฑ์ค] (Swift) 1748๋ฒ - ์ ์ด์ด์ฐ๊ธฐ 1 (๋๋ฒ์งธ ํ์ด) (2) | 2023.01.05 |
---|---|
[๋ฐฑ์ค] (Swift) 6064๋ฒ - ์นด์๋ฌ๋ ฅ (์์ธํ ์ค๋ช ) (0) | 2023.01.01 |
[๋ฐฑ์ค] (Swift) 1107๋ฒ - ๋ฆฌ๋ชจ์ปจ (์์ ํ์, ๋๋ฒ์งธ ์ค๋ต๋ ธํธ) (0) | 2022.12.30 |
[๋ฐฑ์ค] (Swift) 1476๋ฒ - ๋ ์ง๊ณ์ฐ (0) | 2022.12.29 |
[๋ฐฑ์ค] (Swift) 3085๋ฒ - ์ฌํ๊ฒ์ (๋๋ฒ์งธ ํ์ด) (0) | 2022.12.28 |