※ 글쓴이는 취미로 코딩을 익혀보는 사람이라 정확하지 않은 내용을 담고 있을 수 있다 ※
이번에 볼 문제는 백준 23823번 문제인 초코칩 케이크이다.
문제는 아래 링크를 확인하자.
https://www.acmicpc.net/problem/23823
23823번: 초코칩 케이크
첫 번째 줄에 두 정수 $n$, $q$가 공백으로 구분되어 주어진다. $(1 \leq n \leq 30,000, 1 \leq q \leq 100,000)$ $n$은 가로줄과 세로줄의 개수이며, $q$는 장식 횟수이다. 이후로 $q$개의 줄에 두 정수 $t$, $a$가
www.acmicpc.net
각 조각에 뿌려진 초코칩의 개수는 (그 조각이 있는 행에 초코칩을 뿌린 횟수) + (그 조각이 있는 열에 초코칩을 뿌린 횟수)와 같다.
따라서, (가장 많은 초코칩을 뿌린 행의 개수) * (가장 많은 초코칩을 뿌린 열의 개수)로 매 순간의 가장 많은 초코칩이 올라간 조각의 개수를 구할 수 있다.
매번 초코칩을 뿌리는 연산을 한 뒤, 해당 행 또는 열이 가장 많은 초코칩을 뿌린 행 또는 열이 되었는지를 매번 확인하는 것으로 위의 값을 관리할 수 있다.
아래는 제출한 소스코드이다.
#include <iostream>
using namespace std;
int garo[30001], sero[30001];
int main() {
ios::sync_with_stdio(0);
cin.tie(0);
int N, Q; cin >> N >> Q;
int garomx = 0, garocnt = N, seromx = 0, serocnt = N;
while (Q--) {
int t, a; cin >> t >> a;
if (t == 1) {
garo[a]++;
if (garo[a] > garomx) {
garomx = garo[a];
garocnt = 1;
}
else if (garo[a] == garomx) garocnt++;
cout << garocnt * serocnt << '\n';
}
else {
sero[a]++;
if (sero[a] > seromx) {
seromx = sero[a];
serocnt = 1;
}
else if (sero[a] == seromx) serocnt++;
cout << garocnt * serocnt << '\n';
}
}
}
728x90
'BOJ' 카테고리의 다른 글
[BOJ 2012 // C++] 등수 매기기 (0) | 2022.02.01 |
---|---|
[BOJ 14852 // C++] 타일 채우기 3 (0) | 2022.01.31 |
[BOJ 6515 // C++] Frequent values (0) | 2022.01.29 |
[BOJ 23256 // C++] 성인 게임 (0) | 2022.01.28 |
[BOJ 23974 // C++] 짝수 게임 (0) | 2022.01.27 |