fragment-header
fragment-markdown
홈
로그인
로그아웃
내 블로그
설정
로그인
백준 28438 (C++) 행렬 연산 (행렬 계산하기)
최초 업로드: 2025-10-30 05:18:37
최근 수정 시간: 2025-10-30 05:18:37
게시자: rlatjwls3333
카테고리: 백준
조회수: 13
# [Silver III] 행렬 연산 (행렬 계산하기) [문제 링크](https://www.acmicpc.net/problem/28438) ## 문제 설명 <p>$N$행 $M$열로 이루어진 $2$차원 행렬이 있습니다. 이 행렬의 모든 원소는 처음에 $0$입니다.</p> <p>이 행렬에 다음과 같은 연산을 할 수 있습니다.</p> <ul> <li>$1$ $r$ $v$ <ul> <li>$1$ 이상 $N$ 이하의 수 $r$과 정수 $v$를 정합니다. $r$번째 행의 모든 원소에 $v$를 더합니다.</li> </ul> </li> <li>$2$ $c$ $v$ <ul> <li>$1$ 이상 $M$ 이하의 수 $c$와 정수 $v$를 정합니다. $c$번째 열의 모든 원소에 $v$를 더합니다.</li> </ul> </li> </ul> <p>연산 $Q$ 개가 주어졌을 때, 연산을 차례대로 시행한 결과를 출력하세요.</p> ## 입력 <p>첫 줄에 행렬 $A$의 크기를 나타내는 $N$, $M$과 연산의 개수 $Q$가 공백으로 구분되어 주어집니다. $(1 \le N, M; N \times M \le 500\,000; 1 \le Q \le 500\,000)$</p> <p>다음 $Q$개의 줄에는 각 연산을 의미하는 세 개의 정수가 공백으로 구분되어 주어집니다. 쿼리는 문제에서 주어진 “$1$ $r$ $v$” 혹은 “$2$ $c$ $v$” 의 형태입니다. $(1 \le r \le N;$ $1 \le c \le M;$ $-1\,000 \le v \le 1\,000)$</p> ## 출력 <p>$N$개의 줄을 출력하세요. $i$번째 줄에는 $M$개의 공백으로 구분된 정수가 있어야 하고, 이 중 $j$번째 수는 연산이 끝난 이후 $i$번째 행 $j$번째 열에 있는 수를 의미합니다.</p> ## 풀이 행에 더해진 값의 배열과 열에 더해진 값의 배열을 따로 관리하면 됩니다. ``` c++ #include<bits/stdc++.h> using namespace std; int row[500'000], col[500'000]; int main() { ios::sync_with_stdio(0); cin.tie(0); int n, m, q; cin >> n >> m >> q; while(q--) { int x, u, v; cin >> x >> u >> v; if(x==1) row[u-1] += v; else col[u-1] += v; } for(int i=0;i<n;i++) { for(int j=0;j<m;j++) cout << row[i]+col[j] << ' '; cout << '\n'; } } ```