BOJ

백준 1652번 누울 자리를 찾아라 [C언어]

Sloth Coder 2022. 9. 5. 21:18

문제 출처: https://www.acmicpc.net/problem/1652

 

1652번: 누울 자리를 찾아라

첫째 줄에 방의 크기 N이 주어진다. N은 1이상 100이하의 정수이다. 그 다음 N줄에 걸쳐 N개의 문자가 들어오는데 '.'은 아무것도 없는 곳을 의미하고, 'X'는 짐이 있는 곳을 의미한다.

www.acmicpc.net

 

 

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로 끊어진 자리를 구분해서 세야 하는게 조금 까다로운 문제였다.