[C++] BOJ 14890 - ๊ฒฝ์ฌ๋กProblem Solving/Baekjoon Online Judge (BOJ)2025. 4. 16. 16:10
Table of Contents

01. ๐ ๋ฌธ์ ํ์
NxN: ์ง๋์ ํฌ๊ธฐ
L: ๊ฒฝ์ฌ๋ก์ ๊ธธ์ด
- ์ง๋์ ํ ์นธ๋ง๋ค ๋์ด๊ฐ ์ฃผ์ด์ง
- ๊ธธ์ด๋? ํ ํ ๋๋ ํ ์ด์ ์๋ฏธ (๋ฐ๋ผ์, 2N๊ฐ์ ๊ธธ์ด ์กด์ฌ)
- ๊ธธ์ ์ง๋๊ธฐ์ํด์
- ๋์ด๊ฐ ๊ฐ์ ๊ณณ์ ์ง๋๊ฐ ์ ์์
- ๋์ด๊ฐ ๋ค๋ฅธ ๊ณณ์ ๊ฒฝ์ฌ๋ก๋ฅผ ๋์ ๋์ด 1์ ์ฐจ์ด๋ ๊ทน๋ณต ๊ฐ๋ฅ
- ๊ฒฝ์ฌ๋ก์ ๋์ด๋ ํญ์ 1์ด๋ฉฐ, ๊ธธ์ด๋ L
- ๊ฒฝ์ฌ๋ก๋ฅผ ๋๊ธฐ ์ํด์
- ๋ฎ์ ์นธ๊ณผ ๋์ ์นธ์ ๋์ด ์ฐจ์ด๋ 1์ด์ด์ผ ํจ
- ๋ฎ์ ์นธ์ ๋์ด๋ ๊ฐ์์ผ ํจ
- L๊ฐ์ ์ฐ์๋ ์นธ์ด ๊ฒฝ์ฌ๋ก ๋ฐ๋ฅ๋ฉด๊ณผ ๋ฟ์์ผ ํจ
- ๊ฒฝ์ฌ๋ก๋ฅผ ๋์ ์ ์๋ ๊ฒฝ์ฐ
- ์ด๋ฏธ ๊ฒฝ์ฌ๋ก๊ฐ ์๋ ๊ณณ
- ๋ฎ์ ์นธ๊ณผ ๋์ ์นธ์ ๋์ด ์ฐจ์ด๊ฐ 1์ด ์๋ ๋
- ๋ฎ์ ์ง์ ์ ๋์ด๊ฐ ๋ชจ๋ ๊ฐ์ง ์๊ณ , L์ ๊ธธ์ด๋งํผ ์ฐ์๋์ง ์์์ ๋
- ๊ฒฝ์ฌ๋ก๊ฐ ์ฃผ์ด์ง ๋ฒ์๋ฅผ ๋ฒ์ด๋ฌ์ ๋
01-1. ๊ฐ๋ฅํ ์๊ฐ ๋ณต์ก๋
- N์ ์ต๋๊ฐ 100์ผ๋ก ์๊ฐ ๋ณต์ก๋ O(N^3) ์ดํ๋ก ๊ตฌํํด์ผ ํจ
- ๊ฐ ํ๊ณผ ์ด์ ๋ํด ์ ํจํ ๊ธธ์ธ์ง ๊ตฌํ๋ ๋ฐฉ์์ผ๋ก ์๊ฐ ๋ณต์ก๋ O(2*N^2)์ผ๋ก ๊ตฌํ ๊ฐ๋ฅ
02. ๐ ์ฝ๋ ์ค๊ณํ๊ธฐ
- N๊ณผ L์ ์ ๋ ฅ๋ฐ๊ณ , NxN ๋ฒ์ ์ง๋์ ๋์ด๋ฅผ ๊ฐ๊ฐ ์ ๋ ฅ
- ๊ฐ ํ๊ณผ ์ด์ ๋ํด ์ ํจํ ๊ธธ์ธ์ง ํ์
- ํ์ฌ ๋์ด์ ๋ค์ ์นธ์ ๋์ด ์ฐจ์ด๋ฅผ ๊ณ์ฐ
- ๋์ด ์ฐจ์ด๊ฐ 0์ผ ๊ฒฝ์ฐ, ์ ์ง
- ๋์ด ์ฐจ์ด๊ฐ 1์ผ ๊ฒฝ์ฐ, ํ์ฌ ์นธ์ ํฌํจํ์ฌ L๋งํผ ๋ท ์นธ๊น์ง ์งํ ์กฐ๊ฑด์ ํ์ธ, ์กฐ๊ฑด์ ๋ง์กฑํ์ง ์์ ๊ฒฝ์ฐ ๋ฐ๋ณต์ ๋ฉ์ถ๊ณ ๋ค์ ๊ธธ๋ก ์ด๋
(์กฐ๊ฑด: ์ ํจํ ๋ฒ์์ธ์ง, ํ์ฌ ์นธ๊ณผ ๊ฐ์ ๋์ด์ธ์ง, ๊ฒฝ์ฌ๋ก๊ฐ ์ค์น๋์ง ์์๋ ์ง) - ๋์ด ์ฐจ์ด๊ฐ -1์ผ ๊ฒฝ์ฐ, ๋ค์ ์นธ๋ถํฐ L๋งํผ ์ ์นธ๊น์ง ์งํ ์กฐ๊ฑด์ ํ์ธ, ์กฐ๊ฑด์ ๋ง์กฑํ์ง ์์ ๊ฒฝ์ฐ, ๋ฐ๋ณต์ ๋ฉ์ถ๊ณ ๋ค์ ๊ธธ๋ก ์ด๋
(์กฐ๊ฑด: ์ ํจํ ๋ฒ์์ธ์ง, ๋ค์ ์นธ๋ถํฐ ๊ฐ์ ๋์ด์ธ์ง, ๊ฒฝ์ฌ๋ก๊ฐ ์ค์น๋์ง ์์๋ ์ง)
- ๊ธธ ํ์์ด ๋๊น์ง ์ํ๋์์ ๊ฒฝ์ฐ, ์ ํจํ ๊ธธ ํ์์ +1
03. ๐ ๏ธ ์๋๋ณ ์์
1ํ์ฐจ
04. ๐๏ธ ์ ๋ต ์ฝ๋
#include <bits/stdc++.h>
using namespace std;
int main(){
ios::sync_with_stdio(0);
cin.tie(0);
int N, L;
cin >> N >> L;
vector<vector<int>> board(N, vector<int>(N));
for(int i = 0; i < N; i++){
for(int j = 0; j < N; j++){
cin >> board[i][j];
}
}
int count = 0;
for(int i = 0; i < N; i++){
bool is_valid = true;
vector<bool> is_used(N, false);
for(int j = 0; j < N - 1; j++){
if(!is_valid) break;
int diff = board[i][j + 1] - board[i][j];
if(diff == 0) continue;
else if(diff == 1){
for(int k = 0; k < L; k++){
int idx = j - k;
if(idx < 0 || board[i][idx] != board[i][j] || is_used[idx]){
is_valid = false;
break;
}
is_used[idx] = true;
}
}
else if(diff == -1){
for(int k = 1; k <= L; k++){
int idx = j + k;
if(idx >= N || board[i][idx] != board[i][j+1] || is_used[idx]){
is_valid = false;
break;
}
is_used[idx] = true;
}
j += (L-1);
}
else {
is_valid = false;
break;
}
}
if(is_valid) count++;
}
for(int i = 0; i < N; i++){
bool is_valid = true;
vector<bool> is_used(N, false);
for(int j = 0; j < N - 1; j++){
if(!is_valid) break;
int diff = board[j + 1][i] - board[j][i];
if(diff == 0) continue;
else if(diff == 1){
for(int k = 0; k < L; k++){
int idx = j - k;
if(idx < 0 || board[idx][i] != board[j][i] || is_used[idx]){
is_valid = false;
break;
}
is_used[idx] = true;
}
}
else if(diff == -1){
for(int k = 1; k <= L; k++){
int idx = j + k;
if(idx >= N || board[idx][i] != (board[j+1][i]) || is_used[idx]){
is_valid = false;
break;
}
is_used[idx] = true;
}
j += (L-1);
}
else {
is_valid = false;
break;
}
}
if(is_valid) count++;
}
cout << count << "\n";
return 0;
}
'Problem Solving > Baekjoon Online Judge (BOJ)' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
| [C++] BOJ 23289 - ์จํ๊ธฐ ์๋ ! (0) | 2025.04.18 |
|---|---|
| [C++] BOJ 17837 - ์๋ก์ด ๊ฒ์ 2 (0) | 2025.04.17 |
| [C++] BOJ 14499 - ์ฃผ์ฌ์ ๊ตด๋ฆฌ๊ธฐ (1) | 2025.04.15 |
| [C++] BOJ 1561 - ๋์ด ๊ณต์ (1) | 2025.04.14 |
| [C++] BOJ 12015 - ๊ฐ์ฅ ๊ธด ์ฆ๊ฐํ๋ ๋ถ๋ถ ์์ด 2 (0) | 2025.04.13 |
@ONE_ :: ์ ํธ์
์๋ชป๋ ์ ๋ณด๊ฐ ์๋ค๋ฉด ๋ง์ํด์ฃผ์ธ์!