일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | |||
5 | 6 | 7 | 8 | 9 | 10 | 11 |
12 | 13 | 14 | 15 | 16 | 17 | 18 |
19 | 20 | 21 | 22 | 23 | 24 | 25 |
26 | 27 | 28 | 29 | 30 | 31 |
Tags
- 익명 클래스
- System.out
- 바운디드 타입
- 합병 정렬
- 로컬 클래스
- System.in
- 람다식
- System.err
- 항해99
- junit 5
- raw 타입
- 스파르타코딩클럽
- 자바할래
- auto.create.topics.enable
- yield
- 제네릭 타입
- 자바스터디
- annotation processor
- Switch Expressions
- 정렬
- 접근지시자
- 브릿지 메소드
- 함수형 인터페이스
- github api
- throwable
- 제네릭 와일드 카드
- docker
- 상속
- 프리미티브 타입
- Study Halle
Archives
- Today
- Total
코딩하는 털보
21.12.14 TIL 본문
알고리즘 문제 풀기 with Python
BFS 연습문제
❓ Q. 문제 설명 로봇 청소기가 주어졌을 때, 청소하는 영역의 개수를 구하는 프로그램을 작성하시오.
로봇 청소기가 있는 장소는 N×M 크기의 직사각형으로 나타낼 수 있으며, 1×1크기의 정사각형 칸으로 나누어져 있다. 각각의 칸은 벽 또는 빈 칸이다. 청소기는 바라보는 방향이 있으며, 이 방향은 동, 서, 남, 북중 하나이다. 지도의 각 칸은 (r, c)로 나타낼 수 있고, r은 북쪽으로부터 떨어진 칸의 개수, c는 서쪽으로 부터 떨어진 칸의 개수이다.
로봇 청소기는 다음과 같이 작동한다.
- 현재 위치를 청소한다.
- 현재 위치에서 현재 방향을 기준으로 왼쪽방향부터 차례대로 탐색을 진행한다. a. 왼쪽 방향에 아직 청소하지 않은 공간이 존재한다면, 그 방향으로 회전한 다음 한 칸을 전진하고 1번부터 진행한다. b. 왼쪽 방향에 청소할 공간이 없다면, 그 방향으로 회전하고 2번으로 돌아간다. c. 네 방향 모두 청소가 이미 되어있거나 벽인 경우에는, 바라보는 방향을 유지한 채로 한 칸 후진을 하고 2번으로 돌아간다. d. 네 방향 모두 청소가 이미 되어있거나 벽이면서, 뒤쪽 방향이 벽이라 후진도 할 수 없는 경우에는 작동을 멈춘다. 로봇 청소기는 이미 청소되어있는 칸을 또 청소하지 않으며, 벽을 통과할 수 없다.
입력 조건 로봇 청소기가 있는 칸의 좌표 (r, c)와 바라보는 방향 d가 주어진다. 이 때 d가 0인 경우에는 북쪽을, 1인 경우에는 동쪽을, 2인 경우에는 남쪽을, 3인 경우에는 서쪽을 바라보고 있는 것이다.
또한 청소하고자 하는 방의 지도를 2차원 배열로 주어진다. 빈 칸은 0, 벽은 1로 주어진다. 지도의 첫 행, 마지막 행, 첫 열, 마지막 열에 있는 모든 칸은 벽이다.
로봇 청소기가 있는 칸의 상태는 항상 빈 칸이라고 했을 때, 로봇 청소기가 청소하는 칸의 개수를 반환하시오.
[코드스니펫] 샤오미 로봇 청소기
from collections import deque current_r, current_c, current_d = 7, 4, 0 current_room_map = [ [1, 1, 1, 1, 1, 1, 1, 1, 1, 1], [1, 0, 0, 0, 0, 0, 0, 0, 0, 1], [1, 0, 0, 0, 1, 1, 1, 1, 0, 1], [1, 0, 0, 1, 1, 0, 0, 0, 0, 1], [1, 0, 1, 1, 0, 0, 0, 0, 0, 1], [1, 0, 0, 0, 0, 0, 0, 0, 0, 1], [1, 0, 0, 0, 0, 0, 0, 1, 0, 1], [1, 0, 0, 0, 0, 0, 1, 1, 0, 1], [1, 0, 0, 0, 0, 0, 1, 1, 0, 1], [1, 0, 0, 0, 0, 0, 0, 0, 0, 1], [1, 1, 1, 1, 1, 1, 1, 1, 1, 1] ] def get_count_of_departments_cleaned_by_robot_vacuum(r, c, d, room_map): directions = [[-1, 0], [0, 1], [1, 0], [0, -1]] queue = deque() queue.append([r, c, d]) count = 1 room_map[r][c] = 2 while queue: r, c, d = queue.popleft() temp_d = d for i in range(4): temp_d = (temp_d + 3) % 4 temp_r = r + directions[temp_d][0] temp_c = c + directions[temp_d][1] if room_map[temp_r][temp_c] == 0: room_map[temp_r][temp_c] = 2 queue.append([temp_r, temp_c, temp_d]) count += 1 break elif i == 3: temp_d = (d + 2) % 4 temp_r = r + directions[temp_d][0] temp_c = c + directions[temp_d][1] if room_map[temp_r][temp_c] == 1: return count else: queue.append([temp_r, temp_c, d]) # 57 가 출력되어야 합니다! print(get_count_of_departments_cleaned_by_robot_vacuum(current_r, current_c, current_d, current_room_map)) current_room_map2 = [ [1, 1, 1, 1, 1, 1, 1, 1, 1, 1], [1, 0, 1, 1, 0, 0, 0, 0, 0, 1], [1, 0, 0, 0, 1, 1, 1, 1, 0, 1], [1, 0, 0, 1, 1, 0, 0, 0, 0, 1], [1, 0, 1, 1, 0, 0, 0, 0, 0, 1], [1, 0, 0, 0, 0, 0, 0, 0, 0, 1], [1, 0, 0, 0, 0, 0, 0, 1, 0, 1], [1, 0, 0, 0, 0, 0, 1, 1, 0, 1], [1, 0, 0, 0, 0, 0, 1, 1, 0, 1], [1, 0, 0, 0, 0, 0, 0, 0, 0, 1], [1, 1, 1, 1, 1, 1, 1, 1, 1, 1] ] print("정답 = 29 / 현재 풀이 값 = ", get_count_of_departments_cleaned_by_robot_vacuum(6,3,1,current_room_map2)) current_room_map3 = [ [1, 1, 1, 1, 1, 1, 1, 1, 1, 1], [1, 0, 1, 1, 0, 0, 0, 0, 0, 1], [1, 0, 0, 0, 1, 1, 1, 1, 0, 1], [1, 0, 0, 1, 1, 0, 0, 0, 0, 1], [1, 0, 1, 1, 0, 0, 0, 0, 0, 1], [1, 0, 0, 0, 0, 0, 0, 0, 0, 1], [1, 0, 0, 0, 0, 0, 0, 1, 0, 1], [1, 0, 0, 0, 0, 0, 1, 1, 0, 1], [1, 0, 0, 1, 0, 0, 1, 1, 0, 1], [1, 0, 0, 0, 0, 0, 0, 0, 0, 1], [1, 1, 1, 1, 1, 1, 1, 1, 1, 1] ] print("정답 = 33 / 현재 풀이 값 = ", get_count_of_departments_cleaned_by_robot_vacuum(7,4,1,current_room_map3)) current_room_map4 = [ [1, 1, 1, 1, 1, 1, 1, 1, 1, 1], [1, 0, 1, 1, 0, 0, 0, 0, 0, 1], [1, 0, 1, 0, 1, 1, 1, 1, 0, 1], [1, 0, 0, 1, 1, 0, 0, 0, 0, 1], [1, 0, 1, 1, 0, 0, 0, 0, 0, 1], [1, 0, 0, 0, 0, 0, 0, 0, 0, 1], [1, 0, 0, 0, 0, 0, 0, 1, 0, 1], [1, 0, 0, 0, 0, 0, 1, 1, 0, 1], [1, 0, 0, 1, 0, 0, 1, 1, 0, 1], [1, 0, 0, 0, 0, 0, 0, 0, 0, 1], [1, 1, 1, 1, 1, 1, 1, 1, 1, 1] ] print("정답 = 25 / 현재 풀이 값 = ", get_count_of_departments_cleaned_by_robot_vacuum(6,2,0,current_room_map4))
2597 계단오르기
모든 계단은 최대 점수가 두가지 경우의 최대값이다.
해당 계단이 i 번째, pi를 i번째 계단의 점수, Pi를 i번째 계단까지의 최대값이라고 한다면,
Pi = pi + max( pi-1 + Pi-3, Pi-2)
재귀와 유사하다.
바텀엄 동적 계산법으로 데이터를 메모라이징 한다.
import sys
number = int(sys.stdin.readline().rstrip())
score_list = []
max_list = []
for _ in range(number):
score_list.append(int(sys.stdin.readline().rstrip()))
for i in range(len(score_list)):
# memorize
if i == 0:
max_list.append(score_list[0])
elif i == 1:
max_list.append(score_list[1] + score_list[0])
elif i == 2:
max_list.append(max(score_list[2] + score_list[0], score_list[2] + score_list[1]))
else:
max_list.append(score_list[i] + max(score_list[i-1] + max_list[i-3], max_list[i-2]))
print(max_list[-1])
Comments