본문 바로가기

Algorithm 💡272

[Backtracking] 백트래킹 알고리즘의 정의 DFS(깊이 우선 탐색) 복습 DFS는 가능한 모든 경로(후보)를 탐색합니다. 따라서, 불필요할 것 같은 경로를 사전에 차단하거나 하는 등의 행동이 없으므로 경우의 수를 줄이지 못합니다. 따라서 N! 가지의 경우의 수를 가진 문제는 DFS로 처리가 불가능할 것입니다. Backtracking 알고리즘이란 ? '백트래킹'이란 현재 상태에서 가능한 모든 경로를 따라 들어가 탐색하다가 원하는 값과 불일치하는 부분이 발생하면 더 이상 탐색을 진행하지 않고 전 단계로 돌아가는, 즉 이름 그대로 방금 왔던 길을 되짚어가는, Backtrack 하는 알고리즘이다. 해를 찾는 도중 해가 아니어서 막히면, 되돌아가서 다시 해를 찾아가는 기법을 말합니다. 깊이 우선 탐색에서는 한 루트를 끝까지 들여다보고 정답이 없을 시 처음.. 2023. 8. 23.
[백준 15684번] 사다리 조작 15684번: 사다리 조작 사다리 게임은 N개의 세로선과 M개의 가로선으로 이루어져 있다. 인접한 세로선 사이에는 가로선을 놓을 수 있는데, 각각의 세로선마다 가로선을 놓을 수 있는 위치의 개수는 H이고, 모든 세로선 www.acmicpc.net n, m, h = map(int,input().split()) answer = 4 def check(): # i번에서 시작한 세로선이 i번에서 끝나는지 확인하는 함수 for i in range(n): temp = i # 이동하는 세로선 위치 for j in range(h): if ladder[j][temp] == 1: # 오른쪽이 1인 경우(오른쪽으로 가로선이 쳐져있는 경우) temp += 1 elif temp > 0 and ladder[j][temp-1] ==.. 2023. 8. 21.
[백준 16724번] 피리 부는 사나이 16724번: 피리 부는 사나이 첫 번째 줄에 지도의 행의 수를 나타내는 N(1 ≤ N ≤ 1,000)과 지도의 열의 수를 나타내는 M(1 ≤ M ≤ 1,000)이 주어진다. 두 번째 줄부터 N개의 줄에 지도의 정보를 나타내는 길이가 M인 문자열이 주 www.acmicpc.net import sys sys.setrecursionlimit(10**5) n,m = map(int,input().split()) area = [list(sys.stdin.readline().rstrip()) for _ in range(n)] visited = [[-1]*m for _ in range(n)] count = 0 index = 0 def dfs(x,y,idx): global count if visited[x][y] !=.. 2023. 8. 20.
[백준 15686번] 치킨 배달 15686번: 치킨 배달 크기가 N×N인 도시가 있다. 도시는 1×1크기의 칸으로 나누어져 있다. 도시의 각 칸은 빈 칸, 치킨집, 집 중 하나이다. 도시의 칸은 (r, c)와 같은 형태로 나타내고, r행 c열 또는 위에서부터 r번째 칸 www.acmicpc.net import itertools def calculate_distance(r1,c1,r2,c2): return abs(r1-r2) + abs(c1-c2) n, m = map(int,input().split()) input_city = [list(map(int,input().split())) for _ in range(n)] chicken_house_list = set() house_list = set() min_value = float("inf.. 2023. 8. 20.
[백준 14890번] 경사로 https://www.acmicpc.net/problem/14890 n, l = map(int,input().split()) area = [list(map(int,input().split())) for _ in range(n)] total = 0 def checkLine(line): inclined = [False for _ in range(n)] for i in range(n-1): if line[i] == line[i+1]: # 높이가 같은 경우에는 Pass continue if abs(line[i]-line[i+1]) >= 2: # 낮은 칸과 높은 칸의 높이 차이가 1이 아닌 경우(조건 2) return False if line[i] > line[i+1]: # 내리막길인 경우 target = lin.. 2023. 8. 17.
[백준 21610번] 마법사 상어와 비바라기 n,m = map(int,input().split()) area = [list(map(int,input().split())) for _ in range(n)] move_list = [] # 이동 정보 목록 for i in range(m): move_list.append(tuple(map(int,input().split()))) cloud_list= {(n-1,0), (n-1,1), (n-2,0), (n-2,1)} # 초기 구름 위치 dx = [0,-1, -1, -1, 0, 1, 1, 1] # 방향 x좌표 dy = [-1, -1, 0, 1, 1, 1, 0, -1] # 방향 y좌표 dx_2 = [-1,-1,1,1] # 대각선 이동을 위한 x좌표 dy_2 = [-1,1,-1,1] # 대각선 이동을 위한 y좌표.. 2023. 8. 15.