삐까냥의 파도타기
3190번) 뱀 본문
문제 출처 : https://www.acmicpc.net/problem/3190
문제에서 가장 어려웠던 부분(헷갈린 부분)
L : 왼쪽, D : 오른쪽으로 방향을 변경한다.
-> 현재 방향에서 왼쪽, 오른쪽으로 방향을 바꾼다는 의미
2018년 4월 6일 - 다듬지 않은 시험용 코딩(1시간 37분 소요) public class Q3190 { public static void main(String[] args) { Scanner sc = new Scanner(System.in); int mapSize = sc.nextInt(); int[][] map = new int[mapSize][mapSize];
int appleSize = sc.nextInt(); for (int i = 0; i < appleSize; i++) { map[sc.nextInt()-1][sc.nextInt()-1] = 1; }
HashMap<Integer, String> changeDirection = new HashMap<Integer, String>(); int directionSize = sc.nextInt(); for (int i = 0; i < directionSize; i++) { changeDirection.put(sc.nextInt(), sc.next()); }
LinkedList<yx> nowJirung = new LinkedList<yx>(); nowJirung.add(new yx(0,0)); map[0][0] = 3;
String nowDirection = "R"; int nowHeadX = 0, nowHeadY = 0, nowTime = 0;
while (true) { nowTime += 1; // System.out.print(nowDirection); if (nowDirection.equals("U")) { nowHeadY -= 1; } else if (nowDirection.equals("D")) { nowHeadY += 1; } else if (nowDirection.equals("L")) { nowHeadX -= 1; } else { nowHeadX += 1; }
// System.out.println(" " + nowHeadY + ", " + nowHeadX + " / " + nowJirung.size()); if (nowHeadY >= mapSize || nowHeadY < 0 || nowHeadX >= mapSize || nowHeadX < 0) { System.out.println(nowTime); return ; } else {
// if (map[nowHeadY][nowHeadX] != 1) { // yx temp = nowJirung.getLast(); // System.out.println(temp.getY() + ", " + temp.getX() + " 삭제한다."); // map[temp.getY()][temp.getX()] = 0; // nowJirung.removeLast(); // } // // if (map[nowHeadY][nowHeadX] == 3) { // System.out.println(nowTime); // return ; // } else { // nowJirung.addFirst(new yx(nowHeadY, nowHeadX)); // map[nowHeadY][nowHeadX] = 3; // }
if (map[nowHeadY][nowHeadX] == 3) { System.out.println(nowTime); return ; } else { if (map[nowHeadY][nowHeadX] != 1) { yx temp = nowJirung.getLast(); // System.out.println(temp.getY() + ", " + temp.getX() + " 삭제한다."); map[temp.getY()][temp.getX()] = 0; nowJirung.removeLast(); }
nowJirung.addFirst(new yx(nowHeadY, nowHeadX)); map[nowHeadY][nowHeadX] = 3; } }
// System.out.println(nowTime); // for (int j = 0; j < mapSize; j++) { // for (int k = 0; k < mapSize; k++) { // System.out.print(map[j][k] + " "); // } // System.out.println(); // }
if (changeDirection.containsKey(nowTime)) { String tempDirection = changeDirection.get(nowTime); if (nowDirection.equals("U")) { if (tempDirection.equals("L")) { nowDirection = "L"; } else { nowDirection = "R"; } } else if (nowDirection.equals("D")) { if (tempDirection.equals("L")) { nowDirection = "R"; } else { nowDirection = "L"; } } else if (nowDirection.equals("L")) { if (tempDirection.equals("L")) { nowDirection = "D"; } else { nowDirection = "U"; } } else { if (tempDirection.equals("L")) { nowDirection = "U"; } else { nowDirection = "D"; } } // System.out.println(nowDirection); } } } } class yx { private int y, x;
public yx (int y, int x) { this.y = y; this.x = x; }
public int getY() { return y; }
public int getX() { return x; } } |
2018년 4월 6일 - 다듬은 코드 public class Q3190 { public static void main(String[] args) { Scanner sc = new Scanner(System.in); int mapSize = sc.nextInt(); int[][] map = new int[mapSize][mapSize];
//사과 표시 int appleSize = sc.nextInt(); for (int i = 0; i < appleSize; i++) { map[sc.nextInt()-1][sc.nextInt()-1] = 1; }
//방향 전환 HashMap<Integer, String> changeDirections = new HashMap<Integer, String>(); int directionSize = sc.nextInt(); for (int i = 0; i < directionSize; i++) { changeDirections.put(sc.nextInt(), sc.next()); }
String[] directions = new String[]{"R", "D", "L", "U"}; //가독성을 위한 방향 표시 int nowDirection = 0, nowTime = 0; int headX = 0, headY = 0;
LinkedList<Position> snake = new LinkedList<Position>(); snake.add(new Position(0,0)); map[0][0] = 2; //시작 표시
while (true) { nowTime += 1;
switch (directions[nowDirection]) { case "R" : headX += 1; break;
case "D" : headY += 1; break;
case "L" : headX -= 1; break;
case "U" : headY -= 1; break;
default : break; }
//부딪힘. if (headY < 0 || mapSize <= headY || headX < 0 || mapSize <= headX || map[headY][headX] == 2) { System.out.println(nowTime); return; } //사과를 안먹었으면 꼬리 지우기 if (map[headY][headX] != 1) { Position tail = snake.pollLast(); map[tail.getY()][tail.getX()] = 0; }
//사과를 섭취에 상관 없이 머리 이동하기 snake.addFirst(new Position(headY, headX)); map[headY][headX] = 2;
//방향 바꾸기 if (changeDirections.containsKey(nowTime)) { String tempDirection = changeDirections.get(nowTime);
if (tempDirection.equals("D")) { nowDirection += 1; } else { nowDirection -= 1; }
if (nowDirection == 4) { nowDirection = 0; } else if (nowDirection == -1) { nowDirection = 3; } } } } } class Position { private int y, x;
public Position (int y, int x) { this.y = y; this.x = x; }
public int getY() { return y; }
public int getX() { return x; } } |
'코딩 > 삼성 SW 역량 테스트 기출' 카테고리의 다른 글
14891번) 톱니바퀴 (0) | 2018.04.07 |
---|---|
14888번) 연산자 끼워넣기 (0) | 2018.04.06 |
14503번) 로봇 청소기 (0) | 2018.04.06 |
14889번) 스타트와 링크 (0) | 2018.04.06 |
14890번) 경사로 (0) | 2018.04.06 |