티스토리 뷰
생각
주어진 조건에 맞게 활주로를 건설하여라.
처음 생각
index의 숫자 값을 temp 변수에 저장시키면서 가로 완전 탐색한 뒤 세로 완전 탐색을 생각하였다.
▶ 비교를 해나가면서 만족 조건을 따져줘야하기 때문에 완전탐색을 하였다.
다음 생각
현재 index의 숫자 값을 기준으로 +1, -1, 같은지, 그 외 의 조건을 나누었고, 그 외 조건은 활주로의 높이가 1이기 때문에 바로 break 문으로 빠져나가 다음 줄을 검사하였다.
다다음 생각
낮은 곳에서 +1되는 높은 곳으로 올라갈 때는 이전 까지 갯수를 센 것을 x값과 비교해서 바로 체크를 하면 됐는데, -1로 낮아지는 경우는 조금 난해했다.
▶ boolean형 변수인 flag를 하나 더 만들어서 낮은 조건을 따져야 하는건지 체크하였다.
다다다음 생각
여기까지하니 예제 조건은 거의다 맞았는데 1,2개 정도가 틀렸었다.
▶ 중복해서 활주로를 건설할 수 없다는 조건 때문에 2 2 1 1 1 2 2 요렇게 있을 때, 위의 조건들만 하면 x가 3일 경우 내려갈 때, 올라갈 때 다 만족하지만 실제로는 활주로가 중복 건설이 안되기 때문에 false 처리를 해주어야했다.
방안
1) 중복처리를 막기위해 이전 숫자와 같은 경우에서 개수 변수 cnt를 +1 시켜주고 flag2(내려왔을 경우)가 true 값이면 현 cnt와 x를 비교해서 x에 도달했으면 cnt를 0으로 초기화 시켜주었다.
▶올라갔을 경우는 바로 건설 가능 불가능이 체크되므로 내려갔을 경우만 체크하였다.
2) 가로처리와 세로처리는 인덱스만 교차시켜주면 되므로 복붙해서 i 와 j를 바꿔주었다.
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 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 | import java.io.BufferedReader; import java.io.IOException; import java.io.InputStreamReader; import java.util.StringTokenizer; class Solution { static int n,x; static int[][] arr; public static void main(String[] args) throws IOException{ BufferedReader br = new BufferedReader(new InputStreamReader(System.in)); StringBuilder sb = new StringBuilder(); int tc = Integer.parseInt(br.readLine()); for(int i=1;i<=tc;i++) { StringTokenizer st = new StringTokenizer(br.readLine()); n = Integer.parseInt(st.nextToken()); x = Integer.parseInt(st.nextToken()); arr = new int[n][n]; for(int j=0;j<n;j++) { st = new StringTokenizer(br.readLine()); for(int k=0;k<n;k++) arr[j][k] = Integer.parseInt(st.nextToken()); } sb.append("#"+i+" "+solve()+"\n"); } System.out.print(sb); } private static int solve() { int result = 0; // 가로 탐색 for(int i=0;i<n;i++) { int cnt = 0; int temp = arr[i][0]; boolean flag = true; boolean flag2 = false; for(int j=0;j<n;j++) { if(temp==arr[i][j]) { cnt++; if(flag2&&cnt==x) { cnt = 0; flag2 = false; } }else if(temp-1==arr[i][j]) { // 앞 칸이 낮아졌다는건 앞쪽에 활주로를 체크해야함 if(flag2&&cnt<x) { flag = false; flag2 = false; break; } cnt = 1; flag2 = true; temp = arr[i][j]; }else if(temp+1==arr[i][j]) { if(flag2&&cnt<x) { flag = false; flag2 = false; break; } flag2 = false; // 현 칸이 낮다는건 cnt를 기준으로 활주로를 체크해야함 if(cnt<x) { flag = false; break; } cnt = 1; temp = arr[i][j]; }else { // 한 칸 차이가 아니면 활주로 불가 flag = false; flag2 = false; break; } } if(flag2) if(cnt<x) flag = false; if(flag) result++; } // 세로 탐색 for(int i=0;i<n;i++) { int cnt = 0; int temp = arr[0][i]; boolean flag = true; boolean flag2 = false; for(int j=0;j<n;j++) { if(temp==arr[j][i]) { cnt++; if(flag2&&cnt==x) { cnt = 0; flag2 = false; } }else if(temp-1==arr[j][i]) { // 앞 칸이 낮아졌다는건 앞쪽에 활주로를 체크해야함 if(flag2&&cnt<x) { flag = false; flag2 = false; break; } cnt = 1; flag2 = true; temp = arr[j][i]; }else if(temp+1==arr[j][i]) { if(flag2&&cnt<x) { flag = false; flag2 = false; break; } flag2 = false; // 현 칸이 낮다는건 cnt를 기준으로 활주로를 체크해야함 if(cnt<x) { flag = false; break; } cnt = 1; temp = arr[j][i]; }else { // 한 칸 차이가 아니면 활주로 불가 flag = false; flag2 = false; break; } } if(flag2) if(cnt<x) flag = false; if(flag) result++; } return result; } } | cs |
'알고리즘 > SW Expert' 카테고리의 다른 글
[SW Expert] 5653. [모의 SW 역량테스트] 줄기세포배양 (8) | 2018.09.20 |
---|---|
[SW Expert] 4013. [모의 SW 역량테스트] 특이한 자석 (0) | 2018.09.16 |
[SW Expert] 5432. 쇠막대기 자르기 (0) | 2018.09.06 |
[SW Expert] 5521. 상원이의 생일파티 (0) | 2018.09.06 |
[SW Expert] 1953. [모의 SW 역량테스트] 탈주범 검거 (0) | 2018.09.03 |
- Total
- Today
- Yesterday