코딩테스트/문제풀이

[코드트리] 숨은 단어 찾기 2

알렉스 페레이라 2023. 4. 26. 18:48

완전탐색과 이동탐색을 합친 문제다 어렵지는 않았는데 해당 기능을 자주 이용할 수 있을것같아 기록함.

 


N과 M이 주어지고 또 N * M의 문자열이 주어지면 가로, 세로, 대각선 뱡향으로 도중에 방향을 틀지 않고 인접하여 나오는 ‘LEE’ 의 개수를 구하는 프로그램을 작성해보세요.

 

입력 형식

첫 번째 줄에 정수 N과 M이 공백을 사이에 두고 주어집니다.

  • 1 ≤ N, M ≤ 50

출력 형식

첫 번째 줄에 모든 'LEE'의 개수를 출력합니다.

 

입출력 예제

예제1

입력:

4 6
TAEHGI
EELVWE
LEELSE
HBLUEL

출력:

6

예제 설명

아래 그림과 같이 'LEE'의 개수는 총 6개 입니다.

 

 

내 코드

import java.util.*;

public class Main {
    static int n;
    static int m;
    static String[][] arr;
    static int[] dx = new int[]{-1,-1,0,1,1,1,0,-1};
    static int[] dy = new int[]{0,1,1,1,0,-1,-1,-1};

    static boolean inRange(int r, int c, int d){
        return r >= 0 && r < n && c >= 0 && c < m;
    }

    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);

        n = sc.nextInt();
        m = sc.nextInt();
        arr = new String[n][m];

        for(int i = 0; i < n; i++){
            String[] temp = sc.next().split("");
            for(int j = 0; j < temp.length; j++){
                arr[i][j] = temp[j];
            }
        }

        int cnt = 0;
        for(int i = 0; i < n; i++){ //행
            for(int j = 0; j < m; j++){ //렬
                for(int k = 0; k < dx.length; k++){
                    int r = i; //현재 행
                    int c = j; //현재 열
                    StringBuilder sb = new StringBuilder();//방향
                    for(int l = 0; l < 3; l++){
                        if(inRange(r, c, k)){
                            sb.append(arr[r][c]);
                            r += dx[k];
                            c += dy[k];

                        }else{
                            break;
                        }
                    }
                    if(sb.toString().equals("LEE"))cnt++;
                }
            }
        }
        System.out.print(cnt);
    }
}