본문 바로가기

백준

2799)블라인드

https://www.acmicpc.net/problem/2799


어려운 알고리즘을 요구하는 문제는 아니고 구현 실력을 시험해보기 위한 문제같다.


################
#****#****#****#
#****#****#****#
#****#....#****#
#....#....#****#
################
#....#****#****#
#....#****#....#
#....#....#....#
#....#....#....#
################

입력이 이렇게 주어져도 한 줄 씩, 한 문자씩 모두 읽고 각 창문의 블라인드 상태를 파악할 필요는 없다.


창문은 세로로 4칸으로 이루어져 있고 *를 만날 때마다 상태를 하나씩 증가시키면 된다.


예를 들어 두 번째 층의 첫 번째 창문은


****

****

****

. . . .

인데 한 줄 씩 첫 문자만 읽어 state를 증가시킨다.


따라서 state는 0~4의 상태를 갖는다.


주어진 입력에서 한 줄 씩 읽기 위해 i를 증가시킬 때


i%5가 0이 아니면 창문의 블라인드 상태를 만났다고 볼 수 있다.


한 줄 씩 읽으며 각 창문의 상태를 바꿔줘야 한다.


i%5가 0이면 ###...을 만났다고 볼 수 있다.


층을 구분하기 위해 사용된 ###..에서는 이전까지 과정에서 얻은 각 창문의 상태를 카운팅해야 한다.


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
#include<stdio.h>
#define STATE_NUM 5
 
int main() {
    int M, N;
    int strNum;
    int strLength;
    int eachStateNum[STATE_NUM] = {0,0,0,0,0};
    char *S;
    int *eachWindowState; //0~4까지 상태. 블라인드로 가려진만큼 1씩 증가
 
    scanf("%d %d",&M,&N);
    strNum = 5*M+1;
    strLength = 5*N+1;
 
    S = (char *)malloc(sizeof(char)*(strLength+1));
    eachWindowState = (int *)calloc(N,sizeof(int));
 
    for (int i = 0; i < strNum;i++) {
        scanf("%s", S);
 
        if (i % 5 != 0) {
            for (int j = 0; j < N; j++) {
                if (S[5*j+1== '*') eachWindowState[j]++;
            }
        }
        else {
            if (i == 0continue;
            
            int index;
            for (int j = 0; j < N; j++) {
                index = eachWindowState[j];
                eachStateNum[index]++;
                eachWindowState[j] = 0;
            }
        }
    }
 
    for (int i = 0; i < STATE_NUM;i++) {
        printf("%d ", eachStateNum[i]);
    }
    printf("\n");
 
    return 0;
}
cs




'백준' 카테고리의 다른 글

4659)비밀번호 발음하기  (0) 2019.02.02
3460)이진수  (0) 2019.02.01
2822)점수 계산  (0) 2019.01.31
5397)키로거  (0) 2019.01.31
2846)오르막길  (0) 2019.01.30