/* 본 게시물은 참고자료를 토대로 작성되었습니다. */
/* 본 글은 개인적으로 공부한 내용을 정리한 글이므로 오류가 있을 수 있습니다. */
참고 자료
[백준] 16967번 : https://www.acmicpc.net/problem/16967
문제
크기가 H × W인 배열 A와 두 정수 X와 Y가 있을 때, 크기가 (H + X) × (W + Y)인 배열 B는 배열 A와 배열 A를 아래로 X칸, 오른쪽으로 Y칸 이동시킨 배열을 겹쳐 만들 수 있다. 수가 겹쳐지면 수가 합쳐진다.
즉, 배열 B의 (i, j)에 들어있는 값은 아래 3개 중 하나이다.
- (i, j)가 두 배열 모두에 포함되지 않으면, Bi,j = 0이다.
- (i, j)가 두 배열 모두에 포함되면, Bi,j = Ai,j + Ai-X,j-Y이다.
- (i, j)가 두 배열 중 하나에 포함되면, Bi,j = Ai,j 또는 Ai-X,j-Y이다.
배열 B와 정수 X, Y가 주어졌을 때, 배열 A를 구해보자
입력
첫째 줄에 네 정수 H, W, X, Y가 주어진다. 둘째 줄부터 H + X개의 줄에 배열 B의 원소가 주어진다.
항상 배열 A가 존재하는 경우만 입력으로 주어진다.
1. Code
fun main() {
val (h,w,x,y) = readLine()!!.split(' ').map { it.toInt() }
val arrA = Array(h){IntArray(w)}
val arrB = Array(h+x){IntArray(w+y)}
for (j in 0 until h+x) {
readLine()!!.split(' ').map{ it.toInt() }.run {
for (i in 0 until w+y){
arrB[j][i] = this[i]
}
}
}
//안겹치는 부분 처리
for (j in 0 until h){
for (i in 0 until w){
arrA[j][i] = arrB[j][i]
}
}
//겹치는 부분 처리
for (j in x until h){
for (i in y until w){
arrA[j][i] = arrB[j][i] - arrA[j-x][i-y]
}
}
//출력
for (j in 0 until h){
for (i in 0 until w){
print("${arrA[j][i]}" + " ")
}
print("\n")
}
}
반응형