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)

블로그 메뉴

  • 홈
  • 태그
  • 방명록

공지사항

인기 글

태그

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

최근 댓글

최근 글

티스토리

hELLO · Designed By 정상우.
developer-ellen

인간 디버거의 로그 찍기

알고리즘/알고리즘문풀

BOJ - 새로운 게임2 17837번 (JAVA)

2022. 4. 29. 23:44

❓ 문제 - 백준 새로운 게임2 17837번 - JAVA 풀이법

 

출처 

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

 

17837번: 새로운 게임 2

재현이는 주변을 살펴보던 중 체스판과 말을 이용해서 새로운 게임을 만들기로 했다. 새로운 게임은 크기가 N×N인 체스판에서 진행되고, 사용하는 말의 개수는 K개이다. 말은 원판모양이고, 하

www.acmicpc.net

 

 

 

📝 문제해결법

1. 이 문제는 구현으로 풀었다.

  • HashMap을 활용해서 key에 말의 번호, value는 말에 대한 정보(위치 x, y, 방향)을 객체에 넣어 관리한다.
  • ArrayList<>인 2차원 배열로 체스판을 관리한다. 체스판 안에는 말의 번호를 넣어서 관리한다.
  • 각 턴에서 말번호 1번부터 이동을 처리한다. 말이 이동할 때 말 위에 같이 있는 말들도 이동을 하는 것을 주의해서 구현한다. 어떤 말 위에 1번말이 놓여져 있을 수도 있으므로 해당 map에서 각 말이 있는 위치 ~ 그 위에 쌓아진 말들을 up_horse라는 ArrayList에 넣어 관리한다.
  • 만약 말의 방향대로 움직임을 처리했는데 범위를 넘거나 파란영역이라면 방향을 변경한다. 그리고 이동한 곳이 또 격자판을 넘거나 파란 곳이라면 방향을 반대로 변경한 후 그 자리에 위치시키도록 한다.
  • 또한 이동한 곳이 빨간 영역이라면 up_horse를 끝부터 , 하얀 영역이라면 0번인덱스부터 차례대로 해당 영역에 넣어주고 hash맵에 저장된 말의 정보도 같이 갱신시켜준다.
  • 그리고 이동시킨 후 원래 말이 있던 x, y 위치에서 말 ~ 그 위에 쌓은 말의 정보를 제거한다.
  • 만약 이동하면서 말을 쌓다가 말이 4개이상이 쌓이면 턴은 종료시킨다.

 

💻 소스코드

// BOJ - 새로운 게임(17837번)
// 구현
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.StringTokenizer;

public class Main_17837 {
    public static int n, k;
    public static int[][] map;
    public static class Node {
        int x;
        int y;
        int dir;
        public Node(int x, int y, int dir){
            this.x = x;
            this.y = y;
            this.dir = dir;
        }
    }
    public static HashMap<Integer, Node> horse;
    public static ArrayList<Integer>[][] list;
    public static int[] dx = {0, 0, -1, 1};
    public static int[] dy = {1, -1, 0, 0};
    public static void main(String[] args) throws IOException {
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        StringTokenizer st = new StringTokenizer(br.readLine(), " ");
        n = Integer.parseInt(st.nextToken());
        k = Integer.parseInt(st.nextToken());
        list = new ArrayList[n][n];
        map = new int[n][n];
        for(int i=0;i<n;i++){
            st = new StringTokenizer(br.readLine(), " ");
            for(int j=0;j<n;j++){
                map[i][j] = Integer.parseInt(st.nextToken());
                list[i][j] = new ArrayList<>();
            }
        }
        horse = new HashMap<>();
        for(int i=0;i<k;i++){
            st = new StringTokenizer(br.readLine(), " ");
            int x = Integer.parseInt(st.nextToken());
            int y = Integer.parseInt(st.nextToken());
            int dir = Integer.parseInt(st.nextToken());
            horse.put(i+1, new Node(x-1, y-1, dir-1));
            list[x-1][y-1].add(i+1);
        }

        int ans = 0;
        outer:while (++ans <= 1000){

            for(int i=1;i<=k;i++){
                Node node = horse.get(i);
                ArrayList<Integer> up_horse = new ArrayList<>();
                int start_idx = 0;
                int x = node.x;
                int y = node.y;
                // 위에 있는 말 정보 얻기
                for(int p=0;p<list[node.x][node.y].size();p++){
                    if(list[node.x][node.y].get(p) == i){
                        start_idx = p;
                        break;
                    }
                }

                for(int p=start_idx;p < list[node.x][node.y].size();p++){
                    up_horse.add(list[node.x][node.y].get(p));
                }

                // 움직임..
                int nx = node.x + dx[node.dir];
                int ny = node.y + dy[node.dir];
          
                if(nx < 0 || nx >= n || ny < 0 || ny >= n || map[nx][ny] == 2){
                    nx -= dx[node.dir];
                    ny -= dy[node.dir];
                    // 방향 변경
                    int dir = (node.dir%2==0?node.dir+1: node.dir-1);
                    nx += dx[dir];
                    ny += dy[dir];
                    node.dir = dir;
                    if(nx < 0 || nx >= n || ny < 0 || ny >= n || map[nx][ny] == 2){
                        continue;
                    } else {
                        if(map[nx][ny] == 1) {
                            for (int p = up_horse.size() - 1; p >= 0; p--) {
                                list[nx][ny].add(up_horse.get(p));
                                Node hh = horse.get(up_horse.get(p));
                                horse.put(up_horse.get(p), new Node(nx, ny, hh.dir));
                            }
                        } else {
                            for(Integer h:up_horse) {
                                list[nx][ny].add(h);
                                Node hh = horse.get(h);
                                horse.put(h, new Node(nx, ny, hh.dir));
                            }
                        }

                    }
                } else if(map[nx][ny] == 1){
                    for(int p=up_horse.size()-1;p>=0;p--){
                        list[nx][ny].add(up_horse.get(p));
                        Node hh = horse.get(up_horse.get(p));
                        horse.put(up_horse.get(p), new Node(nx, ny, hh.dir));
                    }
                } else if(map[nx][ny] == 0){
                    for(Integer h:up_horse) {
                        list[nx][ny].add(h);
                        Node hh = horse.get(h);
                        horse.put(h, new Node(nx, ny, hh.dir));
                    }
                }

                if(list[nx][ny].size() >= 4){
            
                    break outer;
                }

                // 말 뺴기
                for(int p=list[x][y].size()-1;p>=start_idx;p--){
                    list[x][y].remove(p);
                }


            }

        }

        System.out.println(ans>1000?-1:ans);
    }
}

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

BOJ - 모노미노도미노2 20061번 (JAVA)  (0) 2022.04.30
BOJ - 원판 돌리기 17822번 (JAVA)  (0) 2022.04.30
BOJ - 연구소 3 17142번 (JAVA)  (0) 2022.04.29
BOJ - 이차원 배열과 연산 17140번 (JAVA)  (0) 2022.04.29
BOJ - 낚시왕 17143번 (JAVA)  (0) 2022.04.29
    '알고리즘/알고리즘문풀' 카테고리의 다른 글
    • BOJ - 모노미노도미노2 20061번 (JAVA)
    • BOJ - 원판 돌리기 17822번 (JAVA)
    • BOJ - 연구소 3 17142번 (JAVA)
    • BOJ - 이차원 배열과 연산 17140번 (JAVA)
    developer-ellen
    developer-ellen

    티스토리툴바