본문 바로가기
코드업(codeup)/C

[코드업(codeup)/C]코드업(codeup) 4040 : 펜션 C언어

by starfish22 2022. 1. 21.
728x90

▶문제 : 펜션 (codeup.kr)

 

펜션

1. 첫째 줄에 두 개의 정수 n과 m이 주어진다. n은 펜션에서 관리하는 여름 성수기 총 기간을 나타내고, m은 펜션이 보유하고 있는 방의 개수이다(1≤n≤100, 3≤m≤30). 편의상 성수기 기간을 1일부터

codeup.kr

 

▶코드 작성

#include <stdio.h>

int main()
{
    int n, m;
    int s, t;
    char room[100][31];
    scanf("%d %d", &n, &m);
    for (int i = 0; i < n; i++) {
        scanf(" %s", room[i]);
    }
    scanf("%d %d", &s, &t);

    int count = 0, max[2] = {0};//max배열={연속으로 'O'가 나오는 개수 , 그 배열 자리}
    int temp;
    for (int i = s - 1; i < t - 1; i++)//고객의 일정에 맞게 범위 조정
    {
        max[0] = 0;
        for (int j = 0, l; j < m; j++)
        {
            if (room[i][j] == 'O')//'O'찾으면
            {
                temp = 1;
                for (l = i + 1; l < t - 1; l++)//temp=연속으로 나오는 개수
                {
                    if (room[l][j] == 'O') temp++;
                    else break;
                }
                if (max[0] < temp)//연속으로 나오는 개수 중 가장 큰 값을 찾을 때
                {
                    max[0] = temp;
                    if (l == t - 1)//마지막 날짜일 때 종료
                    {
                        printf("%d", count);
                        return 1;
                    }
                    else max[1] = l;//연속으로 나오는 값의 배열 자리
                }
            }
        }
        if (i == max[1])//전과 같은 배열 자리라면 'O'가 없다는 뜻이므로 종료
        {
            printf("-1");
            return 0;
        }
        else i = max[1] - 1;//i++을 고려해서 배열 자리 대입
        count++;
    }
}

 

▶해석

for문으로 고객의 일정에 맞게 범위를 조정하였다.

두 번째 for문으로는 i(날짜)에 있는 'O'를 찾아서 'O'가 몇 번이나 연속돼서 나오는지 세 번째 for문으로 찾아서 temp에 개수를 저장하였다.

max배열로 max[0]는 for문으로 계속 나오는 temp을 비교하여 가장 큰 값으로 유지해준다.

큰 값을 찾을 때는 temp을 max [0]에 대입하고, 세 번째 for문에서 'O'개수를 구한 날짜 l이 고객의 마지막 날짜 t에서 -1 한 값과 같다면 기간이 끝나서 옮긴 횟수를 출력하고 종료한다.

아직 기간이 남으면 max[1]는 max [0]의 배열 자리(날짜)이므로 l을 대입해준다.

max [1]까지 'O'를 찾았으니 i값에 max [1]-1을 대입해준다.

만약 i값에 대입해도 전과 같은 max[1]가 온다면 i==max [1]로 체크해주어 더 이상 'O'가 없다는 뜻이므로 "-1"을 출력한다.

728x90

댓글