728x90
문제
https://www.acmicpc.net/problem/3190
어떻게 풀 것인가?
구현, 시뮬레이션 문제이다.
하지만 생각할 것이 많아서 어려운 문제였다.
- 시간을 재고,
- 뱀 이동하기
- 범위를 벗어나거나, 뱀 몸통 만날 때 종료
- 사과가 있을 때 없을 때 처리
- 방향을 바꿔주는 시간을 만날 때 방향 변경
- 현재값 업데이트
위와 같은 로직을 While문을 통해서 반복해야한다.
답안 코드를 본다면 너무나도 쉽지만, 생각을 코드로 옮긴다는 것은 어려운 일인 것 같다.
풀면서 놓쳤던점
없음. 단순 실력 부족
이 문제를 통해 얻어갈 것
구현 문제에 대한 연습
내 코드
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.StringTokenizer;
public class Main {
static int N;
static int[][] arr;
static List<int[]> snake = new ArrayList<>();
static HashMap<Integer, String> hash = new HashMap<>();
static int[] dx = {0, 1, 0, -1};
static int[] dy = {1, 0, -1, 0}; // 동 남 서 북
static int result = 0;
public static void main(String[] args) throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
StringTokenizer st;
N = Integer.parseInt(br.readLine());
arr = new int[N][N];
int K = Integer.parseInt(br.readLine());
for (int i = 0; i < K; i++) {
st = new StringTokenizer(br.readLine());
int x = Integer.parseInt(st.nextToken()) - 1;
int y = Integer.parseInt(st.nextToken()) - 1;
arr[x][y] = 1;
}
int order = Integer.parseInt(br.readLine());
for (int i = 0; i < order; i++) {
st = new StringTokenizer(br.readLine());
hash.put(Integer.parseInt(st.nextToken()), st.nextToken());
}
moving();
System.out.println(result);
}
private static void moving() {
int cx = 0, cy = 0;
int d = 0;
snake.add(new int[]{0, 0});
while (true) {
// 1. 시간재기
result++;
// 2. 뱀 이동하기
int nx = cx + dx[d];
int ny = cy + dy[d];
// 3. 범위를 벗어나거나, 뱀 몸통 만날 때 종료
if (isFinish(nx, ny))
break;
// 4. 사과가 있을 때 없을 때 처리
if (arr[nx][ny] == 1) {
arr[nx][ny] = 0;
snake.add(new int[]{nx, ny});
} else {
snake.add(new int[]{nx, ny});
snake.remove(0);
}
// 5. 방향을 바꿔주는 시간을 만날 때 방향 변경
if (hash.containsKey(result)) {
if (hash.get(result).equals("D")) {
d += 1;
if (d == 4)
d = 0;
} else {
d -= 1;
if (d == -1)
d = 3;
}
}
cx = nx;
cy = ny;
}
}
public static boolean isFinish(int nx, int ny) {
if (nx < 0 || ny < 0 || nx >= N || ny >= N) {
return true;
}
for (int[] t : snake) {
if (nx == t[0] && ny == t[1])
return true;
}
return false;
}
}
참고
https://velog.io/@kimmjieun/%EB%B0%B1%EC%A4%80-3190%EB%B2%88-%EB%B1%80-Java-%EC%9E%90%EB%B0%94
728x90
'BaekJoon' 카테고리의 다른 글
[Baekjoon] 18352번 특정 거리의 도시 찾기 (Java) 문제 풀이 [Sliver 2] (0) | 2024.03.31 |
---|---|
[Baekjoon] 15664번 N과 M (10) (Java) 문제 풀이 [Sliver 2] (0) | 2024.03.30 |
[BaekJoon] 13023번 ABCDE (Java) 문제 풀이 [Gold 5] (0) | 2024.03.02 |
[BaekJoon] 2589번 보물섬 (Java) 문제 풀이 [Gold 5] (0) | 2024.02.26 |
[BaekJoon] 2565번 전깃줄 (Java) 문제 풀이 [Gold 5] (0) | 2024.01.07 |