문제
https://www.acmicpc.net/problem/14890
아이디어
구현 !
코드
import java.io.BufferedReader;
import java.io.FileInputStream;
import java.io.InputStreamReader;
import java.util.StringTokenizer;
public class Solution {
static int N, L;
static int[][] map;
static boolean[][] visited;
public static void main(String[] args) throws Exception {
System.setIn(new FileInputStream("src/input.txt"));
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
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 j = 0; j < N; j++) {
map[i][j] = Integer.parseInt(st.nextToken());
}
}
int cnt = 0;
for (int i = 0; i < N; i++) {
if (col(i)) {
cnt += 1;
}
if (row(i)) {
cnt += 1;
}
}
System.out.println(cnt);
}
static boolean col(int c) {
boolean[] isCline = new boolean[N];
for (int r = 0; r < N - 1; r++) {
int diff = map[r][c] - map[r + 1][c];
if (diff == 0)
continue;
if (diff == 1) {
for (int d = 1; d <= L; d++) {
if (r + d >= N || map[r + d][c] != map[r][c] - 1) {
return false;
}
if (isCline[r + d])
return false;
isCline[r + d] = true;
}
} else if (diff == -1) {
for (int d = 0; d < L; d++) { // 0 - L-1 범위인 이유 고려하기
if (r - d < 0 || map[r - d][c] != map[r][c]) {
return false;
}
if (isCline[r - d])
return false;
isCline[r - d] = true;
}
} else {
return false;
}
}
return true;
}
static boolean row(int r) {
boolean[] isCline = new boolean[N];
for (int c = 0; c < N - 1; c++) {
int diff = map[r][c] - map[r][c + 1];
if (diff == 0)
continue;
if (diff == 1) {
for (int d = 1; d <= L; d++) {
if (c + d >= N || map[r][c + d] != map[r][c] - 1) {
return false;
}
if (isCline[c + d])
return false;
isCline[c + d] = true;
}
} else if (diff == -1) {
for (int d = 0; d < L; d++) {
if (c - d < 0 || map[r][c - d] != map[r][c]) {
return false;
}
if (isCline[c - d])
return false;
isCline[c - d] = true;
}
} else {
return false;
}
}
return true;
}
}
'Java' 카테고리의 다른 글
[프로그래머스] 뒤에 있는 큰 수 찾기 (0) | 2025.04.02 |
---|---|
[백준] 17472 : 다리 만들기 2 (0) | 2025.04.01 |
[프로그래머스] 연속 펄스 부분 수열의 합 (0) | 2025.04.01 |
에라토스테네스의 체 : 소수 찾기 (0) | 2025.03.30 |
GCD, LCM 구하기 : 유클레드 호제법, a*b / gcd(a,b) (0) | 2025.03.30 |