728x90
반응형
2024.06.12기준 - 실버2
백준, BEAKJOON, BOJ, JAVA, 자바
풀이
이 문제는 테트리스 처럼 블럭이 내려올때 x좌표에 최대 y좌표를 출력하는 문제입니다.
- 1번으로 들어올때는 1 x 4(가로) 블럭이 떨어집니다.
- 2번으로 들어올때는 4 x 1(세로) 블럭이 떨어집니다.
- 3번이 들어올때는 해당하는 i좌표에 최대 높이를 출력합니다.
저의 접근은 처음에는 boolean[][] 변수를 생성해 좌표를 계산할려고 했지만, 문제 조건중 음수도 포함이 되어 있어 x좌표를 담고 있는 map을 생성해 문제에 접근을 해야겠다고 생각했습니다.
1. x좌표를 키로 가지고, y좌표를 값으로 가지는 map을 생성했습니다.
static Map<Integer, Integer> map = new LinkedHashMap<>(); // x좌표를 키 y좌표를 값으로 설정
2. 입력을 받을 때 1, 2, 3 에 따라 처리하는 코드를 작성했습니다.
1 x 4 블럭이 들어왔을때,
i좌표, (i + 1)좌표, (i + 2)좌표, (i + 3)좌표를 전부 체크해 최대 높이의 값을 찾아내는 함수를 생성합니다.
// 1 x 4 블럭이 왔을 때 쌓아지는 최댓값을 구하는 함수.
private static int xcheck(int x) {
int result = 1;
for (int i = 0; i < 4; i++) {
int now = x + dxy[i];
if (map.containsKey(now)) {
result = Math.max(result, map.get(now) + 1);
}
}
return result;
}
이를 통해 최대 높이를 찾아 i좌표, (i + 1)좌표, (i + 2)좌표, (i + 3)좌표에 (최대 높이 + 1) 값을 넣어줍니다.
4 x 1블럭이 들어왔을 때,
해당하는 i좌표에 이미 블럭이 있다면 (현재 높이 + 4)의 값을 없다면 그냥 4의 값을 넣어주었습니다.
그렇게 최대 높이를 가지는 map에 3이 들어오면 해당하는 값을 출력하고 없다면 0을 출력하는 코드를 작성했습니다.
코드
package Main;
import java.io.*;
import java.util.*;
public class Main {
static int[] dxy = {0, 1, 2, 3};
static Map<Integer, Integer> map = new LinkedHashMap<>(); // x좌표를 키 y좌표를 값으로 설정
public static void main(String[] args) throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(System.out));
StringBuilder sb = new StringBuilder();
int q = Integer.parseInt(br.readLine()); // 쿼리의 개수
int number, x;
StringTokenizer st;
while (q-- > 0) {
st = new StringTokenizer(br.readLine());
number = Integer.parseInt(st.nextToken());
x = Integer.parseInt(st.nextToken());
switch (number) {
case 1: // 1 x 4 블럭이 들어왔을 때
int y = xcheck(x); // 이미 쌓아진 블럭이 있는지 체크
xinput(x, y);
break;
case 2: // 4 x 1 블럭이 들어왔을때
if (map.containsKey(x)) { // 이미 쌓아진 블럭이 있다면
map.put(x, map.get(x) + 4);
} else { // 쌓아진 블럭이 없다면
map.put(x, 4);
}
break;
case 3: // x좌표에서 가장 높은 y좌표를 출력
if (map.containsKey(x)) { // 존재한다면
sb.append(map.get(x)).append("\n");
} else { // 존재하지 않는다면
sb.append(0).append("\n");
}
break;
}
}
bw.write(sb.toString());
bw.flush();
bw.close();
br.close();
}
// 1 x 4 블럭이 왔을 때 쌓아지는 최댓값을 구하는 함수.
private static int xcheck(int x) {
int result = 1;
for (int i = 0; i < 4; i++) {
int now = x + dxy[i];
if (map.containsKey(now)) {
result = Math.max(result, map.get(now) + 1);
}
}
return result;
}
// 1 x 4 블럭이 쌓이는 최대 높이를 저장하기 위한 함수.
private static void xinput(int x, int y) {
for (int i = 0; i < 4; i++) {
map.put(x + dxy[i], y);
}
}
}
728x90
반응형
'코딩테스트 일기 (BAEKJOON)' 카테고리의 다른 글
BAEKJOON / 백준 - JAVA 31924번 현대모비스 특별상의 주인공은? 2 (0) | 2024.06.16 |
---|---|
BAEKJOON / 백준 - JAVA 31883번 FA수의 진 (2) | 2024.06.14 |
BAEKJOON / 백준 - JAVA 31882번 근수 (2) | 2024.06.10 |
BAEKJOON / 백준 - JAVA 31881번 K512에 바이러스 퍼뜨리기 (0) | 2024.06.09 |
BAEKJOON / 백준 - JAVA 31926번 밤양갱 (0) | 2024.06.04 |