Notice
Recent Posts
Recent Comments
Link
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | ||||||
2 | 3 | 4 | 5 | 6 | 7 | 8 |
9 | 10 | 11 | 12 | 13 | 14 | 15 |
16 | 17 | 18 | 19 | 20 | 21 | 22 |
23 | 24 | 25 | 26 | 27 | 28 |
Tags
- 2839
- 2638
- 스프링
- 호유동
- 투어
- 맛집 투어
- Servlet
- BFS
- 양꼬치
- 스프링 MVC
- 2589
- 문자열 압축
- 프로그래머스
- 1로 만들기
- 알고리즘
- 다이나믹 프로그래밍
- dp
- 완도산회
- 맛집
- 포두부 보쌈
- 백준
- 동적 프로그래밍
- Spring
- 2020 KAKAO BLIND
- 고모네 콩탕
- 쓰레드 풀
- HTTP API
- 설탕 배달
- mvc
- 서블릿
Archives
- Today
- Total
프로그래밍 공방
[프로그래머스] 프렌즈4블록 본문
문제
programmers.co.kr/learn/courses/30/lessons/17679
코딩테스트 연습 - [1차] 프렌즈4블록
프렌즈4블록 블라인드 공채를 통과한 신입 사원 라이언은 신규 게임 개발 업무를 맡게 되었다. 이번에 출시할 게임 제목은 프렌즈4블록. 같은 모양의 카카오프렌즈 블록이 2×2 형태로 4개가 붙
programmers.co.kr
문제해결방법
1. check 함수를 통해 보드를 돌면서 지워지는 블록들을 체크한다.
2. redraw 함수로 블록들을 지우고 아래로 내린다.
3. 위 과정을 더 이상 블록이 지워지지 않을때까지 계산한다
코드
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 | package Programmers; public class Solution_프렌즈4블록 { public static int[][] dir = {{1, 0}, {0, 1}, {1, 1}}; public static void redraw(char[][] map, boolean[][] v) { int m = map.length; int n = map[0].length; for(int i=0; i<n; i++) { for(int j=m-1; j>=0; j--) { if(v[j][i]) { v[j][i] = false; char ch = '^'; for(int k=j-1; k>=0; k--) { if(!v[k][i]) { ch = map[k][i]; v[k][i] = true; break; } } map[j][i] = ch; } } } } public static int check(int i, int j, char[][] map, boolean[][] v) { int count = 0; char ch = map[i][j]; for(int d=0; d<dir.length; d++) { int ii = i+dir[d][0]; int jj = j+dir[d][1]; if(ii>=0 && ii<map.length && jj>=0 && jj<map[0].length && map[ii][jj]==ch) continue; else return 0; } for(int d=0; d<dir.length; d++) { int ii = i+dir[d][0]; int jj = j+dir[d][1]; if(!v[ii][jj]) { v[ii][jj] = true; count++; } } if(!v[i][j]) { v[i][j] = true; count++; } return count; } public static int solution(int m, int n, String[] board) { int answer = 0; boolean[][] v = new boolean[m][n]; char[][] map = new char[m][n]; for(int i=0; i<m; i++) { for(int j=0; j<n; j++) map[i][j] = board[i].charAt(j); } while(true) { int sum = 0; for(int i=0; i<m; i++) { for(int j=0; j<n; j++) { if(map[i][j]=='^') continue; sum += check(i, j, map, v); } } if(sum==0) break; answer += sum; redraw(map, v); } return answer; } public static void main(String[] args) { int m = 6; int n = 6; String[] board = {"TTTANT", "RRFACC", "RRRFCC", "TRRRAA", "TTMMMF", "TMMTTJ"}; System.out.println(solution(m, n, board)); } } | cs |
코드에 대한 피드백이나 더 좋은 아이디어는 언제나 환영입니다.
'개발 > 문제해결' 카테고리의 다른 글
[백준] 12865번 : 평범한 배낭 (0) | 2021.01.05 |
---|---|
[프로그래머스] 캐시 (0) | 2021.01.05 |
[프로그래머스] 지형 이동 (0) | 2021.01.02 |
[LeetCode] Median of Two Sorted Arrays (0) | 2021.01.01 |
[백준] 2156번 : 포도주 시식 (0) | 2021.01.01 |