티스토리 뷰
생각
주어진 예제는 다음과 같다
빈 칸은 '.'로 짐이 있는 칸은 'X'로 주어진다. 빈 칸이 두칸 이상 연결되어 있으면 누울 곳이 된다. 위의 경우 가로로 누울곳은 5곳 세로로 누울곳은 4곳이 되므로 5 4 를 출력한다.
처음 생각
그대로 조건을 탐색하여 풀이를 하였더니 '틀렸습니다'가 나왔다.
다음 생각
짐 칸을 기준으로 새로운 누울곳이 있다면 그곳도 누울곳으로 추가될 수 있었다.
문제에서 좀 더 친절하게 "누울곳은 짐칸으로 구분 될 수 있다" 같은 언급을 해주었으면 좋았을 것 같다.
방안
1) boolean형 flag 변수를 선언하여 '.'이 두개가 연속되어있으면 누울곳으로 판단해 flag를 false로 바꿔준다.('.'이 짐을 만나기 전에 연속해서 있으면 그 자리는 1개로 쳐야하므로)
2) 탐색중 짐을 만나면 flag를 다시 true로 바꿔주어 이후 연속된 '.'를 만나면 개수를 늘려준다.
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 | import java.io.IOException; import java.util.Scanner; public class Main{ public static void main(String[] args) throws IOException{ Scanner sc = new Scanner(System.in); int n = sc.nextInt(); int[][] arr = new int[n][n]; for(int i=0;i<n;i++) { String t = sc.next(); for(int j=0;j<n;j++) arr[i][j] = t.charAt(j); } solve(n,arr); System.out.println(garo+" "+sero); } static int garo,sero; private static void solve(int n,int[][] arr) { boolean flag = true; // 가로 찾기 for(int i=0;i<n;i++) { flag = true; for(int j=0;j<n-1;j++) { if(arr[i][j]=='.'&&arr[i][j+1]=='.') { if(!flag) continue; garo++; flag = false; } if(arr[i][j]=='X') flag = true; } } // 세로 찾기 for(int i=0;i<n;i++) { flag = true; for(int j=0;j<n-1;j++) { if(arr[j][i]=='.'&&arr[j+1][i]=='.') { if(!flag) continue; sero++; flag = false; } if(arr[j][i]=='X') flag = true; } } } } | cs |
'알고리즘 > 백준' 카테고리의 다른 글
[백준] 14891번 톱니바퀴 (0) | 2018.09.05 |
---|---|
[백준] 2294번 동전 2 (0) | 2018.09.05 |
[백준] 2789번 유학 금지 (0) | 2018.09.02 |
[백준] 2455번 지능형 기차 (0) | 2018.08.31 |
[백준] 1260번 DFS와 BFS (0) | 2018.08.29 |
댓글
공지사항
최근에 올라온 글
최근에 달린 댓글
- Total
- Today
- Yesterday