Skip to content

Commit 5fe1ce7

Browse files
committed
[level 2] Title: [1차] 프렌즈4블록, Time: 32.08 ms, Memory: 101 MB -BaekjoonHub
1 parent 188e046 commit 5fe1ce7

File tree

2 files changed

+166
-0
lines changed

2 files changed

+166
-0
lines changed
Lines changed: 97 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,97 @@
1+
# [level 2] [1차] 프렌즈4블록 - 17679
2+
3+
[문제 링크](https://school.programmers.co.kr/learn/courses/30/lessons/17679)
4+
5+
### 성능 요약
6+
7+
메모리: 101 MB, 시간: 32.08 ms
8+
9+
### 구분
10+
11+
코딩테스트 연습 > 2018 KAKAO BLIND RECRUITMENT
12+
13+
### 채점결과
14+
15+
정확성: 100.0<br/>합계: 100.0 / 100.0
16+
17+
### 제출 일자
18+
19+
2025년 08월 05일 09:55:07
20+
21+
### 문제 설명
22+
23+
<h2>프렌즈4블록</h2>
24+
25+
<p>블라인드 공채를 통과한 신입 사원 라이언은 신규 게임 개발 업무를 맡게 되었다. 이번에 출시할 게임 제목은 "프렌즈4블록".<br>
26+
같은 모양의 카카오프렌즈 블록이 2×2 형태로 4개가 붙어있을 경우 사라지면서 점수를 얻는 게임이다.</p>
27+
28+
<p><img src="http://t1.kakaocdn.net/welcome2018/pang1.png" title="Friends 4 block!" alt="board map"><br>
29+
만약 판이 위와 같이 주어질 경우, 라이언이 2×2로 배치된 7개 블록과 콘이 2×2로 배치된 4개 블록이 지워진다. 같은 블록은 여러 2×2에 포함될 수 있으며, 지워지는 조건에 만족하는 2×2 모양이 여러 개 있다면 한꺼번에 지워진다.</p>
30+
31+
<p><img src="http://t1.kakaocdn.net/welcome2018/pang2.png" title="Friends 4 block!" alt="board map"></p>
32+
33+
<p>블록이 지워진 후에 위에 있는 블록이 아래로 떨어져 빈 공간을 채우게 된다.</p>
34+
35+
<p><img src="http://t1.kakaocdn.net/welcome2018/pang3.png" title="Friends 4 block!" alt="board map"></p>
36+
37+
<p>만약 빈 공간을 채운 후에 다시 2×2 형태로 같은 모양의 블록이 모이면 다시 지워지고 떨어지고를 반복하게 된다.<br>
38+
<img src="http://t1.kakaocdn.net/welcome2018/pang4.png" title="Friends 4 block!" alt="board map"></p>
39+
40+
<p>위 초기 배치를 문자로 표시하면 아래와 같다.</p>
41+
<div class="highlight"><pre class="codehilite"><code>TTTANT
42+
RRFACC
43+
RRRFCC
44+
TRRRAA
45+
TTMMMF
46+
TMMTTJ
47+
</code></pre></div>
48+
<p>각 문자는 라이언(R), 무지(M), 어피치(A), 프로도(F), 네오(N), 튜브(T), 제이지(J), 콘(C)을 의미한다</p>
49+
50+
<p>입력으로 블록의 첫 배치가 주어졌을 때, 지워지는 블록은 모두 몇 개인지 판단하는 프로그램을 제작하라.</p>
51+
52+
<h3>입력 형식</h3>
53+
54+
<ul>
55+
<li>입력으로 판의 높이 <code>m</code>, 폭 <code>n</code>과 판의 배치 정보 <code>board</code>가 들어온다.</li>
56+
<li>2 ≦ <code>n</code>, <code>m</code> ≦ 30</li>
57+
<li><code>board</code>는 길이 <code>n</code>인 문자열 <code>m</code>개의 배열로 주어진다. 블록을 나타내는 문자는 대문자 A에서 Z가 사용된다.</li>
58+
</ul>
59+
60+
<h3>출력 형식</h3>
61+
62+
<p>입력으로 주어진 판 정보를 가지고 몇 개의 블록이 지워질지 출력하라.</p>
63+
64+
<h3>입출력 예제</h3>
65+
<table class="table">
66+
<thead><tr>
67+
<th>m</th>
68+
<th>n</th>
69+
<th>board</th>
70+
<th>answer</th>
71+
</tr>
72+
</thead>
73+
<tbody><tr>
74+
<td>4</td>
75+
<td>5</td>
76+
<td>["CCBDE", "AAADE", "AAABF", "CCBBF"]</td>
77+
<td>14</td>
78+
</tr>
79+
<tr>
80+
<td>6</td>
81+
<td>6</td>
82+
<td>["TTTANT", "RRFACC", "RRRFCC", "TRRRAA", "TTMMMF", "TMMTTJ"]</td>
83+
<td>15</td>
84+
</tr>
85+
</tbody>
86+
</table>
87+
<h3>예제에 대한 설명</h3>
88+
89+
<ul>
90+
<li>입출력 예제 1의 경우, 첫 번째에는 A 블록 6개가 지워지고, 두 번째에는 B 블록 4개와 C 블록 4개가 지워져, 모두 14개의 블록이 지워진다.</li>
91+
<li>입출력 예제 2는 본문 설명에 있는 그림을 옮긴 것이다. 11개와 4개의 블록이 차례로 지워지며, 모두 15개의 블록이 지워진다.</li>
92+
</ul>
93+
94+
<p><a href="http://tech.kakao.com/2017/09/27/kakao-blind-recruitment-round-1/" target="_blank" rel="noopener">해설 보러가기</a></p>
95+
96+
97+
> 출처: 프로그래머스 코딩 테스트 연습, https://school.programmers.co.kr/learn/challenges
Lines changed: 69 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,69 @@
1+
import java.util.HashSet;
2+
import java.util.Set;
3+
import java.util.Stack;
4+
5+
class Solution {
6+
public static char[][] gameBoard;
7+
public int solution(int m, int n, String[] board) {
8+
int answer = 0;
9+
gameBoard = new char[m][n];
10+
11+
for (int i = 0; i < m; i++) {
12+
gameBoard[i] = board[i].toCharArray();
13+
}
14+
15+
while (true) {
16+
Set<String> temp = new HashSet<>(); // 삭제 할 블록 임시 저장
17+
for (int i = 0; i < m - 1; i++) {
18+
for (int j = 0; j < n - 1; j++) {
19+
// 2x2 블록 완성
20+
if (check(gameBoard[i][j], gameBoard[i+1][j], gameBoard[i][j+1], gameBoard[i+1][j+1])) {
21+
temp.add(i + "," + j);
22+
temp.add((i + 1) + "," + j);
23+
temp.add(i + "," + (j + 1));
24+
temp.add((i + 1) + "," + (j + 1));
25+
}
26+
}
27+
}
28+
29+
int removedCnt = temp.size();
30+
if (removedCnt == 0) break;
31+
answer += removedCnt;
32+
33+
blockDown(temp, m, n);
34+
}
35+
return answer;
36+
}
37+
38+
private void blockDown(Set<String> temp, int m, int n) {
39+
for(String str : temp){
40+
int i = Integer.parseInt(str.split(",")[0]);
41+
int j = Integer.parseInt(str.split(",")[1]);
42+
gameBoard[i][j] = ' '; // 공백으로 초기화
43+
}
44+
45+
for (int j = 0; j < n; j++) {
46+
Stack<Character> stack = new Stack<>();
47+
for (int i = 0; i < m; i++) {
48+
if(gameBoard[i][j] != ' '){
49+
stack.push(gameBoard[i][j]);
50+
}
51+
}
52+
53+
for (int k = m - 1; k >= 0; k--) {
54+
if (!stack.empty()) {
55+
gameBoard[k][j] = stack.pop();
56+
} else {
57+
gameBoard[k][j] = ' '; // 공백으로 채우기
58+
}
59+
}
60+
}
61+
}
62+
63+
private boolean check(char ch1, char ch2, char ch3, char ch4) {
64+
if (ch1 != ' ' && ch1 == ch2 && ch1 == ch3 && ch1 == ch4) {
65+
return true;
66+
}
67+
return false;
68+
}
69+
}

0 commit comments

Comments
 (0)