-
0712_백준 알고리즘 #16967. 배열 복원하기알고리즘 2024. 7. 14. 14:56
문제
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가 존재하는 경우만 입력으로 주어진다.
출력
총 H개의 줄에 배열 A의 원소를 출력한다.
코드
import sys H, W, X, Y = map(int, input().split()) A = [[0] * W for _ in range(H)] B = [list(map(int, sys.stdin.readline().split())) for _ in range(H + X)] for i in range(H + X): for j in range(W + Y): if i >= H or j >= W: break if i >= X and j >= Y: A[i][j] = B[i][j] - B[i - X][j - Y] B[i][j] = A[i][j] else: A[i][j] = B[i][j] for r in range(H): print(*A[r])
※ 가원이가 낸 문제는 항상 고민을 좀 길게 하고 풀게 되는듯 ! 구현 문제는 방법을 생각하는데 늘 시간이 좀 걸리는거 같당.. 그래도 혼자 고민해서 풀기 성공 >< 오늘 한 번 틀린 이유는 두 번째 if문에 B[i][j] = A[i][j]를 추가해주지 않아서 ㅜㅠ 다행히 질문게시판에서 반례를 보고, 디버깅하는 과정에서 잘못된 부분을 찾을 수 있었당 - 오늘의 알고리즘 끝~
'알고리즘' 카테고리의 다른 글
0924_프로그래머스 #155651. 호텔 대실 (1) 2024.09.24 0716_백준 알고리즘 #14719. 빗물 (0) 2024.07.16 0711_백준 알고리즘 #29700. 우당탕탕 영화예매 (0) 2024.07.14 0710_백준 알고리즘 #9655. 돌 게임 (0) 2024.07.13 0708_백준 알고리즘 #11403. 경로 찾기 (0) 2024.07.13