μ°μ κ°λ§μ μκ³ λ¦¬μ¦ λ¬Έμ λ₯Ό μ νλ ν°λΌ λ§μ΄ μ΄λ €μ λ€. FE / APP κ°λ° μ§κ΅°μ μ ννκ³ μ΄ 4λ¬Έμ κ° λμλλ° DP 1, ꡬν 1, κ·Έλν 2 μ΄λ κ² λμλ€. μ¬μ μ΄ μμ΄μ 30λΆ μ λ λ€λ¦κ² μ°Έμνκ³ 2μκ° λμ 2λ² νλλ§ νμλ€. μκ°μ΄ λ μμμ΄λ λ€λ₯Έ λ¬Έμ λ₯Ό νμ§ λͺ»νμ κ²μ΄λ€. μλλ‘μ΄λ κ³΅λΆ λλ¬Έμ μκ³ λ¦¬μ¦μ μνν νλλ° μμΌλ‘λ νΈμνμ§ λ§κ³ μκ³ λ¦¬μ¦λ κΎΈμ€ν νμ΄μΌκ² λ€.
λ¬Έμ
λ¬Έμ μ μκΆμ μν΄μ μΊ‘μ³λ νμ§ λͺ»νκ³ κ°λ¨νκ² μ€λͺ νμλ©΄ μ£Όμ΄μ§ λ°°μ΄μ μ¬μ λ ¬νλ λ¬Έμ μλ€. μκ³ λ°©ν₯, λ°μκ³ λ°©ν₯μΌλ‘ μ΄ 2κ°μ§μ λ°©ν₯μ΄ μμμΌλ©° λ°°μ΄μ ν¬κΈ°λ νμμ μ§μκ° μ‘΄μ¬νλ€. κ²°κ³Όμ μΌλ‘ μ΄ 4κ°μ§ κ²½μ° λν΄ λ°°μ΄μ μ¬μ λ ¬νλ λ¬Έμ μλ€.
νμ΄ μΈμ΄
Kotlin
μ½λ
class Solution {
fun solution(n: Int, clockwise: Boolean, result: Array<Array<Int>>) {
when (n % 2) {
0 -> // λ°°μ΄μ ν¬κΈ°κ° μ§μ
if (clockwise) { // μκ³ λ°©ν₯
move(n, 1, 1, listOf(0, 0), result)
} else { // λ°μκ³ λ°©ν₯
move(n, 1, -1, listOf(0, n - 1), result)
}
1 -> // λ°°μ΄μ ν¬κΈ°κ° νμ
if (clockwise) { // μκ³ λ°©ν₯
move(n, 2, 1, listOf(0, 0), result)
} else { // λ°μκ³ λ°©ν₯
move(n, 2, -1, listOf(0, n - 1), result)
}
}
}
fun move(n: Int, finish: Int, direction: Int, src: List<Int>, result: Array<Array<Int>>) {
// μ°μ μκ³λ°©ν₯ κΈ°μ€μΌλ‘ (1, 0) -> (0, 1) -> (-1, 0) -> (0, -1)
val dx = listOf(1 * direction, 0, -1 * direction, 0)
val dy = listOf(0, 1, 0, -1)
// μΈμλ‘ λ°μ μμ μ§μ μ μ’ν
var x = src[1]
var y = src[0]
// νμ κ°κ²© (κΊΎμ΄κΈ° μ κΉμ§μ κ°κ²©μ΄λκΉ?)
var interval = n - 1
// interval μ μ μ₯νκΈ° μν μμ λ³μ
var temp = 0
// μΈμλ‘ λ°μ μ΅μ’
νμ κ°κ²©κΉμ§ νμ
while (interval >= finish) {
var cnt = 1 + temp
// λͺ¨λ λ°©ν₯μ νμ
for (i in 0..3) {
// μ§ν λ°©ν₯ (μμμ μ μΈν λ°©ν₯ λ°°μ΄μ νμ©)
val nx = dx[i]
val ny = dy[i]
while (cnt <= temp + interval) {
// μ’νκ° κ°±μ
if (result[y][x] == 0) {
result[y][x] = cnt++
}
// μ’ν κ°±μ
x += nx
y += ny
// κΊΎμ΄λ μ’νμ λλ¬ν κ²½μ° νμ μ’
λ£
if (cnt == temp + interval) {
result[y][x] = cnt
cnt = 1 + temp
x += nx
y += ny
break
}
}
}
// μμ λ³μ κ°±μ
temp += interval
// μκ³ λ°©ν₯μΈ κ²½μ° λ€μ μμ μ§μ μ΄ (0, 0) -> (1, 1) ... μ΄λ° μμΌλ‘ μ¦κ°
if (direction == 1) {
x += 1
y += 1
} else { // λ°μκ³ λ°©ν₯μΈ κ²½μ° λ€μ μμμ§μ μ΄ (0, n - 1) -> (1, n - 2) ... μ΄λ° μμΌλ‘ μ¦κ°
x -= 1
y += 1
}
// νμ κ°κ²© κ°±μ
interval -= 2
}
if (n % 2 != 0) { // λ°°μ΄μ ν¬κΈ°κ° νμμΈ κ²½μ° κ°μ₯ μμͺ½ 1κ°λ§ κ°±μ
result[n / 2][n / 2] = temp + 1
} else { // λ°°μ΄μ ν¬κΈ°κ° μ§μμΈ κ²½μ° κ°μ₯ μμͺ½ 4κ° λͺ¨λ κ°±μ
result[n / 2][n / 2] = temp
result[n / 2 - 1][n / 2] = temp
result[n / 2][n / 2 - 1] = temp
result[n / 2 - 1][n / 2 - 1] = temp
}
}
}
νμ΄ λ°©λ²
when (n % 2) {
0 -> // λ°°μ΄μ ν¬κΈ°κ° μ§μ
if (clockwise) { // μκ³ λ°©ν₯
move(n, 1, 1, listOf(0, 0), result)
} else { // λ°μκ³ λ°©ν₯
move(n, 1, -1, listOf(0, n - 1), result)
}
1 -> // λ°°μ΄μ ν¬κΈ°κ° νμ
if (clockwise) { // μκ³ λ°©ν₯
move(n, 2, 1, listOf(0, 0), result)
} else { // λ°μκ³ λ°©ν₯
move(n, 2, -1, listOf(0, n - 1), result)
}
}
μ°μ κ° κ²½μ°μ λ°λΌ λλ 쀬λ€. If-else
λ‘ νμ©ν΄λ λμ§λ§ μ΅λν Kotlin
μ€λ½κ² νμ΄λ³΄κΈ° μν΄ When
μ νμ©νλ€. move
λ λ°°μ΄μ μ¬μ λ ¬νλ ν¨μμ΄λ©°, 맀κ°λ³μλ μμμλΆν° μμλλ‘ λ°°μ΄μ ν¬κΈ°
, νμ κ°κ²©
, νμ λ°©ν₯
, μμ μ§μ
, μ¬μ λ ¬ν λ°°μ΄
μ΄λ€.
// μ°μ μκ³λ°©ν₯ κΈ°μ€μΌλ‘ (1, 0) -> (0, 1) -> (-1, 0) -> (0, -1)
val dx = listOf(1 * direction, 0, -1 * direction, 0)
val dy = listOf(0, 1, 0, -1)
μ΄ν λ°©ν₯μ μ§μ ν΄μ€¬λ€.
μκ³ λ°©ν₯μΈ κ²½μ° (1, 0) -> (0, 1) -> (-1, 0) -> (0, -1), λ°μκ³ λ°©ν₯μΈ κ²½μ° (-1, 0) -> (0, 1) -> (1, 0) -> (0, -1) λ‘ μ’νμ΄λμ νλ€.
// μΈμλ‘ λ°μ μμ μ§μ μ μ’ν
var x = src[1]
var y = src[0]
// νμ κ°κ²© (κΊΎμ΄κΈ° μ κΉμ§μ κ°κ²©μ΄λκΉ?)
var interval = n - 1
// interval μ μ μ₯νκΈ° μν μμ λ³μ
var temp = 0
// μΈμλ‘ λ°μ μ΅μ’
νμ κ°κ²©κΉμ§ νμ
while (interval >= finish) {
var cnt = 1 + temp
// λͺ¨λ λ°©ν₯μ νμ
for (i in 0..3) {
// μ§ν λ°©ν₯ (μμμ μ μΈν λ°©ν₯ λ°°μ΄μ νμ©)
val nx = dx[i]
val ny = dy[i]
while (cnt <= temp + interval) {
// μ’νκ° κ°±μ
if (result[y][x] == 0) {
result[y][x] = cnt++
}
// μ’ν κ°±μ
x += nx
y += ny
// κΊΎμ΄λ μ’νμ λλ¬ν κ²½μ° νμ μ’
λ£
if (cnt == temp + interval) {
result[y][x] = cnt
cnt = 1 + temp
x += nx
y += ny
break
}
}
}
// μμ λ³μ κ°±μ
temp += interval
// μκ³ λ°©ν₯μΈ κ²½μ° λ€μ μμ μ§μ μ΄ (0, 0) -> (1, 1) ... μ΄λ° μμΌλ‘ μ¦κ°
if (direction == 1) {
x += 1
y += 1
} else { // λ°μκ³ λ°©ν₯μΈ κ²½μ° λ€μ μμμ§μ μ΄ (0, n - 1) -> (1, n - 2) ... μ΄λ° μμΌλ‘ μ¦κ°
x -= 1
y += 1
}
// νμ κ°κ²© κ°±μ
interval -= 2
}
μ μΈν λ°©ν₯μ λ°λΌ νμμ μ§ννλ€.
if (n % 2 != 0) { // λ°°μ΄μ ν¬κΈ°κ° νμμΈ κ²½μ° κ°μ₯ μμͺ½ 1κ°λ§ κ°±μ
result[n / 2][n / 2] = temp + 1
} else { // λ°°μ΄μ ν¬κΈ°κ° μ§μμΈ κ²½μ° κ°μ₯ μμͺ½ 4κ° λͺ¨λ κ°±μ
result[n / 2][n / 2] = temp
result[n / 2 - 1][n / 2] = temp
result[n / 2][n / 2 - 1] = temp
result[n / 2 - 1][n / 2 - 1] = temp
}
λ°°μ΄μ κ°μ₯ μμͺ½μ΄ κ°±μ λμ§ μλ μ€λ₯κ° μμλ€. μ΄ λΆλΆμ νλ μ½λ©μΌλ‘ ν΄κ²°νλ€.
κ²°κ³Ό
'βοΈ μ½ν μ€λΉ > Implementation' μΉ΄ν κ³ λ¦¬μ λ€λ₯Έ κΈ
[νλ‘κ·Έλλ¨Έμ€] 124 λλΌμ μ«μ (0) | 2022.06.09 |
---|---|
[ꡬν / Kotlin] BOJ 13459 - κ΅¬μ¬ νμΆ (0) | 2022.04.04 |