[문제풀이] 02-10. 봉우리

𝒄𝒉𝒂𝒏𝒎𝒊𝒏·2023년 10월 28일
0

인프런, 자바(Java) 알고리즘 문제풀이

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 변수를
두어 즉시 반복문을 빠져나가 불필요한 연산을 줄이도록 구현하였다.

profile
𝑶𝒏𝒆 𝒅𝒂𝒚 𝒐𝒓 𝒅𝒂𝒚 𝒐𝒏𝒆.

0개의 댓글