728x90
https://www.acmicpc.net/problem/2563
2563번: 색종이
첫째 줄에 색종이의 수가 주어진다. 이어 둘째 줄부터 한 줄에 하나씩 색종이를 붙인 위치가 주어진다. 색종이를 붙인 위치는 두 개의 자연수로 주어지는데 첫 번째 자연수는 색종이의 왼쪽 변
www.acmicpc.net
문제 풀이
1. 가로 세로 101 인 크기의 배열을 선언하고 0으로 초기화 한다.(좌표를 1부터 시작하는 것으로 하기 때문에 101로 잡는다.
2. 검은색 색종이의 startX, endX, startY, endY 값을 구한다.
- startX = 입력의 첫번째 값 - 1
- endX = startX + 10 - 1
- startY = 입력의 두번째 값 - 1
- endY = startY + 10 - 1
3. 2번에서 각 값에서 1을 빼준 이유는 넓이를 구하기 때문에 선으로 되는 좌표들은 제외하기 위해서 1씩 빼준다.
- 1씩 빼지 않을 경우 첫번째 검은색 색종이의 경우 x : 3~13 로 범위가 지정 됨
- 1씩 빼지 않을 경우 첫번째 검은색 색종이의 경우 y : 7~17 로 범위가 지정 됨
4. 2, 3번에서 저장한 좌표를 이용하여 1번에서 선언한 101 X 101 의 배열을 탐색하여 값이 0일 경우에는 1로 넣고 result 값을 증가 시킨다. 값이 1일 경우에는 이미 영역으로 되어 있기 때문에 다음 탐색을 진행한다.
코드
import java.io.*
fun main(args: Array<String>) {
val br = BufferedReader(InputStreamReader(System.`in`))
val N = br.readLine().toInt()
val square = Array(101) { IntArray(101) { 0 } }
val coor = mutableListOf<Pair<Int, Int>>()
var result = 0
repeat(N) {
val (x, y) = br.readLine().split(" ").map { it.toInt() }
coor.add(Pair(x, y))
}
repeat(N) {
// 좌표에 저장된 리스트를 탐색하여 squre 에 1로 채운다.
// 이때 0으로 되어 있을 때에만 1로 채운다.
coor.forEach { co ->
val startX = co.first + 1
val endX = startX + 10 - 1
val startY = co.second + 1
val endY = startY + 10 - 1
for (x in startX..endX) {
for (y in startY..endY) {
if (square[x][y] == 1) continue
if (square[x][y] == 0) {
square[x][y] = 1
result++
}
}
}
}
}
println(result)
}
728x90
'알고리즘(w.KOTLIN)' 카테고리의 다른 글
[알고리즘] 가장 긴 증가하는 부분 수열 구하기 (0) | 2023.05.09 |
---|---|
[알고리즘] 에라토스테네스의 체 (0) | 2023.04.12 |
[알고리즘][KOTLIN] 선택 정렬 (0) | 2022.11.18 |
[알고리즘] 버블 정렬 (0) | 2022.11.11 |
[BOJ][5597] 과제 안 내신 분..? (0) | 2022.10.25 |