ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • [백준][자바][11559 Puyo Puyo]
    코딩/알고리즘 2018. 10. 13. 15:28

    후...아쉽다... 중력으로 내려오는 부분을 결국엔 다른 분들 코드를 참조해서 짯다

    뭔가 맞긴했는데 아쉬운 기분...

    이번 문제는 이런식으로 풀었다 


    1. 모든 터질수 있는 포인트를 구하고

    2 . 터트린다

    3. 다운시킨다. 


    4. 반복

    이걸 함수로 딱딱 하나씩 만들어서 풀었다. 

    가끔 드는 생각이 이렇게 함수로 만들어서 코드 라인이 길어지는게 맞나 싶다.

    맞으면 다 되겠지만..항상 가독성과 코드의 줄수,메모리를 중요시하나에서 

    고민이 된다.


    난 근데 가독성을 최우선으로 두고 있다. 현재까지는..

    확실하게 잘하는 것도 아니지만.

    결국에는 프로그램은 나혼자 만드는게 아니니까.

    레거시코드는 최대한 지양하고 싶다.




    사실 마음으로는 3중 포문이 잘 와닿지 않는다.. 

    정리해보자면 

    다운 시키기 위해서는 


    for (int i = 0 ; i < 6; i++) {

    for (int j =10; j >= 0; j--) {

    for (int k = 11; k > j; k--) {

    if(map[j][i] != '.' && map[k][i] == '.') {

    map[k][i] = map[j][i];

    map[j][i] = '.';

                                                break;

    }

    }

    }


    이 구문이 필요했는데 

    잘 풀어보자면 

    첫번째 포문을 제외하면 세로부분을 땡기는 식이다 

    j 는 k보다 항상 작을 수 밖에 없다.  둘은 겹치지 않는다. 

    k는 j를 기준점으로 잡고 맨 밑부터 j전까지를 훑는다. 

    이제 다음 부분이다. 

    이 구문을 쉽게 말로해보자면

    if(map[j][i] != '.' && map[k][i] == '.')  

    위에께 뭐 있고 밑에꺼가 뭐 없을때 

    map[k][i] = map[j][i];  바꿔 치고 

    map[j][i] = '.'; 위에껄 '.' 해버리고 

    break 나가

    이다..ㅋㅋㅋ     

    간단한 예를 들자면..


    y 8

    y 9 

    .  10  

    .  11      

    일때 


    j = 10 이다.

    k = 11 이다  


    j = 9이다  

    k = 11이다

    -조건성립-  


    y

    .   9

    .  10  

    y 11  


    j = 8 이다

    k =11 이다 


    j = 7 이다

    k = 10 이다 

    -조건 성립 -


    . 8

    . 9

    y 10

    y 11


    이렇게 하나씩 내려온다... 마음으로 이해가 안되서 해보면.. 이런식으로 작동을 한다 .

    break 가 있으니 뭐가 이상하다 싶었지만

    조건문에 밑에가 . 위가  .이 아닐때라는 조건문이 걸리고 하나하나 

    비교를 하면서 가니 결국엔 모든 라인을 검사하게 된다..


    사실 이 문제를 정말 꼭 풀어보고 싶었다.

    예전 처음 알고리즘 접했을때 이문제를 풀었는데 푸는 법을 몰라 

    끙끙 대던 그때가 기억난다.. 뿌요뿌요.. 이문젠 예전 생각이 많이 난다..ㅎ

    bfs든 dfs든 아무것도 모르고 몇일 동안을 이걸 풀려고 했는데..

    바보인건지..용감한건지...아니면 바보라서 용감한건지 ㅋㅋ

    확실하게 그때 보다는 늘었다.

    지금까지 문제를 많이 풀은줄 알았는데 이문제까지 34문제 풀었더라

    본격적으로 이런문제를 푼건 아직 10문제 채도 안됬다.ㅎ 

    100문제가 목표인데 그때되면 이글을 보면서 웃을 수 있을까 싶다. 

    주절주절 얘기가 길었다,,

    사실 이렇게 글 적는게 문제 풀때 낙인거같다.ㅋㅋ

     
    
    import java.io.BufferedReader;
    import java.io.IOException;
    import java.io.InputStreamReader;
    import java.util.ArrayList;
    import java.util.LinkedList;
    import java.util.Queue;
    import java.util.StringTokenizer;
    
    class puyo_Point{
    	int x; 
    	int y;
    	puyo_Point(int y, int x){
    		this.y = y;
    		this.x = x; 
    	}
    }
    
    public class backjoon_11559_puyopuyo2 {
    	static int ans = 0 ;
    	static int dx[] = {1,-1,0,0};
    	static int dy[] = {0,0,1,-1};
    	static boolean visited[][] = new boolean[12][6];
    	static char[][] map = new char[12][6];
    	static Queue pq = new LinkedList();
    	static Queue pq_Temp = new LinkedList();
    	static ArrayList AR = new ArrayList();
    	public static void main(String[] args) throws IOException{
    		
    		BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
    		StringTokenizer st;
    		for(int i = 0 ; i < 12; i++) {
    			st = new StringTokenizer(br.readLine());
    			int idx = 0;
    			while(st.hasMoreTokens()) {
    				String s = st.nextToken();
    				for(int j = 0 ; j <6; j++) {
    					//System.out.print(s.charAt(j));
    					map[i][j] = s.charAt(j);
    				}
    			}
    		}
    		//printMap();
    		
    		
    		while ( solve() ) { 
    			breakBlock();
    			gravity_Block();
    			//printMap();
    		}
    		System.out.println(ans);
    		
    	}
    	/* 전체중에 깨질 수 있는  블록을 찾기  */
    	public static boolean solve() {
    		boolean flag = false;
    		for(int i = 0; i < 12; i++ ) {
    			for(int j = 0; j < 6; j++ ) {
    				if (map[i][j] != '.' ) {
    					pq.add(new puyo_Point(i,j));
    					if ( findSameBlock(map[i][j])) {
    						//true면 해당 블록들 전부 넣기 
    						flag = true;
    						while(!pq_Temp.isEmpty()) {
    							AR.add( pq_Temp.poll() );
    						}
    					}
    				}
    			}
    		}
    		return flag;
    	}
    	/* 블록 내리기  */
    	public static void gravity_Block() {
    		for (int i = 0 ; i < 6; i++) {
    			for (int j =10; j >= 0; j--) {
    				for (int k = 11; k > j; k--) {
    					//System.out.println("j " + j + " k " + k);
    					if(map[j][i] != '.' && map[k][i] == '.') {
    					 	map[k][i] = map[j][i];
    						map[j][i] = '.';
                        	break;
    
    					}
    				}
    			}
    		}
    	}
    	/* 벽돌 부수기 */
    	public static void breakBlock () {
    		for(int i = 0 ; i < AR.size(); i++) {
    			puyo_Point p  = AR.get(i);
    			map[p.y][p.x] = '.';
    			visited[p.y][p.x] = false;
    		}
    		ans++;
    		AR.clear();
    	}
    	
    	/* 같은 블록 찾기  */ 
    	public static boolean findSameBlock( char c ) {
    		int cnt = 0; 
    		ArrayList temp = new ArrayList();
    		//System.out.println("findSameBlock 시작 ");
    		while(!pq.isEmpty()) { 
    			puyo_Point pp = pq.poll();
    			int garo = pp.x;
    			int sero = pp.y;
    			for(int i = 0 ; i < 4; i++) {
    				int xx = dx[i] + garo;
    				int yy = dy[i] + sero;
    				if( xx >= 0 && xx < 6 && yy >= 0 && yy < 12 ) {
    					/* 다음게 c랑 같고 방문 안한 배열일 경우 */
    					if ( map[yy][xx] == c && !visited[yy][xx] ) {
    						//System.out.println("yy" + yy + " xx " + xx);
    						visited[yy][xx] = true;
    						pq.add(new puyo_Point(yy, xx));
    						temp.add(new puyo_Point(yy, xx));
    						cnt ++;
    						//System.out.println(cnt);
    					}
    				}
    			}
    		}
    		if ( cnt >= 4 ) {
    			for ( int i = 0; i < temp.size(); i++ ) {
    				pq_Temp.add(temp.get(i));
    			}
    			return true; 
    		}
    		
    		else {
    			for ( int i = 0; i < temp.size(); i++ ) {
    				int y = temp.get(i).y;
    				int x = temp.get(i).x;
    				visited[y][x] = false;
    			}
    			return false;
    		}
    	}	
    	
    	public static void printMap() {
    		for(int i = 0; i < 12; i++ ) {
    			for(int j = 0; j < 6; j++ ) {
    				System.out.print(map[i][j]);
    			}
    			System.out.println();
    		}
    		
    	}
    
    }
    
    
    


    댓글

Designed by Tistory.