๊ฑฐ๋ถ์ด(8911๋ฒ)
Silver 3
#๊ตฌํ #์๋ฎฌ๋ ์ด์
๋ฌธ์ ๋ด์ฉ
๋ฌธ์ ์ ๊ทผ
์ฒ์์ ๊ฑฐ๋ถ์ด๊ฐ ์ขํ 0, 0์ ์์ ๋, ์ด ๊ฑฐ๋ถ์ด๋ฅผ ๋ช ๋ น์ด๋ก ์์ง์ฌ์ ๊ฑฐ๋ถ์ด๊ฐ ์ง๋๊ฐ ์์ญ์ ์ฌ๊ฐํ์ ๋์ด๋ฅผ ๊ตฌํ๋ค.
์ด ๊ฒฝ์ฐ์๋ ๊ฑฐ๋ถ์ด๊ฐ ์์ง์ด๊ณ ๋ ์ขํ x, y๋ฅผ ๋ชจ๋ ๊ตฌํด์ ์ต๋๊ฐ๊ณผ ์ต์๊ฐ์ ์ฐจ๋ฅผ ์ด์ฉํด ๊ฐ ๋ณ์ ๊ธธ์ด๋ฅผ ๊ตฌํ๊ณ , x์ ๊ฑฐ๋ฆฌ์
y์ ๊ฑฐ๋ฆฌ๋ฅผ ๊ณฑํด์ฃผ๋ฉด ์ฝ๊ฒ ๊ตฌํ ์ ์๋ค.
์ฐ์ ๋ช ๋ น์ ๋ฐ๋ฅธ ๊ฐ๋ ๊ณ์ฐ ๋ฐ ์ด๋ ๊ฒฐ๊ณผ๋ฅผ ๊ตฌํด์ผ ํ๋ค.
<์กฐ๊ฑด 1>
๊ฐ๋์ ๊ฒฝ์ฐ๋ ์์ ์ด ํธํ๊ฒ ์ ์ํ๋ฉด ๋๋ค. ๋ด ๊ฒฝ์ฐ์๋ 0, 90, 180, 270์ผ๋ก ๊ตฌํํ๋ค.
'L' -> {
if (currentAngle == 0) currentAngle = 270
else currentAngle -= 90
}
'R' -> {
if (currentAngle == 270) currentAngle = 0
else currentAngle += 90
}
์ผ์ชฝ์ผ๋ก ๋ ๋๋ ๊ฐ๋๋ฅผ ๋นผ์ฃผ๊ณ , ์ค๋ฅธ์ชฝ์ผ๋ก ๋ ๋๋ ๊ฐ๋๋ฅผ ๋ํด ์ค๋ค. ๊ฐ๋์ ๋ฒ์๋ฅผ ๋ฒ์ด๋๋ ๊ฒฝ์ฐ์ ๋ํ ์ฒ๋ฆฌ๋ ๊ธฐ๋ณธ์ด๋ค.
<์กฐ๊ฑด 2>
์ด์ ์, ๋ค๋ก ์์ง์ด๋ผ๋ ๋ช ๋ น์ด๊ฐ ๋ค์ด์์ ๋์ ์ฒ๋ฆฌ๋ฅผ ์งํํ๋ค.
ํ์ฌ ์ขํ์์ ์์ง์ธ ๊ฒฐ๊ณผ๋ฅผ return ํ๋ ํจ์๋ฅผ ์์ฑํด ์ฃผ์๋ค.
private fun getMoveRes(x: Int, y: Int, currentAngle: Int, isBack: Int): List<Int> {
return when (currentAngle) {
0 -> listOf(x, y + (1 * isBack))
90 -> listOf(x + (1 * isBack), y)
180 -> listOf(x, y - (1 * isBack))
270 -> listOf(x - (1 * isBack), y)
else -> listOf()
}
}
ํ๋์ ํจ์์ front, back move๋ฅผ ์ฒ๋ฆฌํ ๊ฑฐ๊ธฐ ๋๋ฌธ์ front์ธ์ง back์ธ์ง ์ฒ๋ฆฌํ ํ๋ผ๋ฏธํฐ๊ฐ ํ์ํ๋ค.
๊ฐ ๊ฐ๋์ ๋ฐ๋ผ ํ์ฌ ์ขํ์์ ๊ฐ์ ๋ณ๊ฒฝํด ์ค๋ค.
isBack ํ๋ผ๋ฏธํฐ์์๋ front์ผ ๋๋ 1์, back์ผ ๋๋ -1์ ๋ฃ์ด์ ๋ค๋ก ๊ฐ ๋๋ -1์ ๊ณฑํ ๊ฐ์ด ๋ค์ด๊ฐ ์ ์๋๋ก ํด์ฃผ์๋ค.
๋ฌธ์ ํด๊ฒฐ ์ฝ๋
import java.io.BufferedReader
import java.io.InputStreamReader
fun main() = with(BufferedReader(InputStreamReader(System.`in`))) {
val case = readLine().toInt()
for (i in 0 until case) {
val command = readLine()
val moveXLocations = mutableListOf(0)
val moveYLocations = mutableListOf(0)
var currentAngle = 0
for (cmd in command) {
when (cmd) {
'F' -> {
val moveRes = getMoveRes(moveXLocations.last(), moveYLocations.last(), currentAngle, 1)
moveXLocations.add(moveRes.first())
moveYLocations.add(moveRes.last())
}
'B' -> {
val moveRes = getMoveRes(moveXLocations.last(), moveYLocations.last(), currentAngle, -1)
moveXLocations.add(moveRes.first())
moveYLocations.add(moveRes.last())
}
'L' -> {
if (currentAngle == 0) currentAngle = 270
else currentAngle -= 90
}
'R' -> {
if (currentAngle == 270) currentAngle = 0
else currentAngle += 90
}
}
}
val xDistance = with(moveXLocations) { max() - min() }
val yDistance = with(moveYLocations) { max() - min() }
println(xDistance * yDistance)
}
}
// back: -1, front: 1
private fun getMoveRes(x: Int, y: Int, currentAngle: Int, isBack: Int): List<Int> {
return when (currentAngle) {
0 -> listOf(x, y + (1 * isBack))
90 -> listOf(x + (1 * isBack), y)
180 -> listOf(x, y - (1 * isBack))
270 -> listOf(x - (1 * isBack), y)
else -> listOf()
}
}
๋ฌธ์ ํ์ด
๋ช ๋ น์ด๋ฅผ ์ ๋ ฅ๋ฐ์ ๋ช ๋ น์ด์ ๋ง๊ฒ ์กฐ๊ฑด 1, ์กฐ๊ฑด 2๋ฅผ ์ํํ๋ค.
์ขํ๊ฐ ๋ณํ๊ฒ ๋๋ฉด(F, B๋ฅผ ๋ช ๋ น๋ฐ์ ๊ฒฝ์ฐ) ํ์ฌ x, y ์ขํ๋ฅผ ์ ์ฅํ๋ moveXLocations, moveYLocations์ ๊ฐ์ ์ ์ฅํ๋ค.
๋ช ๋ น์ด ๋๋๊ณ ๋๋ฉด ๋ค์ด ์๋ moveX, moveY ๋ฆฌ์คํธ ์ค ์ต๋๊ฐ, ์ต์๊ฐ์ ์ฐพ์ ๋ ๊ฐ์ ์ฐจ๋ฅผ ๊ตฌํ๋ฉด ๊ทธ ๊ฐ์ด ํด๋น ์ขํ์ ๊ฑฐ๋ฆฌ๊ฐ ๋๋ค. ์ฆ ์ฌ๊ฐํ์ ๋ณ์ด ๋๋ค.
x์ ๊ฑฐ๋ฆฌ, y์ ๊ฑฐ๋ฆฌ๋ฅผ ๊ตฌํด ๊ณฑํ๋ค.
๋ฌธ์ ํด๊ฒฐ ๊ณผ์
๊ฐ๋๋ฅผ ์ด์ฉํด ์์น๋ฅผ ๊ณ์ฐํด์ ์ขํ ๊ฐ์ ๊ฑฐ๋ฆฌ๋ฅผ ๊ตฌํ๋ฉด ๋๋ ๋ฌธ์ .
ํน์ ์๊ณ ๋ฆฌ์ฆ์ด ๋ค์ด๊ฐ์ง ์๋ ๊ตฌํ ๋ฌธ์ .
'๐ฏ | ๋ฐฑ์ค > ๐ | Silver' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
[Kotlin, S2] ๋ฐฑ์ค 18352๋ฒ ํน์ ๊ฑฐ๋ฆฌ์ ๋์ ์ฐพ๊ธฐ (0) | 2024.09.10 |
---|---|
[Kotlin, S5] ๋ฐฑ์ค 2828๋ฒ ์ฌ๊ณผ ๋ด๊ธฐ ๊ฒ์ (0) | 2024.09.06 |
[Kotlin, S4] ๋ฐฑ์ค 1337๋ฒ ์ฌ๋ฐ๋ฅธ ๋ฐฐ์ด (0) | 2024.08.29 |
[Kotlin, S3] ๋ฐฑ์ค 13305๋ฒ ์ฃผ์ ์ (0) | 2024.08.27 |
[Kotlin, S2] ๋ฐฑ์ค 1912๋ฒ ์ฐ์ํฉ (0) | 2024.08.26 |