λ³Έλ¬Έ λ°”λ‘œκ°€κΈ°

[λ°°μ—΄] 10. λ΄‰μš°λ¦¬

μ‹œνλ¦¬ν‹°μ§€ν˜Έ 2023. 12. 20.
10. λ΄‰μš°λ¦¬
 

μ„€λͺ…

지도 정보가 N*N κ²©μžνŒμ— μ£Όμ–΄μ§‘λ‹ˆλ‹€. 각 κ²©μžμ—λŠ” κ·Έ μ§€μ—­μ˜ 높이가 μ“°μ—¬μžˆμŠ΅λ‹ˆλ‹€.

각 격자판의 숫자 쀑 μžμ‹ μ˜ μƒν•˜μ’Œμš° μˆ«μžλ³΄λ‹€ 큰 μˆ«μžλŠ” λ΄‰μš°λ¦¬ μ§€μ—­μž…λ‹ˆλ‹€. λ΄‰μš°λ¦¬ 지역이 λͺ‡ 개 μžˆλŠ” μ§€ μ•Œμ•„λ‚΄λŠ” ν”„λ‘œκ·Έλž¨μ„ μž‘μ„±ν•˜μ„Έμš”.

격자의 κ°€μž₯μžλ¦¬λŠ” 0으둜 μ΄ˆκΈ°ν™” λ˜μ—ˆλ‹€κ³  κ°€μ •ν•œλ‹€.

λ§Œμ•½ N=5 이고, 격자판의 μˆ«μžκ°€ λ‹€μŒκ³Ό κ°™λ‹€λ©΄ λ΄‰μš°λ¦¬μ˜ κ°œμˆ˜λŠ” 10κ°œμž…λ‹ˆλ‹€.

μž…λ ₯

첫 쀄에 μžμ—°μˆ˜ N이 μ£Όμ–΄μ§„λ‹€.(2<=N<=50)

두 번째 쀄뢀터 N쀄에 걸쳐 각 쀄에 N개의 μžμ—°μˆ˜κ°€ μ£Όμ–΄μ§„λ‹€. 각 μžμ—°μˆ˜λŠ” 100을 λ„˜μ§€ μ•ŠλŠ”λ‹€.

좜λ ₯

λ΄‰μš°λ¦¬μ˜ 개수λ₯Ό 좜λ ₯ν•˜μ„Έμš”.

μ˜ˆμ‹œ μž…λ ₯ 1 

5
5 3 7 2 3
3 7 1 6 1
7 2 5 3 4
4 3 6 4 1
8 7 3 5 2

μ˜ˆμ‹œ 좜λ ₯ 1

10

 

 

 

<<풀이>>

-λ‚˜μ˜ 풀이-

 

이 λ¬Έμ œλŠ” μ–΄λ ΅μ§€λŠ” μ•Šλ‹€. λ°”κΉ₯이 0으둜 λ‘˜λŸ¬ μŒ“μ—¬ μžˆλ‹€λŠ” 것을 κ°μ•ˆν•΄μ„œ λ‚΄λΆ€ 값을 λ„£μ–΄μ€€λ‹€κ³  μƒκ°ν–ˆμ„ λ•Œ, μ›λž˜ λ°°μ—΄ 크기에  2μ”© μ¦κ°€μ‹œν‚€λ©΄ λœλ‹€. 그리고 값을 넣을 λ•Œλ„ 이쀑 for문으둜 1λΆ€ν„° nκΉŒμ§€ λŒ€μž…ν•΄μ£Όλ©΄ λœλ‹€.

 

κ·Έ λ‹€μŒ 쑰건문에 &&λ₯Ό 많이 μ‚¬μš©ν–ˆμ§€λ§Œ μƒν•˜μ’Œμš° μ „λΆ€λ‹€ 클 λ•Œ, count μ¦κ°€μ‹œμΌœμ„œ μ΅œμ’… λ΄‰μš°λ¦¬ 수λ₯Ό κ³„μ‚°ν•˜λ©΄ λœλ‹€.

 

import java.util.Scanner;

class Main {

    public int solution(int n, int[][] arr) {
        int count = 0;
        for (int i = 1; i < n + 1; i++) {
            for (int j = 1; j < n + 1; j++) {
                if (arr[i][j] > arr[i + 1][j] && arr[i][j] > arr[i][j + 1] && arr[i][j] > arr[i - 1][j] && arr[i][j] > arr[i][j - 1] ){
                    count++;
                }
            }
        }
        return count;
    }


    public static void main(String[] args) {
        Main T = new Main();
        Scanner in = new Scanner(System.in);
        int n = in.nextInt();
        int[][] arr = new int[n + 2][n + 2];
        for (int i = 1; i < n + 1; i++) {
            for (int j = 1; j < n + 1; j++) {
                arr[i][j] = in.nextInt();
            }
        }

        System.out.println(T.solution(n, arr));
    }
}

 

 

-κ°•μ‚¬λ‹˜ 풀이-

 

μš°μ„  이번 κ°•μ‚¬λ‹˜μ˜ ν’€μ΄λŠ” μ‹œκ°„ λ³΅μž‘λ„λŠ” λ‚˜λ³΄λ‹€ λ³΅μž‘ν•΄ 보인닀.

ν•˜μ§€λ§Œ

int[] dx = {-1, 0, 1, 0};
int[] dy = {0, 1, 0, -1};

 

이런 ν˜•μ‹μœΌλ‘œ 두고 μƒν•˜ 쒌우 값을 λΉ„κ΅ν•˜λŠ” ν•˜λŠ”λ° 이런 식은 μ§€κΈˆμ€ λͺ°λΌλ„ λ‚˜μ€‘μ— λ³΅μž‘ν•΄μ§€λ©΄ μœ μš©ν•˜λ‹€.(κ·Έ 문제λ₯Ό μ œλŒ€λ‘œ λ§Œλ‚˜ 봐야 ν• κ±° κ°™κΈ΄ν•˜λ‹€ γ…‹γ…‹)

 

μ•„λ¬΄νŠΌ μ΄λŸ¬ν•œ 방식을 ν†΅ν•΄μ„œ ꡬ할 수 μžˆμ—ˆκ³ , boolean을 ν†΅ν•΄μ„œ 참이면 answer ++λ₯Ό 해쀬닀.

import java.util.Scanner;

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 < 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 in = new Scanner(System.in);
        int n = in.nextInt();
        int[][] arr = new int[n][n];
        for (int i = 0; i < n ; i++) {
            for (int j = 0; j < n ; j++) {
                arr[i][j] = in.nextInt();
            }
        }

        System.out.println(T.solution(n, arr));
    }
}

 

 

<<μΆ”κ°€ λ‚΄μš©>>

1. μˆœμ„œ

특히 λ‹€μ‹œ μƒκΈ°μ‹œν‚€κ³  κΈ°μ–΅ν•΄μ•Ό ν•  λ‚΄μš©μ΄ μžˆλ‹€λ©΄, λ°”λ‘œ 이 μ½”λ“œμ΄λ‹€.

if (nx >= 0 && nx < n && ny >= 0 && ny < n && arr[nx][ny] >= arr[i][j]) {
    flag = false;
    break;
}

 

ifμ•ˆμ— μžˆλŠ” λ‹€ν•­ μ—°μ‚°μ˜ μˆœμ„œλ„ μ€‘μš”ν•˜λ‹€. 처음 λΆ€ν„°

arr[nx][ny] >= arr[i][j]

μ΄λŸ¬ν•œ ν˜•μ‹μ΄ 였면 ν‹€λ¦¬κ²Œ λœλ‹€. λ¨Όμ € μ‚¬μš©ν•˜μ§€ λͺ»ν•˜λŠ” nx, nyλ₯Ό λΆ„λ₯˜ 해놓고 ν•΄μ•Όν•œλ‹€.

λ”°λΌμ„œ μœ„μ˜ 첫번째 μ½”λ“œμ²˜λŸΌ λ¨Όμ € 걸러 놓고 κ·Έλ‹€μŒ μ½”λ“œλ₯Ό λ„£μ–΄μ•Ό ν•œλ‹€.

 

2. break

break; 

-> μ΄λŠ” μ‹€ν–‰ν•˜κ³  μžˆλŠ” λ°˜λ³΅λΆ„μ„ 쀑지 μ‹œν‚€κ³  κ·Έ μ™ΈλΆ€μ˜ μ½”λ“œκ°€ λŒμ•„κ°„λ‹€. μ—¬κΈ°μ„œ return을 λ„£κ²Œλ˜λ©΄ μ•„μ˜ˆ 연산이 λλ‚˜κ³  μ’…λ£Œ λœλ‹€.

 

λŒ“κΈ€