백준_14503번_로봇청소기

임정민·2023년 4월 28일
1

알고리즘 문제풀이

목록 보기
39/173
post-thumbnail

코딩테스트 연습 스터디 진행중 입니다. ✍✍✍
Notion : https://www.notion.so/1c911ca6572e4513bd8ed091aa508d67

문제

https://www.acmicpc.net/problem/14503

[나의 풀이]

import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.OutputStreamWriter;
import java.util.StringTokenizer;

public class Main {

    static int clean(int r,int c,int dir,int [][]map){
        int ans = 0 ;

        // 방향 
        // 0  1  2  3
        // 북 동 남 서

        int [] dx = new int []{-1,0,1,0};
        int [] dy = new int []{0,1,0,-1};

        int x = -1;
        int y = -1;

        while(true){

            // 현재 위치 청소
            // 청소 완료이면 2
            if (map[r][c] == 0){
                map[r][c] = 2;
                ans+=1;
            }

             // 주변 4칸 청소 완료 
            boolean around_4 = true;

            for (int i =3; i>=0;i--){
                x = r+dx[i];
                y = c+dy[i];

                if (map[x][y]==1){
                    continue;
                }

                if (map[x][y] == 0){
                    around_4 = false;
                    break;
                }
            }

            if (around_4 == true){
                
                r += dx[(dir+2)%4];
                c += dy[(dir+2)%4];
                
                // 후진하려는 위치가 벽이면, return
                if (map[r][c] == 1){
                    return ans;
                }
            }
            else{
                dir = (dir+3)%4;
                x = r + dx[dir];
                y = c + dy[dir];
                if (map[x][y]==0){
                    r = x;
                    c = y;
                }

            }
        }

    }

    public static void main(String[] args) throws IOException {
        
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(System.out));
        StringTokenizer st;


        st = new StringTokenizer(br.readLine());

        int n = Integer.parseInt(st.nextToken());
        int m = Integer.parseInt(st.nextToken());

        int [][] map = new int [n][m];

        st = new StringTokenizer(br.readLine());

        int r = Integer.parseInt(st.nextToken());
        int c = Integer.parseInt(st.nextToken());
        int dir = Integer.parseInt(st.nextToken());

        for (int i = 0; i < n; i++){
            st = new StringTokenizer(br.readLine());
            for (int j = 0; j < m; j++){
                map[i][j] = Integer.parseInt(st.nextToken());
            }
        }

        int ans = clean(r,c,dir,map);

        // bw는 문자열로 변환해서 출력
        bw.write(ans+"");
        bw.flush();
        bw.close();
    }
}

[팀원의 풀이1]

  • 재귀함수
# coding = utf-8

import sys
input = sys.stdin.readline

n, m = map(int, input().split())
r, c, d = map(int, input().split())
board = list(list(map(int, input().split())) for _ in range(n))

dx = [-1, 0, 1, 0]
dy = [0, 1, 0, -1]

def sol(r, c, d):
    res = 0
    nx, ny = r, c
    while True:
        # 1 step
        print()
        for row in board:
            print(row)
        if board[nx][ny] == 0:
            board[nx][ny] = 2
            res += 1
        # 3 step
        flag = 0
        for _ in range(4):
            d -= 1
            d %= 4
            nx, ny = nx+dx[d], ny+dy[d]
            if board[nx][ny] == 0:
                break
            else:
                nx, ny = nx-dx[d], ny-dy[d]
                flag += 1
        if flag < 4:
            continue
        # 2 step
        if flag == 4:
            nx, ny = nx-dx[d], ny-dy[d]
            if board[nx][ny] == 1:
                return res

print(sol(r, c, d))

[팀원의 풀이2]

  • while문
# coding = utf-8

import sys
input = sys.stdin.readline

n, m = map(int, input().split())
r, c, d = map(int, input().split())
board = list(list(map(int, input().split())) for _ in range(n))

dx = [-1, 0, 1, 0]
dy = [0, 1, 0, -1]

def sol(r, c, d):
    res = 0
    nx, ny = r, c
    while True:
        # 1 step
        if board[nx][ny] == 0:
            board[nx][ny] = 2
            res += 1
        # 3 step
        flag = 0
        for _ in range(4):
            d -= 1
            d %= 4
            nx, ny = nx+dx[d], ny+dy[d]
            if board[nx][ny] == 0:
                break
            else:
                nx, ny = nx-dx[d], ny-dy[d]
                flag += 1
        if flag < 4:
            continue
        # 2 step
        if flag == 4:
            nx, ny = nx-dx[d], ny-dy[d]
            if board[nx][ny] == 1:
                return res

print(sol(r, c, d))

구현, 시뮬레이션 문제입니다.
문제 정의를 잘못해서 오랫동안 풀었습니다...😢😢😢

위와 같은 예제가 주어지는데 문제를 대강 읽어 0이 청소가 완료된 좌표, 1이 청소해야하는 좌표인줄 알았습니다... (정확히는 0이 청소해야하는 좌표, 1은 로봇이 위치할 수 없는 벽)

문제 풀이 자체는 어렵지 않았습니다만 문제 정의부터 꼼꼼히 하는 습관을 다져야겠습니다...💪💪💪

답이 하도 안나와서 3시간 넘게 붙잡고 있었네요... 💀💀💀 그래도 포기하지 않고 붙잡고 있어 풀어낼 수 있던 것 같습니다.

감사합니다🐹🐹🐹

profile
https://github.com/min731

0개의 댓글