Array(1, 2차원 배열) - 0210. 봉우리
private static int solution(int n, String[][] strings) {
int answer = 0;
for(int i=1; i<n + 1; i++) {
for(int j=1; j<n + 1; j++) {
if(Integer.parseInt(strings[i][j]) > Integer.parseInt(strings[i - 1][j])
&& Integer.parseInt(strings[i][j]) > Integer.parseInt(strings[i + 1][j])
&& Integer.parseInt(strings[i][j]) > Integer.parseInt(strings[i][j - 1])
&& Integer.parseInt(strings[i][j]) > Integer.parseInt(strings[i][j + 1]))
answer ++;
}
}
return answer;
}
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
int n = Integer.parseInt(sc.nextLine());
String[][] strings = new String[n + 2][n + 2];
for(int i=0; i<n + 2; i++) {
if(i == 0 || i == n + 1) {
for(int j=0; j<n + 2; j++) {
strings[i][j] = "0";
}
} else {
strings[i][0] = "0";
System.arraycopy(sc.nextLine().split(" "), 0, strings[i], 1, n);
strings[i][n + 1] = "0";
}
}
System.out.println(solution(n, strings));
}
int[] dx={-1, 0, 1, 0};
int[] dy={0, 1, 0, -1};
public int solution(int n, int[][] arr){
int answer=0;
for(int i=0; i<n; i++){
for(int j=0; j<n; j++){
boolean flag=true;
for(int k=0; k<4; k++){
int nx=i+dx[k];
int ny=j+dy[k];
if(nx>=0 && nx<n && ny>=0 && ny<n && arr[nx][ny]>=arr[i][j]){
flag=false;
break;
}
}
if(flag) answer++;
}
}
return answer;
}
public static void main(String[] args){
Main T = new Main();
Scanner kb = new Scanner(System.in);
int n=kb.nextInt();
int[][] arr=new int[n][n];
for(int i=0; i<n; i++){
for(int j=0; j<n; j++){
arr[i][j]=kb.nextInt();
}
}
System.out.print(T.solution(n, arr));
}
해당 문제는 2중 for문
을 순회하며, 상하좌우에 위치한 배열 요소의 값과 비교하는 문제이다.
생각해 볼 점은 격자의 가장자리를 어떻게 처리할 것인가이다.
나의 풀이에서는 입력받은 값을 0
으로 모두 둘러버리고, 반복문을 편하게 돌고자 하였다.
이 때 배열을 합치기 위해 System
클래스의 arraycopy()
를 이용하였다.
강의에서는 해당 좌표 값이 0
이거나 n
인 경우를 제외하는 조건문을 통해 처리하였다.
이후, 인접한 요소의 값을 비교하는 로직의 경우 나의 풀이에서는 논리 연산자 &&(And)
를 통해
하나의 케이스라도 Fasle(거짓)
일 시 통과하도록 하였고 ,강의에서 마찬가지로 flag
변수를
두어 즉시 반복문을 빠져나가 불필요한 연산을 줄이도록 구현하였다.