문제
코드
fun main() = with(System.`in`.bufferedReader()) {
val n = readLine().toInt()
val cookie = Array(n) { BooleanArray(n) }
var heart = Pair(0, 0)
var lArm = 0; var rArm = 0; var waist = 0 ; var lLeg = 0 ; var rLeg = 0
for (i in 0..<n) {
cookie[i] = readLine().map { if (it == '*') true else false }.toBooleanArray()
}
// 심장 위치 구하기
findHeartPos@ for (i in cookie.indices) {
for (j in cookie[i].indices) {
if (cookie[i][j]) {
heart = Pair(i + 1, j)
break@findHeartPos
}
}
}
for (i in 0..<heart.second) {
if (cookie[heart.first][i]) lArm++
}
for (i in heart.second + 1..<n) {
if (cookie[heart.first][i]) rArm++
}
for (i in heart.first + 1..<n) {
if (cookie[i][heart.second]) waist++
}
for (i in heart.first + waist + 1..<n) {
if (cookie[i][heart.second - 1]) lLeg++
if (cookie[i][heart.second + 1]) rLeg++
}
println("${heart.first + 1} ${heart.second + 1}")
println("$lArm $rArm $waist $lLeg $rLeg")
}
풀이
처음에 dfs쓰는 문젠줄 알았다
근데 그냥 단순하게 구현하면 될 것 같았다
구현하다가 중첩 반복문을 중단하는 법에 대해 배웠다
여러 가지 방법이 있는데
1. 종료 여부 확인용 변수 생성
var exit = false
for(i in 0..2) {
for (j in 0..2) {
if (i == j) exit = true
if(exit) break
}
if(exit) break
}
이런 식으로 작성해도 되지만, 코드가 지저분해지고 가독성도 떨어진다
그리고 종료 여부를 확인하는 용도로 변수를 따로 선언하고 싶지 않았다..ㅎㅎ
2. 라벨 사용
findHeartPos@ for (i in cookie.indices) {
for (j in cookie[i].indices) {
if (cookie[i][j]) {
heart = Pair(i + 1, j)
break@findHeartPos
}
}
}
이런 식으로 라벨을 붙여주고, 해당 라벨을 통해 어떤 반복문을 종료할지 지정할 수 있다
라벨을 붙여줄 땐, 라벨명@
라벨을 사용할 땐, @라벨명
이런 식이다.
사용이 간단하고, 라벨명을 통해 어떤 문장을 종료할 지 코드 상으로 쉽게 예측이 가능하기 때문에 좋은 방법같다!
다시 문제 풀이로 돌아오자면,
쿠키 판을 왼쪽 상단부터 오른쪽 하단 순으로 탐색했을 때 가장 처음으로 찾은 쿠키의 몸이 쿠키의 머리가 된다.
가장 위쪽에 한 칸만 위치하기 때문
심장은 머리 바로 아래에 있기 때문에, 이것을 이용하여 심장의 위치를 찾는다
그 다음 심장을 기준으로, 몸 길이를 측정하면 된다
'Algorithm > 📖Baekjoon' 카테고리의 다른 글
#2504 괄호의 값 (0) | 2024.08.07 |
---|---|
#1978 소수 찾기 (0) | 2024.08.06 |
#7568 덩치 (0) | 2024.07.26 |
#8979 올림픽 (0) | 2024.07.26 |
#9655 돌 게임 (0) | 2024.07.25 |
댓글