developer-ellen
인간 디버거의 로그 찍기
developer-ellen
전체 방문자
오늘
어제
  • 분류 전체보기 (217)
    • 회고록 (0)
    • 취뽀 및 커리어 여정의 Stack (2)
      • SSAFY 7기 (2)
    • 프로그래밍공부 (24)
      • c++ (0)
      • JAVA (3)
      • Spring (5)
      • design pattern (3)
      • BackDB (1)
      • Servlet&JSP (3)
      • Vue (4)
      • JPA (4)
      • Infra (1)
      • Linux (0)
    • AI (3)
      • papers (3)
      • trend (0)
    • 프로젝트진행 (0)
      • 데이터베이스 (0)
      • 서버개발 (0)
      • 인공지능 (0)
      • 하루정리 (0)
    • 포트폴리오 (0)
    • 알고리즘 (158)
      • 알고리즘문풀 (155)
      • 알고리즘공부 (3)
    • 통계공부 (15)
      • 시계열분석 (15)
      • 회귀분석 (0)
    • CS (14)
      • 컴퓨터네트워크 (4)
      • 운영체제 (8)
      • 데이터베이스 (2)
    • 주저리주저리 (0)
      • 필사 (0)
    • 취업관련정보 (0)

블로그 메뉴

  • 홈
  • 태그
  • 방명록

공지사항

인기 글

태그

  • c++ 빌더 패턴
  • 카카오코테java풀이
  • c++디자인패턴
  • BOJ파이썬풀이
  • Arima
  • SW역량테스트파이썬
  • 통계분석
  • 카카오코테
  • MA모형
  • ARIMA모형
  • 삼성코테파이썬풀이
  • 삼성코테구현문제추천
  • 삼성코테파이썬
  • 삼성코테구현풀이
  • 삼성코테자바꿀팁
  • AR모형
  • 백준파이썬풀이
  • SW역량테스트파이썬풀이
  • 삼성코테파이썬준비
  • 데이터분석
  • 삼성코테자바풀이
  • 삼성코테준비
  • 시계열
  • 삼성코테자바준비
  • 통계학
  • 삼성코테기출자바풀이
  • 시계열분석
  • 운영체제인터럽트
  • 삼성코테기출
  • 코테파이썬

최근 댓글

최근 글

티스토리

hELLO · Designed By 정상우.
developer-ellen
알고리즘/알고리즘문풀

BOJ - 뱀 3190번 (JAVA)

알고리즘/알고리즘문풀

BOJ - 뱀 3190번 (JAVA)

2022. 4. 8. 15:17

❓ 문제 - 백준 뱀 3190번 - JAVA 풀이법

출처 

(https://www.acmicpc.net/problem/3190)

 

3190번: 뱀

 'Dummy' 라는 도스게임이 있다. 이 게임에는 뱀이 나와서 기어다니는데, 사과를 먹으면 뱀 길이가 늘어난다. 뱀이 이리저리 기어다니다가 벽 또는 자기자신의 몸과 부딪히면 게임이 끝난다. 게임

www.acmicpc.net

 

📝 문제해결법

1. 이 문제는 Queue + 구현 + 해시맵으로 풀었다.

  • map이라는 2차원 배열로 처음 입력받은 사과의 정보를 1로 넣는다.
  • 방향 전환에 대한 정보를 해쉬맵에 key값을 time, value L or D로 넣어 뱀을 움직이면서 현재 시간에 해당하는 key 값이 존재하면 해당 방향으로 방향전환 하도록 구현하였다.
  • 뱀에 대한 정보를 queue에 넣어서 관리한다. 뱀은 map에 2라는 값으로 저장해둔다.
  • 만약 뱀을 이동시켰을 때 종료되는 조건인지 확인한다. -> 벽에 닿았는지 ? 자기 자신과 닿았는지?
  • 만약 조건에 해당하지 않으면 이동가능 하므로 사과가 있는지 체크하고 만약 사과가 있으면 사과를 먹고, 만약 사과가 없으면 기존 꼬리 부분에 존재했던 뱀을 없애야 하므로 queue에서 pop하고 해당 map의 부분을 0으로 변경한다.
  • 그리고 현재 뱀의 머리가 가르키는 부분을 queue에 다시 넣어주고 해당 map의 부분을 2로 변경한다.
  • 현재 시간에 변경해야할 방향이 있으면 해쉬맵으로 체크한다. 
  • dx, dy를 동 -> 남 -> 서 -> 북으로 구성하면 L일 때는 방향을 왼쪽으로 한칸씩 밀고, R일 때는 방향을 오른쪽으로 한칸씩 밀면 해당 방향에 맞춰 90도 회전이 가능하다.

2. 느낀점

  • 예전에 파이썬으로 풀이하여 포스팅을 해서 다시 포스팅하기 머쓱하지만... 자바니깐 ^^..
  • 그래도 지난 번엔 해쉬맵을 사용하지 않아서 메모리가 125600 KB 사용했는데 -> 현재 해쉬맵 + 자바 구현으로 14796 KB로 확 줄었다.... 
  • 오늘도 성장했다 ^_^...

 

💻 소스코드

// BOJ - 뱀(3190번)
// 시뮬레이션 + 큐

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.HashMap;
import java.util.LinkedList;
import java.util.Queue;

public class Main_3190 {

	public static class Node {
		int x;
		int y;
		public Node(int x, int y) {
			this.x = x;
			this.y = y;
		}
	}
	
	public static int[] dx = {0, 1, 0, -1};
	public static int[] dy = {1, 0, -1, 0};
	
	public static void main(String[] args) throws IOException{
		BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
		HashMap<Integer, String> change = new HashMap<Integer, String>();
		int n = Integer.parseInt(br.readLine());
		int k = Integer.parseInt(br.readLine());
		int[][] map = new int[n+1][n+1];
		for(int i=0;i<k;i++) {
			String[] data = br.readLine().split(" ");
			int r = Integer.parseInt(data[0]);
			int c = Integer.parseInt(data[1]);
			map[r][c] = 1;
		}
		
		int l = Integer.parseInt(br.readLine());
		for(int i=0;i<l;i++) {
			String[] data = br.readLine().split(" ");
			change.put(Integer.parseInt(data[0]), data[1]);
		}
		
		int time = 0;
		int nx = 1;
		int ny = 1;
		int dir = 0;
		Queue<Node> snack = new LinkedList<>();
		snack.offer(new Node(nx, ny));
		map[1][1] = 2; // 뱀 표시
		
		while(true) {
			time++;
			nx += dx[dir];
			ny += dy[dir];
			if(nx < 1 || nx > n || ny < 1 || ny > n || map[nx][ny] == 2) {
				break;
			}
			// 사과 유무
			if(map[nx][ny] == 1) {
				map[nx][ny] = 0;
			} else {
				Node tail = snack.poll();
				map[tail.x][tail.y] = 0;
			}
			snack.add(new Node(nx, ny));
			map[nx][ny] = 2;
			
			if(change.containsKey(time)) {
				String change_dir = change.get(time);
				if(change_dir.equals("L")) {
					dir = (dir==0?3:dir-1);
				} else {
					dir = (dir==3?0:dir+1);
				}
			}
			
		}
		
		System.out.println(time);

	}

}

'알고리즘 > 알고리즘문풀' 카테고리의 다른 글

BOJ - 주사위 굴리기 14499번 (JAVA)  (0) 2022.04.11
BOJ - 시험 감독 13485번 (JAVA)  (0) 2022.04.08
BOJ - 연구소 14502번 (JAVA)  (0) 2022.04.08
BOJ - 2048(Easy) 12100번 (JAVA)  (0) 2022.04.08
SWEA - 보급로 1249번 (JAVA)  (0) 2022.04.07
  • ❓ 문제 - 백준 뱀 3190번 - JAVA 풀이법
  • 📝 문제해결법
  • 💻 소스코드
'알고리즘/알고리즘문풀' 카테고리의 다른 글
  • BOJ - 주사위 굴리기 14499번 (JAVA)
  • BOJ - 시험 감독 13485번 (JAVA)
  • BOJ - 연구소 14502번 (JAVA)
  • BOJ - 2048(Easy) 12100번 (JAVA)
developer-ellen
developer-ellen

티스토리툴바

단축키

내 블로그

내 블로그 - 관리자 홈 전환
Q
Q
새 글 쓰기
W
W

블로그 게시글

글 수정 (권한 있는 경우)
E
E
댓글 영역으로 이동
C
C

모든 영역

이 페이지의 URL 복사
S
S
맨 위로 이동
T
T
티스토리 홈 이동
H
H
단축키 안내
Shift + /
⇧ + /

* 단축키는 한글/영문 대소문자로 이용 가능하며, 티스토리 기본 도메인에서만 동작합니다.