백준 12

[Python] 백준 20056번 - 마법사 상어와 파이어볼

아이디어 1. 파이어 볼을 움직일 때, 각 방향에 대해 얼마나 움직일지를 미리 리스트에 저장한 후 계산 2. 행, 열이 넘어가는 경우를 체크하는 함수 작성 3. 파이어볼을 모두 합치고, 쪼개는 작업을 함. 4. 질량이 0 인 파이어볼은 board 내에서 제거 풀이 코드 # 행, 열이 넘어가는 경우 체크 def over_flow(x): if x = n: x = x % n return x # 현재 위치, 속도, 방향으로부터 다음 위치를 계산한다 def get_coords(x, y, d, s): go = [(-1, 0), (-1, 1), (0, 1), (1, 1), (1, 0), (1, -1), (0, -1), (-1, -1)] gox = x + go[d]..

[Python] 백준 21609번 - 상어 중학교

오답 어디서 틀렸는지 계속 헤맸는데 블록 탐색해줄 때 board 초기화를 안해줬다. visited 체크가 그대로된 채로 블록을 계속 탐색하고 있었다. 풀이 코드 import copy from collections import deque # 크기가 가장 큰 블록 그룹 찾기 def search_block(board): original = copy.deepcopy(board) go_x = [0, 0, 1, -1] go_y = [1, -1, 0, 0] max_n = 0 block_cords = [] for i in range(n): for j in range(n): if 5 >= board[i][j] >= 1: board = copy.deepcopy(original) b_cords = [] q = deque([..

[Python] 백준 21608번 - 상어 초등학교

구현 자체는 쉬웠지만 엣지케이스를 통과하지 못했다 틀린 이유 1. 오름차순 소팅해야하는데 내림차순으로 했던 경우 2. min 값을 비교할 때, 기준값을 0 으로 잘못 설정 3. 함수 분리를 더 꼼꼼히 해야할 것 같다 # 1. 비어있는 칸 중에서 좋아하는 학생이 인접한 칸이 가장 많은 곳 def likes(): like_cnt = [] for i in range(n): for j in range(n): if seats[i][j] == 0: cnt = 0 for dx, dy in zip(go_x, go_y): nx = dx + i ny = dy + j if 0

[Python] 백준 19237번 - 어른상어

쉽게 구현했으나 엣지 케이스를 통과하지 못해서 오래 헤맸다. 종료조건을 맞추지 못해 틀렸다. 틀린 부분 if len(shark_dir) == 1 and 1 in shark_dir: break elif ans > 1000: ans = -1 break 이렇게 코드를 짜면, 1000초를 초과했더라도 상어가 1만 남았다면 -1 을 출력하지 못하게 된다. 그래서 조건 체크 순서를 바꾸어 줘야 맞다. 수정 코드 # 현재 위치에 냄새 뿌림 # (상어 넘버, 냄새 값) def spread_smell(b_arr, s_arr): for i in range(n): for j in range(n): if b_arr[i][j] > 0: s_arr[i][j] = (b_arr[i][j], k) return s_arr # 다음 이동..

[Python] 백준 23291번 - 어항정리

아이디어 어항의 각 줄을 deque 로 나타내서 어항의 자리 바꿈이나 회전을 쉽게 구현할 수 있었다. 만약 어항이 다음처럼 생겼다면 , 1 2 3 4 5 6 7 8 deque 를 사용해서 다음과 같이 나타내 사용했다. bowl = [deque([1, 2]), deque([3, 4]), deque([5, 6, 7, 8])] 풀이 코드 from collections import deque # 잘라낸 부위를 회전 def transpose(arr): h = len(arr) w = len(arr[0]) trans = [deque() for _ in range(w)] for i in range(h): for j in range(w): trans[j].appendleft(arr[i][j]) return trans #..

[Python] 백준 14499번 - 주사위 굴리기

1. 다음에 가려는 방향과 좌표를 체크 2. 가려는 방향과 좌표가 존재하면 주사위를 굴리고 경우에따라 수를 복사 # 처음 주사위 모든 면은 0 # # - 주사위를 굴렸을 때 이동한 칸에 쓰여있는 수가 # ㄴ 0 이다 : 주사위의 바닥면에 있듣 수가 칸에 복사됨 # ㄴ 0 이 아니다 : 칸에 쓰인 수가 주사위 바닥에 복사되고, 칸의 수는 0 이 됨 # 바깥으로 이동시키려고 하는 경우에는 해당 명령을 무시해야 하며, 출력도 하면 안 된다 # - 주사위가 이동했을때마다 상단에 쓰인 값을 출력 from collections import deque import copy # 방향에 따라 주사위 굴리기 def move_dice(arr, dir): arr = copy.deepcopy(arr) if dir == 1: a..

[Python] 백준 23288번 - 주사위 굴리기2

1. 현재 x, y 값과 움직여야하는 방향을 구하는 함수를 작성 2. 주사위를 동, 서, 남, 북으로 굴렸을 때의 변화를 미리 함수로 구현 주사위의 각 행 (?) 은 deque 로 표현하여 주사위 굴림을 간편하게 구현할 수 있음 3. 같은 수를 연속해서 가지는 칸의 갯수를 세어 score 를 계산 4. k 번 반복하여 총 score 계산 from collections import deque import copy # 방향에 따라 주사위 굴리기 def move_dice(arr, dir): arr = copy.deepcopy(arr) if dir == 0: arr[1].appendleft(arr[3].pop()) arr[3] = deque([arr[1].pop()]) elif dir == 1: arr[1].a..

[Python] 백준 17140번 - 이차원배열과연산

각 열마다 소팅하는 함수를 만든 후, 배열을 transpose 해서 열에 대해서도 같은 함수로 계산 def get_size(arr): row_n = len(arr) col_n = len(arr[0]) return row_n, col_n def count_element(row): max_num = max(row) cnt = [0 for _ in range(max_num + 1)] for r in row: cnt[r] += 1 return cnt def sorting_func(arr): new_arr = [] row_size = 0 # 소팅은 행마다 이루어짐 for row in arr: cnt_dict = {} cnt = count_element(row) for i, v in enumerate(cnt): i..

[Python] 백준 19236번 - 청소년 상어

DFS, BFS, 백트래킹 등의 문제에서 경우의 수를 탐색할 때 입력 board 의 값들에 영향을 주는 경우 ( 특정 조건에서 어떤 원소 값을 바꾼다 등 ), 이전 상태의 list 로 돌아와야하는 경우가 있기 때문에 그냥 list 값을 넘겨주는 것이 아니라 deecopy 를 통해 값을 모두 복사해 넘겨줘야 함 import copy def move_fish(sx, sy, fish, dir): go = [[], [-1, 0], [-1, -1], [0, -1], [1, -1], [1, 0], [1, 1], [0, 1], [-1, 1]] fish_pos = {} for i in range(4): for j in range(4): # 물고기인지 확인 # 물고기가 살아있어야됨 if fish[i][j] > 0 and..

[Python] 백준 16236번 - 아기 상어

최단 거리 탐색이므로 bfs 로 탐색 큐에 현재 상어 위치에서 갈 수 있는 후보지 positions 을 추가 우선순위가 위 => 왼쪽 이므로 queue 내의 positions 을 소팅하는 것이 중요함 from collections import deque def bfs(x, y): go_x = [0, 0, -1, 1] go_y = [-1, 1, 0, 0] shark_pos = deque([(x, y)]) visited = set([(x, y)]) sec = 0 shark = 2 eat = 0 eat_flag = False answer = 0 while shark_pos: q_size = len(shark_pos) shark_pos = deque(sorted(shark_pos)) for _ in range(..