KoreanFoodie's Study

SW 역량테스트 - [백준] 로봇 청소기 문제 풀이/해답/코드 (C++ / JAVA) 본문

Data Structures, Algorithm/SW 역량테스트

SW 역량테스트 - [백준] 로봇 청소기 문제 풀이/해답/코드 (C++ / JAVA)

GoldGiver 2020. 9. 29. 11:36


SW 역량 테스트 준비를 위한 핵심 문제들을 다룹니다!

해답을 보기 전에 문제를 풀어보시거나, 설계를 하고 오시는 것을 추천드립니다. 

코드에 대한 설명은 주석을 참고해 주세요 :)

 


문제 링크 : www.acmicpc.net/problem/14503

해답 코드 : 

 

// c++

#include<iostream>
using namespace std;
#define MAX 51

int N, M;
int input[MAX][MAX];
int x, y;
int result;
int direction;

//북, 동, 남, 서
int dx[] = { -1, 0, 1, 0 };
int dy[] = { 0, 1, 0, -1 };

int main() {

	cin >> N >> M;
	cin >> x >> y >> direction;
	for (int i = 0; i < N; i++)
		for (int j = 0; j < M; j++)
			cin >> input[i][j];

	while (1) {

		// 현재위치 청소
		if (input[x][y] == 0) {
			input[x][y] = 2;
			result++;
		}

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

			// 왼쪽 방향으로 전환
			direction = (direction + 3) % 4;
			int newX = x + dx[direction];
			int newY = y + dy[direction];

			if (input[newX][newY] == 0) {
				x = newX;
				y = newY;
				nextStep = 1;
				break;
			}
		}

		if (nextStep == 1)
			continue;

		// 후진
		int newDirection = (direction + 2) % 4;
		x = x + dx[newDirection];
		y = y + dy[newDirection];

		if (input[x][y] == 1)
			break;
	}
	cout << result;
}

 

 

import java.io.*;
import java.util.Scanner;

public class Main {

    static int[][] map;
    static boolean[][] visit;
    static int N, M, area = 0;
    static int[] dX = {-1, 0, 1, 0};
    static int[] dY = {0, 1, 0, -1};

    static int rotate(int dir) {
        if (dir == 0) return 3;
        else if (dir == 1) return 0;
        else if (dir == 2) return 1;
        else return 2;
    }

    static boolean bound(int r, int c) {

        if (r < 0 || r > N || c < 0 || c > M) {
            return false;
        } else return true;
    }

    static int back(int dir) {
        if (dir == 0) return 2;
        else if (dir == 1) return 3;
        else if (dir == 2) return 0;
        else return 1;
    }


    static void clean(int r, int c, int dir) {

        if (!visit[r][c]) visit[r][c] = true;

        // search from left
        int r_l;
        int c_l;
        // 2.a
        for (int i = 0; i < 4; i++) {
            r_l = r+dX[rotate(dir)];
            c_l = c+dY[rotate(dir)];

            if (bound(r_l, c_l)) {
                if (map[r_l][c_l] == 0 && !visit[r_l][c_l]) {
                    // 2.a
                    clean(r_l, c_l, rotate(dir));
                    return;
                } else {
                    dir = rotate(dir);
                }
            }
        }

        // time to move backward
        r_l = r + dX[back(dir)];
        c_l = c + dY[back(dir)];

        if (bound(r_l, c_l)) {
            if (map[r_l][c_l] == 0) {
                clean(r_l, c_l, dir);
            } else {
                return;
            }
        }

    }

    public static void main(String args[]) {

        Scanner sc = new Scanner(System.in);

        N = sc.nextInt();
        M = sc.nextInt();

        map = new int[N][M];
        visit = new boolean[N][M];

        int r, c, dir;

        r = sc.nextInt();
        c = sc.nextInt();
        dir = sc.nextInt();

        for (int i = 0; i < N; i++) {
            for (int j = 0; j < M; j++) {
                map[i][j] = sc.nextInt();
            }
        }

        clean(r, c, dir);

        for (int i = 0; i < N; i++) {
            for (int j = 0; j < M; j++) {
                if (visit[i][j]) area++;
            }
        }

        System.out.println(area);

    }

}

 

SW 역량테스트 준비 - [모의 SW 역량테스트] 풀이 / 코드 / 답안 (C++ / JAVA)

SW 역량테스트 준비 - C++ 코드, Java 코드

SW 역량테스트 준비 - 백준 알고리즘 문제

Comments