[JAVA] 봉우리 - Array(1, 2차원 배열)

2023. 10. 22. 01:52·💡 Algorithm/인프런

 

public class INF0210 {
    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        int n = sc.nextInt();
        int[][] grid = new int[n+2][n+2];

        //0 채우기
        for (int i = 0; i <n; i++) {
            for (int j = 0; j < n; j++) {
                grid[0][j] = 0;
                grid[n-1][j] = 0;
                grid[i][0] = 0;
                grid[i][n-1] = 0;
            }
        }

        //중앙에 값 입력받기
        for (int i = 0; i < n; i++) {
            for (int j = 0; j < n; j++) {
                grid[i+1][j+1] = sc.nextInt();
            }
        }

        INF0210 inf = new INF0210();
        System.out.println(inf.solution(n, grid));
    }

    public int solution(int n, int[][] grid) {
        int answer = 0;

        for (int i = 1; i <= n; i++) {
            for (int j = 1; j <= n; j++) {
                if(grid[i][j] > grid[i-1][j] && grid[i][j] > grid[i+1][j] && grid[i][j] > grid[i][j-1] && grid[i][j] > grid[i][j+1]) {
                    answer++;
                }
            }
        }

        return answer;
    }
}

풀이

정석대로 가생이에 0 채우고

중앙에 값을 입력받아 상하좌우를 비교한 방식.

 

문제는 없지만 나중에 DFS, BFS 등 난이도 있는 문제를 하다 보면 영상처럼 경곗값 확인을 자주 하게 되는데,

나처럼 if문에 상하좌우 조건을 4개 걸 경우에 대각성까지 8방향을 탐색하는 문제가 나오면 8개의 조건을 걸어야 해 가독성에서 좋지 않다고 한다.

 

강의에 있는 코드를 이해해 보자.

 

public class INF0210T1 {
    public static void main(String[] args){
        INF0210T1 T = new INF0210T1();
        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));
    }

    public int solution(int n, int[][] arr){
        int[] dx = {-1, 0, 1, 0};
        int[] dy = {0, 1, 0, -1};

        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;
    }
}

풀이

1. 시계 방향에 대한 x, y 배열을 미리 만들어 놓는다. ex) 현재 좌표에서 x-1하면 상, y+1 하면 우, x+1하면 하, y-1하면 좌`int[] dy = {0, 1, 0, -1};`

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

 

2. 현재 좌표에서 배열을 더해 시계 방향대로 돌면서 비교한다.

` int nx = i+dx[k]; `

` int ny = j+dy[k]; `

 

3. 0에 대한 부분은 outOfRange 에러가 터지기 때문에 0에 좌표에 대한 조건을 건다.

`nx >= 0 && nx < n && ny >= 0 && ny < n`

 

`nx < n, ny < n`인 이유는 이차원 배열의 크기가 n*n 크기이면 행 인덱스 번호는 0번부터 n-1번까지 생기기 때문이다.

그래서 nx < n 일 때만 접근하도록 해주는 것이다.

만약 현재 지점이 arr[n-1][0] 지점이라고 한다면 이 지점에서 6시 방향(아래방향)을 탐색하게 되면 nx는 n이 될 수 있다.

 

 

4. 상, 하, 좌, 우 중에 나보다 크거나 같은 값이 있다면 루프를 더 이상 돌지 않아도 됨

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

` flag = false; `

` break; `

 

 


인프런 - 자바(Java) 알고리즘 문제풀이 입문: 코딩테스트 대비 강의에 나오는 알고리즘 문제입니다.

 

저작자표시 비영리 (새창열림)

'💡 Algorithm > 인프런' 카테고리의 다른 글

[Java] 멘토링 - Array(1, 2차원 배열)  (0) 2024.11.14
[Java] 두 배열 합치기 - Two-Pointers Algorithm  (0) 2023.10.28
[Java] 등수구하기 - Array(1, 2차원 배열)  (0) 2023.10.24
[JAVA] 임시반장 정하기 - Array(1, 2차원 배열)  (0) 2023.10.23
[Java] 특정 문자 뒤집기 - String(문자열)  (1) 2023.10.21
[JAVA] 단어 뒤집기 - String(문자열)  (0) 2023.10.20
'💡 Algorithm/인프런' 카테고리의 다른 글
  • [Java] 등수구하기 - Array(1, 2차원 배열)
  • [JAVA] 임시반장 정하기 - Array(1, 2차원 배열)
  • [Java] 특정 문자 뒤집기 - String(문자열)
  • [JAVA] 단어 뒤집기 - String(문자열)
현주먹
현주먹
대구 불주먹 출신 현주먹의 개발.log
  • 현주먹
    현주먹의 개발로그
    현주먹
  • 전체
    오늘
    어제
    • 전체글 (179)
      • 👶🏻 CS (15)
        • Operating System (7)
        • DB (5)
        • Data Structure (2)
        • Software Engineering (1)
      • 💻 Dev (54)
        • Java & OOP (24)
        • Spring (4)
        • DB&JPA (6)
        • Test Code (1)
        • JSP & Servlet (13)
        • Etc (6)
      • 💡 Algorithm (25)
        • 인프런 (9)
        • 백준 (16)
      • 🛠 DevOps & Tool (11)
        • Linux (4)
        • AWS (1)
        • Git (2)
        • Etc (4)
      • 📝 끄적끄적 (74)
        • 후기 및 회고 (11)
        • TDD, 클린 코드 with Java 17기 (3)
        • F-Lab (23)
        • 🖥️ 자바의 정석 (11)
        • 📖 Clean Code (3)
        • 항해99 코테 스터디 (11)
        • 📖 가상 면접 사례로 배우는 대규모 시스템 설계 .. (11)
  • 블로그 메뉴

    • 🐈‍⬛ GitHub
    • TIL repository
  • 인기 글

  • 최근 글

  • 최근 댓글

  • 태그

    F-Lab
    코테스터디
    ==와 equals()
    개구리책
    백준
    99클럽
    코딩테스트준비
    객체지향
    오라클
    자바의정석
    오블완
    항해99
    TDD 클린 코드 with Java
    인프런 특정문자뒤집기
    개발자취업
    데브클럽
    에프랩
    til
    NextSTEP
    jsp
    JPA
    2025스프링캠프
    자바의신절판
    C
    jsp 2.3 웹 프로그래밍: 기초부터 중급까지
    에프랩 후기
    티스토리챌린지
    로또 미션
    개발자멘토링
    f-lab 후기
  • hELLO· Designed By정상우.v4.10.2
현주먹
[JAVA] 봉우리 - Array(1, 2차원 배열)
상단으로

티스토리툴바