Junior-Developer
Home
  • Category (316)
    • 문제풀이 (270)
      • 백준oj (201)
      • 프로그래머스 (53)
      • 명품 자바 프로그래밍(개정4판) (11)
      • 구름 (5)
    • 알고리즘 (6)
    • Node.js (2)
    • 체크리스트 (37)
블로그 내 검색
Home

Junior-Developer

1일 1커밋! 1일 1 백준!

  • 문제풀이/백준oj

    [백준OJ] 11559번 Puyo Puyo

    2021. 9. 26.

    by. Hyeon-Uk

    반응형

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

     

    11559번: Puyo Puyo

    총 12개의 줄에 필드의 정보가 주어지며, 각 줄에는 6개의 문자가 있다. 이때 .은 빈공간이고 .이 아닌것은 각각의 색깔의 뿌요를 나타낸다. R은 빨강, G는 초록, B는 파랑, P는 보라, Y는 노랑이다.

    www.acmicpc.net


     

    풀이

    1. 배열을 모두 탐색하며, 색이 같고 4개이상 붙어있는 퍼즐들을 모두 끌어모은다.

     

    2. 해당 퍼즐들을 모두 터트리며, 터트린 퍼즐의 위에 있는 퍼즐들을 모두 내려준다. 이때, 겹치지 않기 위해, 터트릴땐 맨 위에있는 퍼즐먼저 터트려주며 횟수를 1 증가시킨다.

     

    3. 탐색을 했을때, 색이 같고 4개이상 붙어있는 퍼즐이 없다면 종료한 뒤, 횟수를 출력해준다.

     

    코드

    #include<iostream>
    #include<algorithm>
    #include<vector>
    #include<queue>
    using namespace std;
    
    typedef pair<int, int> pii;
    char maze[12][6];
    int mv[4][2] = { {0,1},{0,-1},{1,0},{-1,0} };
    bool visited[12][6];
    
    void input() {
    	for (int i = 0; i < 12; i++) {
    		for (int j = 0; j < 6; j++) {
    			cin >> maze[i][j];
    		}
    	}
    }
    void init() {
    	for (int i = 0; i < 12; i++) {
    		for (int j = 0; j < 6; j++) {
    			visited[i][j] = false;
    		}
    	}
    }
    
    bool compare(pii a, pii b) {
    	return a.first < b.first;
    }
    
    bool isIn(int x, int y) {
    	return 0 <= x && x < 12 && 0 <= y && y < 6;
    }
    
    vector<pii> bfs(int i, int j) {
    	char c = maze[i][j];
    	vector<pii> result;
    	queue<pii> q;
    	q.push({ i,j });
    	result.push_back({ i,j });
    	visited[i][j] = true;
    	while (!q.empty()) {
    		int x = q.front().first;
    		int y = q.front().second;
    		q.pop();
    		for (int d = 0; d < 4; d++) {
    			int nx = x + mv[d][0];
    			int ny = y + mv[d][1];
    
    			if (isIn(nx, ny) && !visited[nx][ny] && maze[nx][ny] == c) {
    				q.push({ nx,ny });
    				result.push_back({ nx,ny });
    				visited[nx][ny] = true;
    			}
    		}
    	}
    	return result;
    }
    
    void popAndDonwPuzzle(vector<pii>& puzzle) {
    	sort(puzzle.begin(), puzzle.end(), compare);
    	for (pii pz : puzzle) {
    		int x = pz.first;
    		int y = pz.second;
    
    		if (x == 0) maze[x][y] = '.';
    		else {
    			for (int i = x; i >= 1; i--) {
    				maze[i][y] = maze[i - 1][y];
    				maze[i - 1][y] = '.';
    			}
    		}
    	}
    }
    
    void solve() {
    	int cnt = 0;
    	while (true) {
    		bool change = false;
    		init();
    		vector<pii> puzzles;
    		for (int i = 0; i < 12; i++) {
    			for (int j = 0; j < 6; j++) {
    				if (maze[i][j] != '.'&&!visited[i][j]) {
    					vector<pii> puzzle = bfs(i, j);
    					if (puzzle.size() >= 4) {
    						puzzles.insert(puzzles.end(),puzzle.begin(),puzzle.end());
    						change = true;
    					}
    				}
    			}
    		}
    		if (!change) break;
    		popAndDonwPuzzle(puzzles);
    		cnt++;
    	}
    	cout << cnt << "\n";
    }
    
    int main() {
    	input();
    	solve();
    	return 0;
    }
    반응형
    저작자표시

    '문제풀이 > 백준oj' 카테고리의 다른 글

    [백준OJ] 4256번 트리  (0) 2021.09.28
    [백준OJ] 20366번 같이 눈사람 만들래?  (0) 2021.09.27
    [백준OJ] 10282번 해킹  (0) 2021.09.26
    [백준OJ] 2933번 미네랄  (0) 2021.09.26
    [백준OJ] 4779번 칸토어 집합  (0) 2021.09.26

    댓글

    관련글

    • [백준OJ] 4256번 트리 2021.09.28
    • [백준OJ] 20366번 같이 눈사람 만들래? 2021.09.27
    • [백준OJ] 10282번 해킹 2021.09.26
    • [백준OJ] 2933번 미네랄 2021.09.26
    맨 위로
전체 글 보기
Tistory 로그인
Tistory 로그아웃
로그아웃 글쓰기 관리

Today

Total

Powered by ⓒ Kakao Corp.

Designed by Nana
블로그 이미지
Hyeon-Uk

티스토리툴바