[백준] 1236번. 성 지키기 (C언어)

윤라이트·2023년 10월 18일

백준 코딩테스트

목록 보기
6/25

하이루. 이번 문제는 브론즈1.

[백준] 1236번. 성 지키기


하... 이 문제 꽤나 오래 걸렸다.

사실 아직 문제를 푸는 중인데 어떻게 풀어 나갈 지 대충 감은 오는데
코드 짜는 부분에서 막혀서 결국 구글링 해봤다.

코드는 보지 않고 살짝 글만 봤는데...
경비원이 없는 행과 열 중 더 큰 값을 출력하면 되는 것이였다.

나는 막 0행에 X(경비원) 하나도 없는지 찾고 없다면
0행에 1열도 확인, 2열도 확인... 그렇게 모두 찾아서
행과 열 중 더 큰 값을 출력하는 것으로 결론 지었다.

하나 하나씩 비교하지 않아도 되는 것이였다.
위 결론을 내리기까지에도 시간이 많이 소요 됐었다.
문제를 분석하는 능력이 아직 너무 부족한 것 같다.
아직이라기엔 한 것이 없긴 함...;

하.. 무튼 그래도 일단 내가 하려던 코드라도 보여주고 싶다.
아래가 바로 그 코드이다.
짜다 만 코드이다.



! 짜다가 말아 버린 코드 !

#define _CRT_SECURE_NO_WARNINGS

#include<stdio.h>
#include<string.h>

int main(void) {

    int N, M, count = 0, guard = 0;
    int empty[50] = { 0 }, n = 0;
    char castle[50][50] = { 0 };

    scanf("%d %d", &N, &M); // 성의 가로 크기 N, 세로 크기 M 입력 받기. 
    
    for (int i = 0; i < N; i++) {
        for (int j = 0; j < M + 1; j++) { // 마지막은 널문자가 들어가기에 1을 더함.
            scanf("%c", &castle[i][j]); // 성의 상태 입력 받기.
        }
    }

    for (int i = 0; i < N; i++) {  // 행의 개수만큼 for문 반복.
        for (int j = 0; j < M; j++) { // 열의 개수만큼 for문 반복.
            if (castle[i][j] == 'X') { // i행에 X가 들어 있다면 
                count++; // count 값을 증가 시킨다.
            }
        }
        if (count == 0) { // 만일 count가 0. 즉, i행에 X(경비원)가 하나도 없을 경우.
            empty[n] = i; // i행의 값을 배열에 추가.
            n++; // 다음 i행의 값 저장을 위해 다음 인덱스로 이동.
        }
        else {
            count = 0;
        }
    } 

    // 이제 열 비교....



    return 0;
}



! 최종 완성 코드 !

#define _CRT_SECURE_NO_WARNINGS

#include<stdio.h>
#include<string.h>

int main(void) {

    int N, M, countR = 0, countC = 0;
    char castle[50][50] = { 0 };

    scanf("%d %d", &N, &M); // 성의 가로 크기 N, 세로 크기 M 입력 받기. 
    
    for (int i = 0; i < N; i++) {
        for (int j = 0; j < M; j++) { // 마지막은 널문자가 들어가기에 1을 더함.
            scanf(" %c", &castle[i][j]); // 성의 상태 입력 받기.
        }
    }

    for (int i = 0; i < N; i++) {  // 행의 개수만큼 for문 반복.
        int emptyCount = 0;
        for (int j = 0; j < M; j++) { // 열의 개수만큼 for문 반복.
            if (castle[i][j] != 'X') { // i행에 X가 들어 있다면 
                emptyCount++; // count 값을 증가 시킨다.
            }
        } 
        if (emptyCount == M) { 경비원이 하나도 없다면
            countR++; // 경비원이 없는 행 수 추가.
        } 
    }   

    for (int i = 0; i < M; i++) {  // 열의 개수만큼 for문 반복.
        int emptyCount = 0;
        for (int j = 0; j < N; j++) { // 열의 개수만큼 for문 반복.
            if (castle[j][i] != 'X') { // i열에 X가 들어 있다면 
                emptyCount++; // count 값을 증가 시킨다.
            }
            else {
                break;
            }
        }
        if (emptyCount == N) { // 경비원이 하나도 없다면
            countC++; // 경비원이 없는 열 수 추가.
        } 
    }

    if (countR < countC) { 행과 열 중 큰 값 출력 하기
        printf("%d", countC);
    }
    else {
        printf("%d", countR);
    }



    return 0;
}

역경을 겪은 과정...

    1. 복잡한 문제 분석 과정으로 인한 시간 소요
    1. 2차원 배열 길이 분석 과정 (몇 년전에 배웠던 문자열과 배열.. 기억력 분해...)
    1. 문자를 입력 받을 땐 모든 공백 문자를 무시 x

scanf 함수는 서식 지정자에 따라 입력을 처리하는데, %c 서식 지정자를 사용할 때 문자를 입력받는 동안 공백 문자(스페이스, 탭, 개행 등)을 무시하지 않음. 따라서 %c로 문자를 입력받을 때 입력 스트림에 남아있는 공백 문자(보통 개행 문자)도 문자로 처리될 수 있음!!!

예를 들어, 사용자가 "A"를 입력하고 Enter 키를 누르면 실제로 입력 스트림에는 "A\n"이 남게 됨. %c를 사용하면 개행 문자('\n')도 문자로 간주되어 변수에 저장 된단다...

아오 참.... 이 쉬운 문제를 어렵게 접근해서 오래 걸리기도 했지만
생각보다 얼척 없는 곳에서 문제가 발생한다..

하지만 이 얼척 없다고 느껴지는 간단한 문제가
다 성장하는 과정 속의 나뭇가지일 뿐이겠지..!!!!!!!

아자 아자 화이팅.....

profile
끝까지 가보자9~!!!🔥✨💡

0개의 댓글