문제
1913번: 달팽이
N개의 줄에 걸쳐 표를 출력한다. 각 줄에 N개의 자연수를 한 칸씩 띄어서 출력하면 되며, 자릿수를 맞출 필요가 없다. N+1번째 줄에는 입력받은 자연수의 좌표를 나타내는 두 정수를 한 칸 띄어서
www.acmicpc.net
풀이
좌표 (1, 1)부터 시작하여 순서대로 표를 채워가도록 코드를 구성하였다. while문을 사용하여 표를 역순으로 채워준다. 다음 좌표에 숫자가 이미 채워져 있거나 탐색 범위를 벗어나는 경우 달팽이 모양으로 숫자를 채울수 있도록 방향을 바꿔준다.
코드
fun main() {
val br = System.`in`.bufferedReader()
val bw = System.out.bufferedWriter()
val size = br.readLine().toInt()
val num = br.readLine().toInt()
val map = Array(size){ IntArray(size) }
var x = 0
var y = 0
var dir = 0
var cur = size*size - 1
var ans = arrayOf(1, 1)
val dx = arrayOf(1, 0, -1, 0) // 이동 방향
val dy = arrayOf(0, 1, 0, -1) // 이동 방향
map[x][y] = size*size // (1, 1) 좌표
while (true) {
val nx = x + dx[dir]
val ny = y + dy[dir]
if(nx < 0 || nx >= size || ny < 0 || ny >= size || map[nx][ny] != 0) { // 탐색 범위를 벗어나거나 이미 채워져 있는 경우
dir++
if(dir == 4) dir = 0
} else { // 이동, 숫자 채워주기
x = nx
y = ny
map[x][y] = cur--
}
if(cur == num-1) ans = arrayOf(x+1, y+1) // 입력받은 정수의 좌표
if(cur == 0) break
}
val sb = StringBuilder()
for(i in 0 until size) {
for(j in 0 until size) {
sb.append("${map[i][j]} ")
}
sb.append("\n")
}
sb.append("${ans[0]} ${ans[1]}")
bw.write(sb.toString())
bw.flush()
bw.close()
br.close()
}
'알고리즘 > Baekjoon' 카테고리의 다른 글
[백준] 11047번: 동전 0 - Kotlin[코틀린] (0) | 2024.04.01 |
---|---|
[백준] 5052번: 전화번호 목록 - Kotlin[코틀린] (0) | 2024.03.27 |
[백준] 11501번: 주식 - Kotlin[코틀린] (0) | 2024.03.20 |
[백준] 13301번: 타일 장식물 - Kotlin[코틀린] (0) | 2024.03.17 |
[백준] 1647번: 도시 분할 계획 - Kotlin[코틀린] (0) | 2024.03.13 |