카테고리 없음

[SWEA] 7699 수지의 수지 맞는 여행

SSONGMI 2021. 3. 7. 21:53
반응형

문제 출처: SW Expert Academy

 

SW Expert Academy

SW 프로그래밍 역량 강화에 도움이 되는 다양한 학습 컨텐츠를 확인하세요!

swexpertacademy.com

: 여행을 1행1열부터 시작하여 같은 명물을 1회보다 더 보지 않으면서 관광할 수 있는 명물의 최대 수를 구하면 된다.

: 수지는 상하좌우로만 움직이기 때문에 dfs에 델타 탐색을 활용한다.

: 이때 수지가 방문한 곳들을 visited 배열에 기록하여 해당 명물에 방문한 적이 있는지를 살피고 

: 방문한 적이 없다면 방문할 수 있도록 하고 방문한적이 있다면 건너 뛰도록 한다.

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.Arrays;
import java.util.StringTokenizer;
 
public class Solution {
    static BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
    static StringBuilder sb = new StringBuilder();
    static StringTokenizer st;
    static int R, C;
    static char[][] map; 
    static int[] visited;
    static int[] dr = {-1, 1, 0, 0};
    static int[] dc = {0, 0, -1, 1};
     
    public static void main(String[] args) throws NumberFormatException, IOException {
        // 테스트 케이스 수를 입력받고
        int T = Integer.parseInt(br.readLine());
         
        // 테스트 케이스 수만큼 반복하면서
        for(int tc = 1; tc <= T; tc++) {
            // R과 C를 입력받고
            st = new StringTokenizer(br.readLine());
            R = Integer.parseInt(st.nextToken());
            C = Integer.parseInt(st.nextToken());
             
            // 명물 정보를 R*C 배열에 입력받고
            map = new char[R][C];
            visited = new int['z'+1];
            for(int i = 0; i < R; i++) {
                String[] tmp = br.readLine().split("");
                for(int j = 0; j < C; j++)
                    map[i][j] = tmp[j].charAt(0);
            }
            max = 0;
            visited[map[0][0]]++;
            dfs(0,0,1);
            sb.append(String.format("#%d %d\n", tc, max));
        }
        System.out.println(sb);
    }
    static int max = 0;
    private static void dfs(int r, int c, int maxVenue) {
        // 0행 0열부터 시작해서 상하좌우를 살피며
        for(int d = 0; d < 4; d++) {
            // 해당 알파벳을 본게 총 1회 보다 크지 않도록 하여
            if(r+dr[d] < 0 || r + dr[d] >= R || c + dc[d] < 0 || c+ dc[d] >= C || visited[map[r+dr[d]][c+dc[d]]] > 0) continue;
            int nr = r + dr[d];
            int nc = c + dc[d];
            visited[map[nr][nc]]++;
            // 방문하고
            dfs(nr, nc, maxVenue+1);
            visited[map[nr][nc]]--;
        }
        if(maxVenue > max) {
            // 더 이상 갈 수 있는 곳이 없으면max값과 비교하여 갱신
            max = maxVenue;
            return;
        }
         
    }
}
반응형