ABOUT ME

Today
Yesterday
Total
  • 14503 로봇 청소기
    코테 대비 python/백준 2023. 4. 11. 00:48

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

     

    14503번: 로봇 청소기

    첫째 줄에 방의 크기 $N$과 $M$이 입력된다. $(3 \le N, M \le 50)$  둘째 줄에 처음에 로봇 청소기가 있는 칸의 좌표 $(r, c)$와 처음에 로봇 청소기가 바라보는 방향 $d$가 입력된다. $d$가 $0$인 경우 북쪽

    www.acmicpc.net

    n,m = map(int,input().split())
    r,c,d = map(int,input().split())
    graph = [list(map(int,input().split())) for _ in range(n)]
    visited = [[0]*m for _ in range(n)]
    #처음 빈칸은 전부 청소되지 않은 상태이다.
    #순서대로 구현하자!!
    #청소하는칸 카운트
    cnt=0
    
    #방향 조건에 맞게 상우하좌 1씩 빼면 반시계 90도 0일때는 3으로
    dx=[-1,0,1,0]
    dy=[0,1,0,-1]
    while 1:
        flag = 0
        if visited[r][c]==0:
            visited[r][c]=1
            cnt+=1
        #현재 칸의 주변 4칸 중 청소되지 않은 빈 칸이 없는 경우
        for i in range(4):
            nx=r+dx[i]
            ny=c+dy[i]
            #범위 안에 있으며, 방문하지 않았고, 벽이 아니라 빈칸이면
            if 0<=nx<n and 0<=ny<m and visited[nx][ny]==0 and graph[nx][ny]==0:
                #청소안한 빈칸 있는거
                flag=1
        #빈칸없어 뒤로 후진해야됨
        if flag==0:
            if d==0:
                nx = r + dx[2]
                ny = c + dy[2]
                if 0 <= nx < n and 0 <= ny < m and visited[nx][ny] == 0 and graph[nx][ny] == 0:
                    cnt+=1
                    visited[nx][ny] = 1
                    r,c=nx,ny
                elif 0 <= nx < n and 0 <= ny < m and visited[nx][ny] == 1 and graph[nx][ny] == 0:
                    r, c = nx, ny
                elif 0 <= nx < n and 0 <= ny < m and graph[nx][ny] == 1:
                    print(cnt)
                    break
            elif d==1:
                nx = r + dx[3]
                ny = c + dy[3]
                if 0 <= nx < n and 0 <= ny < m and visited[nx][ny] == 0 and graph[nx][ny] == 0:
                    cnt+=1
                    visited[nx][ny] = 1
                    r, c = nx, ny
                elif 0 <= nx < n and 0 <= ny < m and visited[nx][ny] == 1 and graph[nx][ny] == 0:
                    r, c = nx, ny
                elif 0 <= nx < n and 0 <= ny < m and graph[nx][ny] == 1:
                    print(cnt)
                    break
            elif d==2:
                nx = r + dx[0]
                ny = c + dy[0]
                if 0 <= nx < n and 0 <= ny < m and visited[nx][ny] == 0 and graph[nx][ny] == 0:
                    cnt+=1
                    visited[nx][ny] = 1
                    r, c = nx, ny
                elif 0 <= nx < n and 0 <= ny < m and visited[nx][ny] == 1 and graph[nx][ny] == 0:
                    r, c = nx, ny
                elif 0 <= nx < n and 0 <= ny < m and graph[nx][ny] == 1:
                    print(cnt)
                    break
            elif d==3:
                nx = r + dx[1]
                ny = c + dy[1]
                if 0 <= nx < n and 0 <= ny < m and visited[nx][ny] == 0 and graph[nx][ny] == 0:
                    cnt+=1
                    r, c = nx, ny
                elif 0 <= nx < n and 0 <= ny < m and visited[nx][ny] == 1 and graph[nx][ny] == 0:
                    r, c = nx, ny
                elif 0 <= nx < n and 0 <= ny < m and graph[nx][ny] == 1:
                    print(cnt)
                    break
    
        elif flag==1:
            if d==0:
                #90도로 방향돌리기
                d=3
    
            else:
                #90도로 방향돌리기
                d-=1
            nx = r + dx[d]
            ny = c + dy[d]
            if 0 <= nx < n and 0 <= ny < m and visited[nx][ny] == 0 and graph[nx][ny] == 0:
                #방문표시
                visited[nx][ny]=1
                r, c = nx, ny
                cnt+=1

    리펙토링이 필요하긴하다.. 

    실전에서는?? 함수화하는게 관리가 편하려나

    '코테 대비 python > 백준' 카테고리의 다른 글

    복습 1935 후위 표기식2  (0) 2023.04.14
    1181 단어 정렬  (0) 2023.04.11
    1966 프린터 큐  (0) 2023.04.10
    13335 트럭  (0) 2023.04.10
    14888 연산자 끼워넣기  (0) 2023.04.04
Designed by Tistory.