봉우리

Seungmin Lim·2022년 2월 7일
0

코딩문제연습

목록 보기
24/63

문제

나의풀이

import java.util.*;

class Main {
	public int solution(int n,int[][] arr) {
			int answer = 0;
			//격자판 생성
			n = n+2;
			int[][] mt = new int[n][n];
			for(int i=0; i<n-2; i++) {
				for(int j=0; j<n-2; j++) {
					mt[i+1][j+1] = arr[i][j];
				}
			}
			
			//탐색
			for(int i=1; i<n-1; i++) {
				for(int j=1; j<n-1; j++) {
					int tmp = mt[i][j];
					//상,하
					if(tmp > mt[i+1][j] && tmp > mt[i-1][j]) {
						//좌,우
						if(tmp > mt[i][j+1] && tmp > mt[i][j-1]) {
							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.println(T.solution(n, arr));
	}
	
}

++ 위치값을 설정해서 푸는방법!

import java.util.*;

class Main {
	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<arr.length; j++) {
					boolean flag = true;
					for(int k=0; k<4;k++) {
						int nx = i+dx[k];
						int ny = j+dy[k];
						//4방향중 크거나 같은것이 있다면 false
						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.println(T.solution(n, arr));
	}
	
}

풀이방법

  1. 미리 0이 추가된 격자판에 테두리 부분을 제외하고 받은 값을 넣었다.
    그 후, 테두리 부분을 제외하고 전부 상,하,좌,우 탐색했다.
    만약 현재 선택된 값보다 크거나 같은 값이 없다면 봉우리이므로 answer++; 된다.
  1. 위치값을 미리 정해두고 3중 for문을 돌리는 방식이다.
    int[] dx = {-1,0,1,0}; / int[] dy = {0,1,0,-1};
    dx는 행 값의 움직임(상,하) dy는 열 값의 움직임(좌,우)을 위한것이다.

    만약 현재 값이 arr[1][1] 이고
    nx = i+dx[k] ny = j+dy[k]를 대입해
    for(int k=0; k<4; k++)문이 돌게된다면
    1. arr[0][1](상)
    2.arr[1][2](우)
    3.arr[2][1](하)
    4.arr[1][0](좌)
    값을 시계방향으로 탐색하게 된다.

4개의 값중 현재선택된 값(arr[i][j])보다 크거나 같은 값이 있다면 봉우리가 아니다.

이때, 그냥 탐색하게 되면 arr[-1][0]과 같은 배열 값을 벗어나버리는 indexOutOfBound가 발생할 수 있으므로 예외처리를 꼭 먼저 해줘야한다!

핵심키워드

상,하,좌,우 뿐만이 아니라 대각선의 값까지 고려해야하는 문제가 있을수 있으므로, 위치값으로 문제를 해결하는 법을 더 공부하자!

0개의 댓글