반응형
문제 출처 : https://www.acmicpc.net/problem/1952
문제
M줄 N칸으로 되어 있는 표 위에, 달팽이 모양으로 선을 그리려고 한다.
ㅇ | ||
위의 그림은 M=5, N=3의 예이다. 이제 표의 왼쪽 위 칸(ㅇ)에서 시작하여, 오른쪽으로 선을 그려 나간다. 표의 바깥 또는 이미 그려진 칸에 닿아서 더 이상 이동할 수 없게 되면, 시계방향으로 선을 꺾어서 그려나간다.
ㅇ | → | ↘ |
↗ | ↘ | ↓ |
↑ | ↓ | ↓ |
↑ | 끝 | ↓ |
↖ | ← | ↙ |
위의 표는 선을 그려 나간 모양을 나타낸 것이다. 선이 꺾어진 부분은 대각선으로 나타내었다. 표의 모든 칸이 채워질 때까지, 선을 몇 번 꺾게 될까?
입력
첫째 줄에 M과 N이 빈 칸을 사이에 두고 주어진다. (2 ≤ M, N ≤ 100)
출력
첫째 줄에 표의 모든 칸이 채워질 때까지 선이 꺾어지는 횟수를 출력한다.
알고리즘 분류
풀이
달팽이 시리즈 문제이다.
이 문제는 굳이 2차원 배열을 만들 필요가 없다.
알고리즘 분류에 수학이 들어간 이유이다.
그리고 난 단박에 알아챘다. 굳이 구현하지 않아도 된다는 것을
후후 짬이 차버린 걸까
퍼포먼스로 코틀린의 확장함수도 사용해봤다.
몇 개 그려보면 규칙을 알 수 있다.
정사각형일 땐, 2*(한 변의 길이-1)를 하면 되고,
열이 행보다 클 때도 마찬가지이다.
행이 열보다 크다면 2*(작은 변의 길이-1)+1를 하면 된다.
코드
fun main() = with(System.out.bufferedWriter()){
br.readLine().split(' ').map{it.toInt()}.also{
val m =it[0]
val n = it[1]
if(m==n){
write("${2*(n-1)}")
}
else {
if(m>n){
write("${2 * (min(n, m) - 1) + 1}")
}
else{
write("${2*(m-1)}")
}
}
}
close()
}
반응형
'알고리즘 문제 풀이 > 백준' 카테고리의 다른 글
백준 1010 다리 놓기 Kotlin (조합,dp) (0) | 2021.12.09 |
---|---|
백준 1959 달팽이3 Kotlin (수학) (0) | 2021.12.09 |
백준 1913 달팽이 Kotlin (구현) (0) | 2021.12.07 |
백준 22254 공정 컨설턴트 호석 Kotlin (이분 탐색) (0) | 2021.12.06 |
백준 21318 피아노 체조 Kotlin (누적 합) (0) | 2021.12.05 |
댓글