<링크>

https://www.acmicpc.net/problem/1652


<소스코드>

1
2
3
4
5
6
7
8
9
10
11
12
13
14
#include<cstdio>
char pan[101][101];
int main() {
    int N, r, c;
    scanf("%d"&N);
    for (int i = 0; i < N; i++)
        scanf("%s", pan[i]);
    for (int i = 0; i < N; i++)
        for (int j = 0; j < N - 1; j++)
            r += pan[i][j] == '.' && pan[i][j + 1== '.' && pan[i][j + 2!= '.',
            c += pan[j][i] == '.' && pan[j + 1][i] == '.' && pan[j + 2][i] != '.';
    printf("%d %d", r, c);
    return 0;
}
cs


<풀이>

길이가 2이던 그보다 길던 자리는 1개로 치기 때문에


.........x 이렇게 있는경우랑

..x 이렇게 있는 경우랑 둘다 하나의 자리로 친다.


그럼 ..x인 순간만 찾아내면 된다.


.........x...x....x..x

자리가 이렇게 있으면


.......(..x).(..x)..(..x)(..x) 총 4자리가 난다



..x.. 

이런상황이면

(..x)(..) 총 두자리가 난다.

N*N보다 배열 크기를 더 잡아주면 남은 공간엔 0이 들어가있다.

그래서 우측벽은

위의 코드에서

pan[i][j+2]!='.' 에 해당하므로 

..x

..벽

두가지 다 답으로 더해지게 된다.


가로, 세로를 한번에 보려고 (i,j) (j,i)를 동시에 체크했다.

'알고리즘 풀이 > 수학' 카테고리의 다른 글

백준 1110 더하기 사이클  (0) 2018.08.29
백준 1722 순열의 순서  (0) 2018.07.26

+ Recent posts