김호쭈
DevForYou
김호쭈
전체 방문자
오늘
어제
  • 분류 전체보기 (321)
    • • 데이터베이스(DB) (9)
      • __SQL__ (9)
    • •알고리즘(Algorithm ) (117)
      • 문제풀이 (99)
      • 스터디 (14)
      • 알고리즘 팁 (4)
    • •Compter Science (57)
      • Operating System (25)
      • Computer Network (1)
      • Computer Vision (16)
      • Artificial Intelligence (14)
      • Software Technology (1)
    • • 독서 (36)
      • Design Pattern (24)
      • 객체지향의 사실과 오해 (1)
      • Object Oriented Software En.. (11)
    • • 개발 (26)
      • React (3)
      • node.js (6)
      • Django (11)
      • Spring boot (6)
    • • 개발Tip (4)
      • GitHub (0)
    • •프로젝트 (2)
      • 물물 (2)
    • •App (54)
      • 안드로이드 with Kotlin (50)
      • 코틀린(Kotiln) (4)
    • •회고 (8)
    • •취준일기 (3)
    • • 기타 (2)

블로그 메뉴

  • 홈
  • 태그
  • 방명록

공지사항

인기 글

태그

  • Remote저장소
  • ㄱ
  • local저장소
  • 원격저장소
  • 깃허브데스크탑
  • KMU_WINK
  • 로컬저장소
  • GitHubDesktop

최근 댓글

최근 글

티스토리

hELLO · Designed By 정상우.
김호쭈

DevForYou

•알고리즘(Algorithm )/문제풀이

[백준14503&파이썬] 회전은 모듈러연산을 이용하자

2023. 6. 17. 01:18

# 문제

백준 14503 로봇청소기 파이썬 풀이

 

14503번: 로봇 청소기

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

www.acmicpc.net

# 코드

import sys
from collections import deque

def print2D(arr):
  for i in arr :
    print(i)
  print()

N,M = map(int,sys.stdin.readline().split())

# 로봇 청소기 위치, 바라보는 방향
r,c,d = map(int,sys.stdin.readline().split())

board = list()

NORTH = 0
EAST = 1
SOUTH = 2
WEST = 3

# 반시계 방향으로 회전한다.
dirs = [
  (-1,0),(0,1),(1,0),(0,-1)
  ]


for _ in range(N) :
  line = list(map(int,sys.stdin.readline().split()))
  board.append(line)

# 0 = 청소되지 않은 빈 칸
# 1 = 벽

cnt = 0
visit = [[False] * M for _ in range(N)]
dq = deque()
dq.append((r,c,d))

while len(dq) != 0 :
  r,c,d = dq.pop()
  # print("dq : ", dq)

  # 방문처리를 진행한다.
  if board[r][c] == 0 and visit[r][c] == False :
    cnt +=1
    visit[r][c] = True
    # print(r,c,d)
    # print2D(visit)

  canGo = False
  for i in range(1,5) :
    nd = (d-i) % 4 # 다음방향을 결정한다.
    dir = dirs[nd]
    nr = r + dir[0]; nc = c + dir[1]

    if 0 < nr < N and 0 < nc < M : # 이동이 가능하면
      if visit[nr][nc] == False and board[nr][nc] == 0 : # 이동 가능한 조건이다.
        dq.append( (nr,nc,nd) )
        # print(nr, nc, nd)
        canGo = True
        break

  if not canGo :
    bd = (d+2) % 4 #후진방향
    dir = dirs[bd]
    br = r + dir[0]; bc = c + dir[1]

    if (0 < br < N and 0 < bc < M ) and board[br][bc] == 0:
      dq.append((br,bc,d)) # 후진이동
      # print("back")
    else :
      break

print(cnt)

# 풀이

  • 해당 문제는 조건에 대해서만 구현해야 한다. 조건에서 하라는대로! 특히 현재방향에서 앞에꺼를 보는것이 아닌 일단 90도 반시계로 회전부터 시켜야 한다.
  • 이 문제에서는 회전에 대한 개념이 두번 등장한다.
  • 반시계방향으로의 회전
  for i in range(1,5) :
    nd = (d-i) % 4 # 다음방향을 결정한다.
    dir = dirs[nd]
    nr = r + dir[0]; nc = c + dir[1]
  • 뒷방향으로의 180도 회전
  if not canGo :
    bd = (d+2) % 4 #후진방향
    dir = dirs[bd]
    br = r + dir[0]; bc = c + dir[1]
  • 모듈러 연산을 이용한다면 적절히 회전 시킬 수 있다.
저작자표시 (새창열림)

'•알고리즘(Algorithm ) > 문제풀이' 카테고리의 다른 글

[백준15683&파이썬] 여러경우의 4방향 탐색 및 회전 가지치기와 완전탐색  (0) 2023.06.23
[백준14891&파이썬] 톱니바퀴를 돌릴때는 deque를 사용하자  (0) 2023.06.17
[백준14499&파이썬] 주사위를 굴릴때의 조건에 대해 생각해보자  (0) 2023.06.15
[백준3190&파이썬] 스네이크게임은 deque로 구현이 가능하다.  (0) 2023.06.13
[백준1865&파이썬] 플로이드 와샬을 통해 음의 사이클 판단하기  (0) 2023.06.10
    '•알고리즘(Algorithm )/문제풀이' 카테고리의 다른 글
    • [백준15683&파이썬] 여러경우의 4방향 탐색 및 회전 가지치기와 완전탐색
    • [백준14891&파이썬] 톱니바퀴를 돌릴때는 deque를 사용하자
    • [백준14499&파이썬] 주사위를 굴릴때의 조건에 대해 생각해보자
    • [백준3190&파이썬] 스네이크게임은 deque로 구현이 가능하다.
    김호쭈
    김호쭈
    공부하고 정리하고 기록하기

    티스토리툴바