문제요약 나의 코드 및 설명 - DFS 활용 DFS를 활용하여 문제를 해결하였다. def dfs(depth, temp): global a,b if temp >= b: if temp == b: result.append(depth) return dfs(depth+1, temp*2) dfs(depth+1, int("".join(map(str, (list(map(int, str(temp)))+[1]))))) a, b = map(int, input().split()) result = [] dfs(0,a) if result: print(min(result)+1) else: print(-1) 다른 코드 및 설명 - BFS 활용 BFS를 활용하여 문제를 해결하였다. 큐에 다음 숫자와 연산의 개수를 추가한다. from ..
문제요약 나의 코드 및 설명 bfs() : 아기 상어의 위치로부터 이동할 수 있는 칸의 거리를 v 테이블에 저장 find() : v 테이블에 저장된 숫자가 가장 작은 칸이 아기 상어로부터 가장 가까운 거리의 칸이므로, 가장 가까운 거리의 물고기를 구하는 함수 먹을 수 있는 물고기가 없을 때까지 두 함수를 반복한다. from collections import deque #아기 상어의 위치에서부터 이동할 수 있는 칸의 거리를 v 테이블에 저장 def bfs(sx,sy,size): queue = deque() queue.append((sx,sy)) v[sy][sx] = 0 board[sy][sx] = 0 while queue: x,y = queue.popleft() for i in range(4): nx = ..
문제요약 나의 코드 및 설명 나는 컨베이어 벨트와, 로봇 위치가 회전하는 것을 직접 구현하였다. #컨베이어, 로봇 위치 회전 def rotate(): x = a.pop() y = b.pop(0) a.insert(0,y) b.append(x) r = robot.pop() robot.insert(0, r) #로봇 이동 def move(): for i in range(n-1,0,-1): #3 , 2, 1 #맨 끝에서부터 if robot[i] == 0 and a[i] >= 1: #로봇이 없고, 내구도가 1 이상이면 if robot[i-1] == 1: #이전 칸에 로봇이 있다면 robot[i] += 1 #현재 칸에 로봇 +1 a[i] -= 1 #내구도 1 감소 robot[i-1] -= 1 #이전 칸 로봇이 현재 ..
문제요약 나의 코드 및 설명 너비 우선 탐색을 통해 회전할 범위에 있는 좌표를 순차적으로 방문하며, 스택을 활용해 현재 좌표 값을 저장하고, 다음 좌표 방문 시 스택에 저장된 이전 좌표 값으로 갱신한다. 순열 라이브러리를 통해 가능한 모든 회전 연산의 경우의 수를 탐색하여, 최소값을 구했다. from itertools import permutations from collections import deque import copy #한 줄씩 방문하면서 스택에 값을 넣고, 다음 좌표에 값을 넣는다 def bfs(sx,sy,ex,ey,stack,board): queue = deque() v = [[0 for _ in range(m)] for _ in range(n)] v[sy][sx] = 1 stack.appe..
문제요약 나의 코드 및 설명 (참고한 코드) fill() : cctv 번호에 맞게 감시 지역을 채우는 함수 dfs() : 가능한 감시 지역을 백트래킹으로 모두 파악 dfs()에서 리스트 cctv에 저장된 cctv정보(cctv번호, x,y)를 하나씩 꺼내고, cctv번호를 통해 가능한 감시 방향을 for문을 통해 탐색하며 fill 함수를 통해 그리드를 업데이트한다. import copy #--------------------함수 정의 부분------------------ #cctv번호에 맞게 감시 지역을 채우는 함수 def fill(board, direction, x,y): for i in direction: #ex) 여기서 direction은 [1,2]...이다 nx = x ny = y while Tru..
문제요약 나의 코드 및 설명 01 - 질문게시판에 있는 반례 다 통과하는데 틀렸습니다 받음 >> 뱀의 꼬리를 제거할 때 잘못함 전체 그리드 : board[][] 뱀이 있는 좌표 값 : 2 사과가 놓인 좌표 값 : 1 아무것도 없는 좌표 값 : 0 으로 정의하고 문제를 풀었다. 매 초마다 뱀의 움직임을 업데이트하는 move() 함수를 작성하고, 메인 함수 부분의 while문에서 호출하여 뱀이 더 이상 움직일 수 없을 때까지 이동을 반복할 수 있도록 코드를 작성하였다. 예제 입력과 질문게시판 반례를 모두 통과하였지만 계속 틀렸다는 판정을 받았다. 알고보니, 뱀이 방문할 다음 좌표에 아무것도 없는 경우, 다음 좌표를 2로 업데이트하고, 뱀의 꼬리 부분은 0으로 바꿔주어야 하는데 이 부분이 잘못되었다. 처음엔 ..
문제요약 나의 코드 및 설명 톱니바퀴를 시계방향으로 회전시키는 함수 turn_right()와 반시계방향으로 회전시키는 함수 turn_left()를 구현하였다. 기준이 될 톱니바퀴를 입력받고, 왼쪽에 놓인 톱니바퀴들은 idx:6에 영향을 받고, 오른쪽에 놓인 톱니바퀴들은 idx:2에 영향을 받는다. 문제의 조건을 놓치지 않고 따라가면서 모든 톱니바퀴를 탐색하는 방식으로 구현하였다. def turn_right(arr): #시계방향 회전 arr.insert(0,arr.pop()) return def turn_left(arr): #반시계방향 회전 arr.append(arr.pop(0)) return #4개의 톱니바퀴에 대한 상태 저장 gear = [] for _ in range(4): gear.append(li..
문제요약 나의 코드 및 설명 반시계 방향으로 회전시키는 turn_left() 함수를 작성하고, while문을 돌려서 반시계 방향으로 회전 했을 때, 다음 좌표가 청소할 수 있는 좌표라면 방문하고, 그렇지 않다면 회전 카운트(cnt)를 1 증가시킨다. 회전 카운트가 4가 된다면, 동서남북 네 방향을 모두 탐색한 것이므로, 후진할 수 있는지 확인한다. n, m = map(int, input().split()) #n:세로 m:가로 y,x, d = map(int, input().split()) #0:북 1:동 2:남 3:서 board = [] for _ in range(n): board.append(list(map(int, input().split()))) dx = [0,1,0,-1] dy = [-1,0,1,0..