728x90
반응형
목차
https://www.acmicpc.net/problem/14890
문제
문제 구현 방향
생각보다 까다로웠던 문제였다.. 플래그 변수와 ex변수를 통해 검사하였다.
가져갈 아이디어
1. 대칭 배열
함수를 두번 구현하기 싫어서 대칭 배열을 만들었다.
int boardA[101][101] = { 0 };
int boardB[101][101] = { 0 };
int main() {
cin >> N >> L;
for (int i = 0; i < N; i++) {
for (int j = 0; j < N; j++) {
cin >> boardA[i][j];
boardB[j][i] = boardA[i][j];
}
}
}
2. 함수 끝에 이전 배열 저장하기
int check(int board[101][101]) {
int ex = board[0][0];
for (int j = 0; j < N; j++) {
int current = board[0][j];
//이런식으로 이전것과 현재것을 비교가능
ex = board[0][j];
}
if (cant)
cnt++;
}
return cnt;
}
코드 구현
#include<iostream>
#include<algorithm>
#include<string.h>
#include<vector>
#include<math.h>
#include<queue>
using namespace std;
int N, L;
int boardA[101][101] = { 0 };
int boardB[101][101] = { 0 };
int total = 0;
int check(int board[101][101]) {
int cnt = 0;
for (int i = 0; i < N; i++) {
int flag = 0; //내리막길
int pass = 0;
int cant = 1;
int ex = board[i][0];
for (int j = 0; j < N; j++) {
if (abs(board[i][j] - ex) >1) {
cant = 0;
break;
}
//평지
else if (ex - board[i][j] == 0) {
pass++;
}
else {
//오르막길
if (board[i][j] - ex == 1) {
if (pass < L) {
cant = 0;
break;
}
pass = 1;
}
//내리막길
else if (ex - board[i][j] == 1) {
pass = 0;
int comp = board[i][j];
for (int p = 0; p < L-1; p++) {
j += 1;
if (j > N - 1) {
cant = 0;
break;
}
if (board[i][j] != comp)
{
cant = 0;
break;
}
}
}
}
ex = board[i][j];
}
if (cant)
cnt++;
}
return cnt;
}
int main() {
cin >> N >> L;
for (int i = 0; i < N; i++) {
for (int j = 0; j < N; j++) {
cin >> boardA[i][j];
boardB[j][i] = boardA[i][j];
}
}
total += check(boardA);
total += check(boardB);
cout << total;
}
반응형
'백준 문제풀이' 카테고리의 다른 글
[백준][에라토스테네스의 체] 1644 소수의 연속 합 c++구현 (0) | 2024.07.30 |
---|---|
[백준][union find] 13244 Tree c++구현 (0) | 2024.07.29 |
[비트마스킹][브루트포스] 1285 동전 뒤집기 c++ 구현 (0) | 2024.07.23 |
[그리디] 28126 Space-A c++구현 (0) | 2024.07.21 |
[비트마스킹][완전 탐색] 14391 종이 조각 c++구현 (0) | 2024.07.20 |