삐까냥의 파도타기

3190번) 뱀 본문

코딩/삼성 SW 역량 테스트 기출

3190번) 뱀

금손형아 2018. 4. 6. 11:50

문제 출처 : 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