문제 출처: https://www.acmicpc.net/problem/1652
Sol)
#include <stdio.h>
int main(){
int N, cnt_width = 0, cnt_height = 0;
scanf("%d", &N);
char room[N][N];
for(int k = 0; k < N; k++) {
getchar(); //'\n' 제거 위함
for (int i = 0; i < N; i++) {
scanf("%c", &room[k][i]);
}
}
for(int k = 0; k < N; k++) {
int flag = 0;
for (int i = 1; i < N; i++) {
if (room[k][i] == '.' && room[k][i - 1] == '.' && !flag) {
cnt_width++;
flag = 1;
}
else if(!(room[k][i] == '.' && room[k][i - 1] == '.'))
flag = 0;
}
}
for (int i = 0; i < N; i++){
int flag = 0;
for (int k = 1; k < N; k++){
if (room[k][i] == '.' && room[k - 1][i] == '.' && !flag) {
cnt_height++;
flag = 1;
}
else if(!(room[k][i] == '.' && room[k - 1][i] == '.'))
flag = 0;
}
}
printf("%d %d\n", cnt_width, cnt_height);
return 0;
}
- 풀이 방향
가로 방향과 세로방향 모두 세야하기때문에 2차원 배열에 저장은 해 주어야 겠다. 연속한 '.'를 두개 단위로 세 주면서 연속된 '.'들과 X로 끊어져 있지만 '.'이 두 개 이상이라 누울 수 있는 자리를 구분지어 세 주는 것이 포인트가 되겠다.
- 풀이
입력은 %s로 받아도 되고, 위 코드처럼 %c로 받아도 된다. 단, %s로 받을 경우 NULL문자를 고려해 가로 크기를 +1 해 주어야 한다.
자리의 개수를 셀 때는 flag변수를 이용해 두칸 이상의 빈자리가 연속되게 나오고 있는지 아닌지를 체크한다. 만일 연속된 빈자리, 즉 flag = 1로 체크 돼 있는 경우는 다시 개수를 세면 안되므로 넘어간다. X가 나오면 flag = 0 으로 체크해준다.
- 문제에 대한 사견
연속된 자리와 X로 끊어진 자리를 구분해서 세야 하는게 조금 까다로운 문제였다.
'BOJ' 카테고리의 다른 글
백준 1004번 어린 왕자 [JAVA] (0) | 2022.09.09 |
---|---|
백준 1010번 다리 놓기 [JAVA] (0) | 2022.09.06 |
백준 3273번 두 수의 합 [C언어] (2) | 2022.09.02 |
백준 11718번 그대로 출력하기 [C언어] (0) | 2022.08.30 |
백준 1358번 하키 [C언어] (0) | 2022.08.30 |