[BOJ] 14890. 경사로
2020. 7. 15. 16:32ㆍ알고리즘/백준 문제 풀이
https://www.acmicpc.net/problem/14890
접근 방법
N의 크기가 크지 않아서 그냥 완전 탐색을 하기로 했다.
행 검사 따로 . 열 검사 따로 하기로 했다.
먼저 행을 검사할 때
지금 값과 그 전의 값의 차이가 2라면 그냥 해당 행에 대해 검사하지 않고 Pass
if(Math.abs(map[i][k]-map[i][k-1])>1){ flag = false; break; }
지금 값보다 그 전의 값이 크다면 ( F(n-1) > F(n) )
앞으로의 값들을 체크해줘야한다.
여기서 경사로는 서로 겹치면 안되기 때문에 visit배열에 체크를 해줬다.
if(map[i][k-1] - map[i][k] == 1){ if(k+L-1 >= N){ flag = false; break; } for(int l = k; l<= k+L-1; l++){ if(map[i][k-1]-1 != map[i][l] || visit[i][l]){ flag = false; break z; }else{ visit[i][l] = true; } } continue; }
지금 값이 그 전의 값보다 크다면 ( F(n-1) < F(n) )
if(map[i][k-1] - map[i][k] == -1){ if(k-L < 0){ flag = false; break; } for(int l = k-L; l<k; l++){ if(map[i][k]-1 != map[i][l] || visit[i][l]){ flag = false; break z; }else{ visit[i][l] = true; } } continue; }
Need Know
- 음..? 구현?
전체 코드 ( Java )
import java.io.*;
import java.util.*;
class Main {
static BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
static BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(System.out));
static int N;
static int L;
static int[][] map;
static boolean[][] visit;
public static void main(String[] args) throws IOException {
set();
solve();
bw.flush();
bw.close();
br.close();
}
static void set() throws IOException {
StringTokenizer st = new StringTokenizer(br.readLine());
N = Integer.parseInt(st.nextToken());
L = Integer.parseInt(st.nextToken());
map = new int[N][N];
for(int i=0; i<N; i++){
st = new StringTokenizer(br.readLine());
for(int k=0;k<N; k++){
map[i][k] = Integer.parseInt(st.nextToken());
// 가로 체크
}
}
}
static void solve() throws IOException {
bw.write((checkRow()+checkCol()) +"");
}
static int checkRow(){
visit = new boolean[N][N];
int result = 0 ;
for(int i=0; i<N; i++){
boolean flag = true;
z:for(int k=1; k<N; k++) {
if(Math.abs(map[i][k]-map[i][k-1])>1){
flag = false;
break;
}
// 앞에가 더 크다.
if(map[i][k-1] - map[i][k] == 1){
if(k+L-1 >= N){
flag = false;
break;
}
for(int l = k; l<= k+L-1; l++){
if(map[i][k-1]-1 != map[i][l] || visit[i][l]){
flag = false;
break z;
}else{
visit[i][l] = true;
}
}
continue;
}
// 뒤에가 더 크다.
if(map[i][k-1] - map[i][k] == -1){
if(k-L < 0){
flag = false;
break;
}
for(int l = k-L; l<k; l++){
if(map[i][k]-1 != map[i][l] || visit[i][l]){
flag = false;
break z;
}else{
visit[i][l] = true;
}
}
continue;
}
}
if(flag){
result++;
}
}
return result;
}
static int checkCol(){
visit = new boolean[N][N];
int result = 0 ;
for(int i=0; i<N; i++){
boolean flag = true;
z:for(int k=1; k<N; k++) {
if(Math.abs(map[k][i]-map[k-1][i])>1){
flag = false;
break;
}
// 위에가 더 크다.
if(map[k-1][i]-map[k][i] == 1){
if(k+L-1 >= N){
flag = false;
break;
}
for(int l = k; l<= k+L-1; l++){
if(map[k-1][i]-1 != map[l][i] || visit[l][i]){
flag = false;
break z;
}else{
visit[l][i] = true;
}
}
continue;
}
// 밑에가 더 크다.
if(map[k-1][i] - map[k][i] == -1){
if(k-L < 0){
flag = false;
break;
}
for(int l = k-L; l<k; l++){
if(map[k][i]-1 != map[l][i] || visit[l][i]){
flag = false;
break z;
}else{
visit[l][i] = true;
}
}
continue;
}
}
if(flag){
result++;
}
}
return result;
}
}
'알고리즘 > 백준 문제 풀이' 카테고리의 다른 글
[BOJ] 1365. 꼬인 전깃줄 (0) | 2020.07.19 |
---|---|
[BOJ] 5582. 공통 부분 문자열 (0) | 2020.07.18 |
[BOJ] 19236. 청소년 상어 (0) | 2020.07.15 |
[BOJ] 2342. Dance Dance Revolution (0) | 2020.07.14 |
[BOJ] 2718. 타일 채우기 (0) | 2020.07.13 |