본문 바로가기
알고리즘 문제 풀이/백준

백준 1952 달팽이2 Kotlin (수학)

by 옹구스투스 2021. 12. 8.
반응형

문제 출처 : https://www.acmicpc.net/problem/1952

 

1952번: 달팽이2

M줄 N칸으로 되어 있는 표 위에, 달팽이 모양으로 선을 그리려고 한다. 위의 그림은 M=5, N=3의 예이다. 이제 표의 왼쪽 위 칸(ㅇ)에서 시작하여, 오른쪽으로 선을 그려 나간다. 표의 바깥 또는 이미

www.acmicpc.net

문제

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()
}
반응형

댓글