챌린지/구름톤 챌린지

구름톤 챌린지 2주 차 학습 일기 (Day9 ~ 10)

imname1am 2023. 8. 27. 22:59
반응형

🧩 문제 9. 폭탄 구현하기 (2)

> 배운 점

 : 완전탐색 / 시뮬레이션 / 행렬

- 2차원 배열에서의 탐색

 

> 느낀 점

입력받은 폭탄이 떨어지는 위치를 큐에 추가해서 BFS로 쉽게 풀 수 있겠군 했는데

원래 좌표 값 갱신하는 부분에서 조금 헤매다가 시간을 생각보다 더 지체하게 되었다는 슬픈 이야기..🥺

 

> 헷갈렸던 점

탐색할 때 본인 원래 위치 좌표는 어떻게 값을 더하면서 갱신할까 고민했었는데

그냥 상하좌우를 선언하는 dx dy 배열에 본인 위치만 추가해주면 되는 것이었다,,

(int[] dx : {0,0,0,-1,1} / int[] dy : {0,1,-1,0,0})

 

 

 

 

🧩 문제 10. GameJam

https://goorm.notion.site/GameJam-Java-896c9778997a47a185fb16d40cb20c82

 

GameJam (Java)

필요한 개념

goorm.notion.site

> 배운 점

- 시뮬레이션

 

> 느낀 점

-  방향이 문자 형태로 주어진 경우, Map을 사용하는 것 (Map<String, int[]>)

 

> 헷갈렸던 점

- 이동 중 게임판 범위 밖으로 나갈 때, 값을 어떻게 조절할지 헷갈렸다. (좌표 위치 조정)

작성했었던 코드
 

 

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
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
import java.io.*;
import java.util.*;
 
class Main {    
    static int N;
    static int[] arr;
    static String[][] board;
    
    public static void main(String[] args) throws IOException {
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        StringTokenizer st;
        
        N = Integer.parseInt(br.readLine());
        board = new String[N][N];
        
        // 구름이 말 좌표
        st = new StringTokenizer(br.readLine(), " ");
        int gR = Integer.parseInt(st.nextToken()) - 1;
        int gC = Integer.parseInt(st.nextToken()) - 1;
        
        // 플레이어 말 좌표
        st = new StringTokenizer(br.readLine(), " ");
        int pR = Integer.parseInt(st.nextToken()) - 1;
        int pC = Integer.parseInt(st.nextToken()) - 1;
        
        // 게임판 입력받기
        for(int i = 0 ; i < N ; i++) {
            st = new StringTokenizer(br.readLine());
            for(int j = 0 ; j < N ; j++) {
                board[i][j] = st.nextToken();
            }
        }
        
        int goorm  = solve(gR, gC);
        int player = solve(pR, pC);
        
        if(goorm > player) {
            System.out.println("goorm " + goorm);
        }
        else {
            System.out.println("player " + player);
        }
    }
 
    // [상하좌우 방향에 대한 (x,y) 이동 값 저장]
    static HashMap<Stringint[]> directions = new HashMap<>() {
        {
          put("U"new int[] {-10});
          put("D"new int[] {10});
          put("L"new int[] {0-1});
          put("R"new int[] {01});
        }
    };
    
    // [인덱스 조정 메소드]
    static int setPos(int a, int N) {
        if(a == -1return N - 1;
        if(a == N)  return 0;
        return a;
    }
    
    // [점수 = 캐릭터가 방문한 칸 개수 구하는 메소드]
    private static int solve(int x, int y) {
        boolean[][] visited = new boolean[N][N];
        visited[x][y] = true;
        
        int score = 1;    // 점수, 1에서 시작
        boolean flag = true;
        
        while(flag) {
            String cmd = board[x][y];
            int dist = Integer.parseInt(cmd.substring(0, cmd.length() -1));    // 점수
            String dir = cmd.substring(cmd.length() -1);    // 방향
            
            for(int i = 0 ; i < dist ; i++) {
 
                // 방향 이동 후, 인덱스 조정
                x += directions.get(dir)[0];
                y += directions.get(dir)[1];
                
                x = setPos(x, N);
                y = setPos(y, N);
 
 
                if(!visited[x][y]) {
                    visited[x][y] = true;
                    score += 1;
                }
                else { // 캐릭터가 이미 방문한 칸인 경우, 게임 끝
                    flag = false;
                    break;
                }
            }
        }
 
        return score;
    }
}
cs
반응형