Post List

[BOJ] 백준 2799 블라인드

[BOJ] 백준 2799 블라인드



문제 링크 : https://www.acmicpc.net/problem/2799


이 문제에서의 아파트의 창문 규격과 매 층의 높이는 동일합니다.
따라서 문자열의 인덱스마다 순회하지 않고, 동일층 다른호수 : 5 * (호수) + 1,
층간 높이 : 5 * (m번째 층) + 1 로 체크할 지점을 선정해 놓으면 문제풀이가 간단해 집니다.


- 층을 구분해 주는 벽은 #의 연속 입니다. 따라서 이 부분은 순회하지 않습니다.
- 창문은 4칸으로 구성되어 있습니다. 따라서 첫번째 칸만 조사한다면 그 집이 블라인드를 
  쳤는지 안쳤는지 알 수 있습니다.


소스코드 :


#include 
#include 
#include 
using namespace std;

int main() {
 int m,n;
 cin >> m >> n;
 cin.ignore();
 int arr[5] = { 0, };

 // 층마다 몇단 블라인드를 쳤는지 알기위한 벡터 tmp 선언.
 vector tmp(5, 0);
 for (int i = 0; i < 5 * m + 1; i++) {
  string str; getline(cin, str);

  // 층간 간격을 구분해주는 "###..." 문자열 이라면
  if (str[1] == '#') {

   // tmp를 최종 배열인 arr에 저장해 주고, tmp 제거, 그리고 다시 0으로 초기화.
   for (int i = 0; i < 5; i++) {
    arr[i] += tmp[i];
   }
   tmp.clear();
   for (int i = 0; i < 5; i++) {
    tmp.push_back(0);
   }
   continue;
  }
  int cnt = 0;
  for (int j = 0; j < n; j++) {

   // 블라인드가 쳐져있다면 cnt ++
   if (str[5 * j + 1] == '*') {
    cnt++;
   }
  }

  // 만약 이번에 입력받은 문자열의 cnt가 0이면 이전 tmp에서 다음단계의 블라인드는 없음
  // cnt가 0 이상이라면, 이전단계의 블라인드 개수는 cnt 의 값만큼 줄어들고,
  // 이번단계의 블라인드의 개수는 cnt만큼 증가함.
  if (i % 5 == 1) {
   tmp[i % 5 - 1] = n - cnt;
   tmp[i % 5] = cnt;
  }
  else if (i % 5 > 1) {
   if (cnt == 0) continue;
   tmp[i % 5] = cnt;
   tmp[i % 5 - 1] -= cnt;
  }
 }
 for (int i = 0; i < 5; i++) {
  cout << arr[i] << ' ';
 }
}

댓글