[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] << ' '; } }
댓글
댓글 쓰기