알고리즘 공부/프로그래머스

(Java)프로그래머스 코딩테스트 연습 - 2018 KAKAO BLIND RECRUITMENT - [1차] 프렌즈4블록

HRuler 2020. 11. 30. 20:39

1. 문제

https://programmers.co.kr/learn/courses/30/lessons/17679#qna

 

코딩테스트 연습 - [1차] 프렌즈4블록

프렌즈4블록 블라인드 공채를 통과한 신입 사원 라이언은 신규 게임 개발 업무를 맡게 되었다. 이번에 출시할 게임 제목은 프렌즈4블록. 같은 모양의 카카오프렌즈 블록이 2×2 형태로 4개가 붙

programmers.co.kr

2. 나의 풀이

class Solution {
    public int solution(int m, int n, String[] board) {
        int answer = 0;
        String [][] arr = new String [m][n];
        for(int i = 0; i < board.length; i = i + 1) {
        	arr[i] = board[i].split("");
        }
        /*
        for(String [] imsi : arr) {
        	System.out.println(Arrays.toString(imsi));
        }
        */
        
        answer = sackgegaesu(arr, new boolean[m][n], answer);
        
        return answer;
    }
    
    int sackgegaesu(String [][] board, boolean [][] visited, int answer) {
    	int su = 0;
    	for(int i = 0; i < board.length - 1; i = i + 1) {
    		for(int j = 0; j < board[i].length - 1; j = j + 1) {
    			if(board[i][j].equals("0")) {
    				continue;
    			}
    			if(!board[i][j].equals(board[i][j + 1])) {
    				continue;
    			}
    			if(!board[i][j].equals(board[i + 1][j])) {
    				continue;
    			}
    			if(!board[i][j].equals(board[i + 1][j + 1])) {
    				continue;
    			}
    			su += 1;
    			visited[i][j] = true;
    			visited[i][j + 1] = true;
    			visited[i + 1][j] = true;
    			visited[i + 1][j + 1] = true;
    		}
    	}
    	answer = 0;
    	for(int i = 0; i < board.length; i = i + 1) {
    		for(int j = 0; j < board[i].length; j = j + 1) {
    			if(visited[i][j] == true) {
    				board[i][j] = "0";
    				answer += 1;
    			}
    		}
    	}
    	if(su == 0) {
    		return answer;
    	}
    	for(int i = board.length - 1; i >= 0; i = i - 1) {
    		for(int j = board[i].length - 1; j >= 0; j = j - 1) {
    			int imsi = 0;
    			for(int p = i + 1; p < board.length; p = p + 1) {
    				if(visited[p][j] == true) {
    					imsi += 1;
    				}
    			}
    			String str = board[i][j];
    			board[i][j] = board[i + imsi][j];
    			board[i + imsi][j] = str;
    			boolean bool = visited[i][j];
    			visited[i][j] = visited[i + imsi][j];
    			visited[i + imsi][j] = bool;
    		}
    	}
        /*
    	for(String [] imsi : board) {
        	System.out.println(Arrays.toString(imsi));
        }
    	for(boolean [] imsi : visited) {
        	System.out.println(Arrays.toString(imsi));
        }
    	System.out.println("answer : " + answer);
        */
    	answer = sackgegaesu(board, visited, answer); 
    	return answer;
    }
}

3. 다른 사람 풀이

class Solution {
  public int solution(int m, int n, String[] board) {
      int answer = 0;
      char[][] boardArr = new char[m+2][n+2];
      int answerbefor = -1;
                   for(int  i =0; i<m; i++){
          for(int  j =0; j<n; j++){
          boardArr[i][j]= board[i].toCharArray()[j];
         }  
      }

      while(true){
          if(answer == answerbefor){
              break;
          }
          answerbefor = answer;

        boolean[][] boardCleaner = new boolean[m+2][n+2];
              for(int  i =0; i<m; i++){
          for(int  j =0; j<n; j++){
              if(boardArr[i][j]==boardArr[i][j+1]&&boardArr[i][j]!=' '){
                   if(boardArr[i][j]==boardArr[i+1][j+1]){
                    if(boardArr[i][j]==boardArr[i+1][j]){
                        boardCleaner[i][j] = true;
                        boardCleaner[i+1][j] = true;
                        boardCleaner[i+1][j+1] = true;
                        boardCleaner[i][j+1] = true;
                    }
                    }
              }
             //System.out.print(boardArr[i][j]    );
         }  
         //  System.out.println();
         //  System.out.println();
      }
// System.out.println();

      for(int  i =0; i<m; i++){
          for(int  j =0; j<n; j++){
              if(boardCleaner[i][j]){
                   boardArr[i][j] = ' ';
                  answer++;
                  boardCleaner[i][j] = false;
              }

         }  

      }
   //    System.out.println("anser : "+answer);
      //   for(int  i =0; i<m; i++){
      //     for(int  j =0; j<n; j++){
      //         System.out.print(boardArr[i][j] );
      //    }  
      //   //   System.out.println(); 
      // }
// System.out.println();
        for(int k = 0; k<m; k++){
        for(int  i =m; i>0; i--){
          for(int  j =0; j<n; j++){
              if(boardArr[i][j]==' '){
                  // System.out.print("!");
              boardArr[i][j] = boardArr[i-1][j];
              boardArr[i-1][j] = ' ';
              }
         }  
           //System.out.println();
      }
        }
      //      for(int  i =0; i<m; i++){
      //     for(int  j =0; j<n; j++){
      //         System.out.print(boardArr[i][j] );
      //    }  
      //      System.out.println();
      // }
      //    System.out.println();
      }

      return answer;
  }
}