Notice
Recent Posts
Recent Comments
Link
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 |
Tags
- 안드로이드 #앱개발#계산기
- 부의감각
- Java & SpringBoot로 시작하는 웹 프로그래밍
- fifaonline
- 안드로이드
- 랜덤스쿼드
- 독서감상문
- 바이트디그리
- 안녕 디지몬
- 스쿼드 메이커
- 내일배움카드
- 안드로이드 그림판#그림메모장#낙서장
- 패스트캠퍼스
- Ai
- 랜덤
- 홈CCTV
- 강아지 #박스집 #복층
- 안드로이드#앱만들기#알바
- fifaonline4
- 강아지 스마트 펜스
- 혼술 술자리 인싸앱
- 피온4
- 박스#강아지집#만들기
- K디지털크레딧
- 자바 인강
- D-ID
- 불끌때
- 부르지마세요
- 아두이노#작품#사료급식기
- #FIFAONLINE4
Archives
- Today
- Total
LC Studio
백준 3190 뱀 (JAVA) 본문
풀이
조건
1. 뱀이 몸통에 닿으면 죽는다.
2. 뱀이 벽에 닿으면 죽는다.
3. 사과를 먹으면 길이가 늘어난다.
어려운 문제였다.
2차원 배열을 활용하여 풀다가 막혀서 다른 블로그를 참고하여 문제를 해결하였다.
https://loosie.tistory.com/269
[BOJ] 백준 3190번 뱀 (Java)
#3190 뱀 난이도 : 골드 5 유형 : 자료 구조/ Queue 3190번: 뱀 'Dummy' 라는 도스게임이 있다. 이 게임에는 뱀이 나와서 기어다니는데, 사과를 먹으면 뱀 길이가 늘어난다. 뱀이 이리저리 기어다니다가
loosie.tistory.com
Queue를 활용하여 해결하였다. 주석을 자세히 작성하였으니, 읽으면 이해가 될 것이다.
import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.OutputStreamWriter;
import java.util.HashMap;
import java.util.LinkedList;
import java.util.Map;
import java.util.Queue;
import java.util.StringTokenizer;
public class Solution{
static BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
static BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(System.out));
static StringTokenizer st = null;
//시간과 방향 입력받을 Map형식의 moveInfo 선언
static Map<Integer, String> moveInfo = new HashMap<>();
//뱀의 이동을 결정하는 배열
static int[] dx = {1, 0, -1, 0};
static int[] dy = {0, 1, 0, -1};
//사과의 위치를 담을 2차원배열 map
static int[][] map;
static int N;
public static void main(String[] args) throws IOException{
N = Integer.parseInt(br.readLine());
int K = Integer.parseInt(br.readLine());
map = new int[N][N];
//사과의 위치를 map에 저장
for(int i=0;i<K;i++){
st = new StringTokenizer(br.readLine());
int row = Integer.parseInt(st.nextToken())-1;
int column = Integer.parseInt(st.nextToken())-1;
map[row][column] = 1;
}
//시간과 방향을 moveInfo에 입력
int L = Integer.parseInt(br.readLine());
for(int i=0; i<L; i++){
st = new StringTokenizer(br.readLine());
int time = Integer.parseInt(st.nextToken());
String direction = st.nextToken();
moveInfo.put(time, direction);
}
System.out.println(moveInfo);
solve();
}
static void solve() throws IOException{
Queue<Integer> q = new LinkedList<>();
q.add(0);
int time = 0; // 총 시간
int px = 0; // 뱀의 x좌표(열)
int py = 0; // 뱀의 y좌표(행)
int d = 0; // 방향 지시 변수
while(true){
int nx = px + dx[d];
int ny = py + dy[d];
time++;
System.out.println("nx : "+nx);
System.out.println("ny : "+ny);
//벽에 부딪히는 경우
if(nx<0 || ny<0 || nx>N-1 || ny>N-1){
break;
}
//몸통에 부딪히는 경우
if(q.contains(ny*N + nx)){
break;
}
//뱀 이동 시작
if(map[ny][nx] == 1){
map[ny][nx] = 0;
q.add(ny*N + nx);
System.out.println(q.toString());
}
else{
q.add(ny*N + nx);
q.poll();
System.out.println(q.toString());
}
//방향 전환
if(moveInfo.containsKey(time)){
String data = moveInfo.get(time);
if(data.equals("D")){
d += 1;
if(d == 4){
d = 0;
}
}
else{
d -= 1;
if(d == -1){
d = 3;
}
}
}
px = nx;
py = ny;
}
br.close();
bw.write(time+"");
bw.flush();
bw.close();
}
}
전체 코드이다. (중간에 이해를 위해 System.out.println을 넣었다.)
첫번째 예제를 출력하면 다음과 같다.
6
3
3 4
2 5
5 3
3
3 D
15 L
17 D
nx : 1
ny : 0
[1]
nx : 2
ny : 0
[2]
nx : 3
ny : 0
[3]
nx : 3
ny : 1
[9]
ny : 2
[9, 15]
nx : 3
ny : 3
[15, 21]
nx : 3
ny : 4
[21, 27]
nx : 3
ny : 5
[27, 33]
nx : 3
ny : 6
9
반응형
'Java > 백준 알고리즘' 카테고리의 다른 글
백준 1406 에디터 (JAVA) (0) | 2022.04.28 |
---|---|
백준 1085 직사각형에서 탈출 (JAVA) (0) | 2022.03.23 |
백준 4948 베르트랑 공준 (JAVA) (0) | 2022.03.23 |
백준 1929 소수 구하기 (JAVA) (0) | 2022.03.22 |
백준 10757 큰 수 A+B (JAVA) (0) | 2022.03.21 |