Notice
Recent Posts
Recent Comments
Link
«   2025/01   »
1 2 3 4
5 6 7 8 9 10 11
12 13 14 15 16 17 18
19 20 21 22 23 24 25
26 27 28 29 30 31
Archives
Today
Total
관리 메뉴

최's 먹공로그

SEA1861_정사각형 방 본문

APS

SEA1861_정사각형 방

ChoiSH313 2019. 3. 10. 17:07

https://www.swexpertacademy.com/main/code/problem/problemDetail.do?contestProbId=AV5LtJYKDzsDFAXc&categoryId=AV5LtJYKDzsDFAXc&categoryType=CODE

 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.Arrays;
import java.util.StringTokenizer;
/**
 * dfs이지만 visited을 하면 오히려 꼬임, visited을 안해도 어차피 자신보다 작은 값은 안가니깐 상관없음
 * visited을 사용하면 새로운 숫자로 시작을 못할 때가 있음
 */
 
public class Solution {
 
    static int[] dx = { -1010 };
    static int[] dy = { 0-101 };
    static int cnt;
 
    public static void main(String[] args) throws Exception {
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
 
        int test_case = Integer.parseInt(br.readLine().trim());
        for (int tc = 1; tc <= test_case; tc++) {
 
            int N = Integer.parseInt(br.readLine().trim());
            int[][] map = new int[N][N];
 
            for (int i = 0; i < N; i++) {
                StringTokenizer st = new StringTokenizer(br.readLine().trim(), " ");
                for (int j = 0; j < N; j++) {
                    map[i][j] = Integer.parseInt(st.nextToken());
                }
            }
 
            // max : 최대 이동한 방 , min_number : 최대로 이동한 방 중에서 출발방이 가장 작은 방
            int max = 1;
            int min_number = Integer.MAX_VALUE;
            // count : 각 방들의 번호를 인덱스로 하는 곳에 cnt를 넣어줌
            int[] count = new int[1000000];
            for (int i = 0; i < N; i++) {    
                for (int j = 0; j < N; j++) {
                    cnt = 0;
                    int number = map[i][j];
                    dfs(map, i, j, N, number);
                    cnt++;
                    count[number] = cnt;
                }
            }
            // 불필요하게 count배열 끝까지 검사할 필요 없게끔
            int M = N*N;
            for (int i = 0; i < M; i++) {
                // count배열 보면서 큰 값을 저장 그때의 인덱스를 저장
                if(max < count[i]) { // < , <= 의 차이!! count배열은 자동으로 sort해준 역할을 해준다
                    max = count[i];
                    min_number = i;
                }
            }
            System.out.println("#" + tc + " " + min_number + " " + max);
 
        } // end of tc
    } // end of main
 
    private static void dfs(int[][] map, int x, int y, int size, int number) {
 
        for (int i = 0; i < 4; i++) {
            int nx = x + dx[i];
            int ny = y + dy[i];
            // 범위안이고 이동할방번호가 현재보다 1클때만
            if (nx >= 0 && nx < size && ny >= 0 && ny < size && map[nx][ny] - number == 1) {
                cnt++;
                /*number = map[nx][ny];
                dfs(map, nx, ny, size, number);
                처음에는 이렇게 해줬었음 이렇게 하면
                1 3
                2 4 일때 1에서 2로 이동하고 다시 number = 1로 된상태로 다른곳을 탐색해야 되는데
                그게 안됨
                *******dfs로 다시 값줄때는 다른곳에서 사용하는 변수에 넣고 주지말고 바로 주자*******
                */
                dfs(map, nx, ny, size, map[nx][ny]);
            }
        }
    } // end of dfs
// end of class
 
cs

'APS' 카테고리의 다른 글

BOJ7576_토마토  (0) 2019.03.12
SEA7236_저수지의 물의 총 깊이 구하기  (0) 2019.03.10
SEA7234_안전 기지(User Problem)  (2) 2019.03.07
SEA3752_가능한 시험점수  (0) 2019.03.07
SEA1493_수의 새로운 연산  (0) 2019.03.07