회원가입
로그인
Toggle navigation
문제
문제
전체 문제
문제 출처
단계별로 풀어보기
알고리즘 분류
추가된 문제
문제 순위
문제
푼 사람이 한 명인 문제
아무도 못 푼 문제
최근 제출된 문제
최근 풀린 문제
랜덤
출처
ICPC
Olympiad
한국정보올림피아드
한국정보올림피아드시․도지역본선
전국 대학생 프로그래밍 대회 동아리 연합
대학교 대회
카카오 코드 페스티벌
Coder's High
ICPC
Regionals
World Finals
Korea Regional
Africa and the Middle East Regionals
Europe Regionals
Latin America Regionals
North America Regionals
South Pacific Regionals
문제집
대회
1
채점 현황
랭킹
게시판
그룹
더 보기
재채점 기록
블로그
강의
실험실
도움말
BOJ Stack
BOJ Book
전체
공지
자유
질문
오타/오역/요청
게시판 공지
홍보
업데이트
solved.ac
글쓰기
질문 도움말
자주묻는 질문
C++ 11%에서 시간초과 납니다.
10711번 - 모래성
ganzena
3년 전
0
sandQ는 검증할 모래성
delQ는 파도가 한번 치고 삭제될 모래성입니다
왜 시간초과가 나는걸까요? ㅜㅜㅜㅜ
// // main.cpp // [10711] 모래성 // // Created by YOO TAEWOOK on 2020/09/23. // #include <iostream> #include <vector> #include <queue> #include <algorithm> #define endl '\n' using namespace std; vector<vector<int> > beach; //vector<pair<int, int> > dir; int dx[8] = {0, 0, 1, 1, 1, -1, -1, -1}; int dy[8] = {1, -1, 0, -1, 1, 0, 1, -1}; queue<pair<int, int> > sandQ; queue<pair<int, int> > delQ; void init(); void solve(); int W, H; int day = 0; int main(int argc, const char * argv[]) { init(); solve(); return 0; } void solve(){ while(1){ int qSize = (int)sandQ.size(); int queueCnt = qSize; // 횟수 카운트 하기위해서 큐사이즈만큼만 실행 while(queueCnt--){ int cnt = 0; pair<int, int> now = sandQ.front(); sandQ.pop(); for(int i = 0 ; i < 8 ; i++){ pair<int, int> next = pair<int, int>(now.first + dx[i], now.second + dy[i]); // 주변 탐색 if(next.first >= H || next.first < 0 || next.second >= W || next.second < 0) continue; // 파도가 있다면 카운트 if(beach[next.first][next.second] == 0) cnt++; } //무너질 모래는 delQ에 넣는다 if(cnt >= beach[now.first][now.second]) delQ.push(now); else sandQ.push(now); } // delQ에 있는 좌표를 모두 0으로 변환 while(!delQ.empty()){ beach[delQ.front().first][delQ.front().second] = 0; delQ.pop(); } // 파도 친 횟수 카운트 day++; // 탈출 조건 if(qSize == (int)sandQ.size() || sandQ.empty()) break; } cout<<day<<endl; } void init(){ //freopen("input.txt", "r", stdin); ios_base::sync_with_stdio(false); cin.tie(NULL); cout.tie(NULL); cin>>H>>W; beach.assign(H, vector<int>(W, 0)); for(int i = 0 ; i < H ; i++){ string input; cin>>input; for(int j = 0 ; j < W ; j++){ //파도는 0으로 변환 if(input.at(j) == '.') beach[i][j] = 0; else{ beach[i][j] = input.at(j) - '0'; // 절대 무너지지 않을 모래성은 큐에 포함하지 않음 if(beach[i][j] == 9) continue; sandQ.push(pair<int, int>(i, j)); } } } }
댓글을 작성하려면
로그인
해야 합니다.
ganzena 3년 전
sandQ는 검증할 모래성
delQ는 파도가 한번 치고 삭제될 모래성입니다
왜 시간초과가 나는걸까요? ㅜㅜㅜㅜ