<링크>
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 |