챌린지/구름톤 챌린지
구름톤 챌린지 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<String, int[]> directions = new HashMap<>() {
{
put("U", new int[] {-1, 0});
put("D", new int[] {1, 0});
put("L", new int[] {0, -1});
put("R", new int[] {0, 1});
}
};
// [인덱스 조정 메소드]
static int setPos(int a, int N) {
if(a == -1) return 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 |
반응형