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 == 0) continue; 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 |