⏰문제
https://www.acmicpc.net/problem/23796
💡풀이
1. 정답용으로 빈칸인 answer_map 생성, 방향에 따라 switch로 분리
- 배열은 long[][]을 사용하기
2. for문을 돌면서 한 줄씩 탐색해서 0이 아닌 데이터를 Queue에 집어넣는다.
3. Queue에 있는 내용을 tmp = q.poll()하고 다음 숫자를 next = q.peek()으로 뽑아내면서,
숫자가 똑같으면 answer_map에 2배를 해서 집어넣고, next를 Queue에서 뽑아야 하므로 poll로 뽑아낸다.
다르면 tmp만 집어넣는다.
4. 마지막에는 peek()을 할 수 없어서 null처리를 해주었다.
⌨️ 코드
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.LinkedList;
import java.util.Queue;
import java.util.StringTokenizer;
public class Main {
static int N;
static long[][] map;
static long[][] answer_map;
public static void main(String[] args) throws IOException{
//1. input
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
N = 8;
map = new long[N][N];
answer_map = new long[N][N]; //답
StringTokenizer st;
for(int i=0; i < N; i++){
st = new StringTokenizer(br.readLine());
for(int j=0; j < N; j++){
map[i][j] = Long.parseLong(st.nextToken());
}
}
String dir = br.readLine(); //방향키
//2. solve
solve(dir);
//3. print
StringBuilder sb = new StringBuilder();
for(int i=0; i < N; i++){
for(int j=0; j < N; j++){
sb.append(answer_map[i][j]).append(" ");
}
sb.append("\n");
}
System.out.println(sb);
}
static public void solve(String dir){
Queue<Long> q;
switch (dir){
case "U" :
for(int c=0; c < N; c++){
q = new LinkedList<>();
for(int r = 0; r < N; r++){
if(map[r][c] != 0){
q.add(map[r][c]);
}
}
//한 줄 끝
fillRow(q, c, 0);
}
break;
case "D" :
for(int c=0; c < N; c++){
q = new LinkedList<>();
for(int r = N-1; r >= 0; r--){
if(map[r][c] != 0){
q.add(map[r][c]);
}
}
//한 줄 끝
fillRow(q,c,N-1);
}
break;
case "L" :
for(int r=0; r < N; r++){
q = new LinkedList<>();
for(int c = 0; c < N; c++){
if(map[r][c] != 0){
q.add(map[r][c]);
}
}
//한 줄 끝
fillCol(q, r,0);
}
break;
case "R" :
for(int r=0; r < N; r++){
q = new LinkedList<>();
for(int c = N-1; c >= 0; c--){
if(map[r][c] != 0){
q.add(map[r][c]);
}
}
//한 줄 끝
fillCol(q, r,N-1);
}
break;
}
}
static public void fillRow(Queue<Long> q, int c, int start){
int idx = start;
while(!q.isEmpty()){
long tmp = q.poll();
if(q.peek() == null){
answer_map[idx][c] = tmp;
q.poll();
}
else{
long next = q.peek();
if(tmp == next){//같으면
answer_map[start == 0 ? idx++ : idx--][c] = tmp * 2;
q.poll();
}
else{//다르면
answer_map[start == 0 ? idx++ : idx--][c] = tmp;
}
}
}
}
static public void fillCol(Queue<Long> q, int r, int start){
int idx = start;
while(!q.isEmpty()){
long tmp = q.poll();
if(q.peek() == null){
answer_map[r][idx] = tmp;
q.poll();
}
else{
long next = q.peek();
if(tmp == next){//같으면
answer_map[r][start == 0 ? idx++ : idx--] = tmp*2;
q.poll();
}
else{//다르면
answer_map[r][start == 0 ? idx++ : idx--] = tmp;
}
}
}
}
}
📣 comment
- 구현 풀었는데 어떻게 푸는 건지 방법을 생각해내는 것은 어렵지 않았다. 그런데 방향키가 4개가 되었고, 해당 분기점마다 조건을 수정했어야 했는데 그 부분에서 수정이 필요했다.
- 배열을 int[][]가 아닌 long으로 해야 한다.
- 처음 만들었던 조건문이 여러 예제에도 통과하는 코드가 아니어서 하나의 조건문을 수정할 때마다 switch문의 내용을 수정해야 해서 불편했다. 그래서 함수로 빼내고 싶었는데 오히려 더 복잡해질 것 같아서 일단 그대로 냅두고 풀고 나중에 함수로 변환하였다. 더 함수로 코드를 줄이고 싶은데....
- Queue를 이용해서 풀긴했는데 단순히 map을 비교하면서 풀어도 될 것 같기도 하다. 다른 좋은 방법이 있지 않을까
'⚙️알고리즘' 카테고리의 다른 글
프로그래머스) 가장 많이 받은 선물 (0) | 2024.08.15 |
---|---|
백준 2206 ) 벽 부수고 이동하기 (2) | 2024.07.07 |
백준) 2578 : 빙고 (0) | 2024.02.16 |
백준) 1316 : 그룹 단어 체커 (0) | 2024.02.16 |
백준) 2630 : 색종이 만들기 (0) | 2024.02.14 |