삐까냥의 파도타기

14503번) 로봇 청소기 본문

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

14503번) 로봇 청소기

금손형아 2018. 4. 6. 19:33

문제 출처 : https://www.acmicpc.net/problem/14503


굉장히 쉬울것이라 생각했는데, 시간 좀 걸렸습니다.

어려운 부분 : 명시된 로봇청소기 알고리즘 제대로 이해하기.

 2018년 4월 6일 - 다듬지 않은 시험 코드 (소요시간 : 1시간 32분)


package samsung;


import java.util.Scanner;


public class Q14503 {


public static void main(String[] args) {

Scanner sc = new Scanner(System.in);

int ySize = sc.nextInt();

int xSize = sc.nextInt();

int[][] map = new int[ySize][xSize];

int nowY = sc.nextInt();

int nowX = sc.nextInt();

int nowDirection = sc.nextInt();

for (int i = 0; i < ySize; i++) {

for (int j = 0; j < xSize; j++) {

map[i][j] = sc.nextInt();

}

}

//청소 안한 빈 칸은 0, 벽은 1로, 청소한 칸은 2.

//   0

// 3   1

//   2

int count = 0;

int result = 0;

while(true) {

// System.out.println();

// for (int i = 0; i < ySize; i++) {

// for (int j = 0; j < xSize; j++) {

// int temp = map[i][j];

// if (temp == 1) {

// System.out.print("# ");

// } else if (temp == 2) {

// System.out.print("■ ");

// } else {

// System.out.print("□ ");

// }

// }

// System.out.println();

// }

// System.out.print("\n" + count);

count += 1;

//현재 위치 청소

if (map[nowY][nowX] == 0) {

map[nowY][nowX] = 2;

result += 1;

// System.out.print("  청소");

}


//방향 전환

int tempNowDirection = getRotation(nowDirection);

//

int tempY = nowY, tempX = nowX;

switch (tempNowDirection) {

case 0 :

tempY -= 1;

break;

case 1 :

tempX += 1;

break;

case 2 :

tempY += 1;

break;

case 3 :

tempX -= 1;

break;

}

if (map[tempY][tempX] == 0) { //한칸 전진

// System.out.print("  전진");

nowY = tempY;

nowX = tempX;

nowDirection = tempNowDirection;

continue;

}

//청소할 공간 있으면 회전만 한다.

if (map[nowY-1][nowX] == 0 || map[nowY+1][nowX] == 0 || map[nowY][nowX-1] == 0 || map[nowY][nowX+1] == 0) {

// System.out.print("  회전  ");

nowDirection = tempNowDirection;

continue;

}

tempY = nowY;

tempX = nowX;

switch (nowDirection) {

case 0 :

tempY += 1;

break;

case 1 :

tempX -= 1;

break;

case 2 :

tempY -= 1;

break;

case 3 :

tempX += 1;

break;

}

if (map[tempY][tempX] == 1) {

// System.out.print("  종료  ");

System.out.print(result);

//

//

// System.out.println();

// for (int i = 0; i < ySize; i++) {

// for (int j = 0; j < xSize; j++) {

// int temp = map[i][j];

// if (temp == 1) {

// System.out.print("# ");

// } else if (temp == 2) {

// System.out.print("■ ");

// } else {

// System.out.print("□ ");

// }

// }

// System.out.println();

// }

return;

} else {

nowY = tempY;

nowX = tempX;

// System.out.print("  후진");

}

}

}


static int getRotation(int nowDirection) {

nowDirection -= 1;

if (nowDirection == -1) {

nowDirection = 3;

}

return nowDirection;

}

}


2018년 4월 6일 - 필요 없는거 지운 코드 (다듬기 귀찮아여)


import java.util.Scanner;


public class Q14503 {


public static void main(String[] args) {

Scanner sc = new Scanner(System.in);

int ySize = sc.nextInt();

int xSize = sc.nextInt();

int[][] map = new int[ySize][xSize];

int nowY = sc.nextInt();

int nowX = sc.nextInt();

int nowDirection = sc.nextInt();

for (int i = 0; i < ySize; i++) {

for (int j = 0; j < xSize; j++) {

map[i][j] = sc.nextInt();

}

}

//청소 안한 빈 칸은 0, 벽은 1로, 청소한 칸은 2.

int result = 0;

while(true) {

//현재 위치 청소

if (map[nowY][nowX] == 0) {

map[nowY][nowX] = 2;

result += 1;

}


//방향 전환

int tempNowDirection = getRotation(nowDirection);

//왼쪽 칸 계산

int tempY = nowY, tempX = nowX;

switch (tempNowDirection) {

case 0 :

tempY -= 1;

break;

case 1 :

tempX += 1;

break;

case 2 :

tempY += 1;

break;

case 3 :

tempX -= 1;

break;

}

//왼쪽칸을 청소할 수 있으면 왼쪽칸으로 전진

if (map[tempY][tempX] == 0) {

nowY = tempY;

nowX = tempX;

nowDirection = tempNowDirection;

continue;

}

//상, 하, 좌, 우  총 4개의 칸 중 청소할 칸이 있으면 회전한다.

if (map[nowY-1][nowX] == 0 || map[nowY+1][nowX] == 0 || map[nowY][nowX-1] == 0 || map[nowY][nowX+1] == 0) {

nowDirection = tempNowDirection;

continue;

}

//후진 칸 계산

tempY = nowY;

tempX = nowX;

switch (nowDirection) {

case 0 :

tempY += 1;

break;

case 1 :

tempX -= 1;

break;

case 2 :

tempY -= 1;

break;

case 3 :

tempX += 1;

break;

}

//후진할 곳이 없으면 종료

if (map[tempY][tempX] == 1) {

System.out.print(result);

return;

}


nowY = tempY;

nowX = tempX;

}

}


static int getRotation(int nowDirection) {

nowDirection -= 1;

if (nowDirection == -1) {

nowDirection = 3;

}

return nowDirection;

}

static void showMap(int[][] map) {

for (int i = 0; i < map.length; i++) {

for (int j = 0; j < map[0].length; j++) {

int temp = map[i][j];

if (temp == 1) {

System.out.print("# ");

} else if (temp == 2) {

System.out.print("■ ");

} else {

System.out.print("□ ");

}

}

System.out.println();

}

}

}

 



로봇청소기를 보유하고 있어서 그런지,


꽤 재밌네요.


18년 4월 12일 - 다듬지 않은 코드 (소요시간 42분)


import java.util.Scanner;


public class Q14503 {


static int ySize, xSize, count = 0;

static int[][] map;

static boolean[][] isCleanedMap;

public static void main(String[] args) {

Scanner sc = new Scanner(System.in);

ySize = sc.nextInt();

xSize = sc.nextInt();

int nowY = sc.nextInt();

int nowX = sc.nextInt();

int nowDirection = sc.nextInt();

isCleanedMap = new boolean[ySize][xSize];

map = new int[ySize][xSize];

for (int i = 0; i < ySize; i++) {

for (int j = 0; j < xSize; j++) {

int tempValue = sc.nextInt();

if (tempValue == 1) {

isCleanedMap[i][j] = true;

map[i][j] = 1;

}

}

}

startRobot(nowY, nowX, nowDirection);

System.out.println(count);

}

static void startRobot(int y, int x, int direction) {

// showMap(y, x, direction);

if (!isCleanedMap[y][x]) {

isCleanedMap[y][x] = true;

count += 1;

}

//TODO 현재 사방이 막혔는지 확인

boolean isBack = getIsBack(y, x);

if (isBack) {

// System.out.println("사방이 막혔다");

int backPosition[] = getBackPosition(y, x, direction);

if (map[backPosition[0]][backPosition[1]] == 1) {

return;

}

startRobot(backPosition[0], backPosition[1], direction);

return;

}

direction = getNextDirection(direction);

int[] nextPosition = getNextPosition(y, x, direction);

if (0 <= nextPosition[0] && nextPosition[0] < ySize && 0 <= nextPosition[1] && nextPosition[1] < xSize && !isCleanedMap[nextPosition[0]][nextPosition[1]]) {

startRobot(nextPosition[0], nextPosition[1], direction);

return;

}

startRobot(y, x, direction);

}

static boolean getIsBack(int y, int x) {

int[] moveY = {-1, 0, 1, 0};

int[] moveX = {0, 1, 0, -1};

for (int i = 0; i < 4; i++) {

int tempY = y+moveY[i], tempX = x+moveX[i];

if (0 <= tempY && tempY < ySize && 0 <= tempX && tempX < xSize && !isCleanedMap[tempY][tempX]) {

return false;

}

}

return true;

}

static int getNextDirection(int nowDirection) {

nowDirection -= 1;

if (nowDirection == -1) {

nowDirection = 3;

}

return nowDirection;

}

static int[] getNextPosition(int y, int x, int direction) {

int tempY = y, tempX = x;

switch(direction) {

case 0 :

tempY -= 1;

break;

case 1 :

tempX += 1;

break;

case 2 :

tempY += 1;

break;

case 3 :

tempX -= 1;

break;

}

return new int[]{tempY, tempX};

}

static int[] getBackPosition(int y, int x, int direction) {

int tempY = y, tempX = x;

switch(direction) {

case 0 :

tempY += 1;

break;

case 1 :

tempX -= 1;

break;

case 2 :

tempY -= 1;

break;

case 3 :

tempX += 1;

break;

}

return new int[]{tempY, tempX};

}

static void showMap(int y, int x, int direction) {

for (int i = 0; i < ySize; i++) {

for (int j = 0; j < xSize; j++) {

if (i == y && j == x) {

switch (direction) {

case 0 :

System.out.print("^ ");

break;

case 1 :

System.out.print("> ");

break;

case 2 :

System.out.print("v ");

break;

case 3 :

System.out.print("< ");

break;

}

} else if (map[i][j] == 1) {

System.out.print("1 ");

} else if (isCleanedMap[i][j]) {

System.out.print("□ ");

} else {

System.out.print("■ ");

}

}

System.out.println();

}

System.out.println();

}


}

 


'코딩 > 삼성 SW 역량 테스트 기출' 카테고리의 다른 글

14891번) 톱니바퀴  (0) 2018.04.07
14888번) 연산자 끼워넣기  (0) 2018.04.06
14889번) 스타트와 링크  (0) 2018.04.06
14890번) 경사로  (0) 2018.04.06
3190번) 뱀  (0) 2018.04.06