본문 바로가기

Algorithm(BOJ, Python)/BFS&DFS25

[백준_23352] 방탈출 python # n, m 입력 n, m = map(int, input().split()) # room 입력 room = [ list(map(int, input().split())) for _ in range(n) ] # 함수들 # in_range(x, y) def in_range(x, y): return 0 2022. 9. 26.
[백준_18405] 경쟁적전염 python 와 이문제 생각보다 매우 까다로웠다. bfs내에서 종료조건을 걸어줘야, 시간초과에 걸리지 않고 문제를 해결할 수 있다. # n, k 입력 n, k = map(int, input().split()) # lab lab = [ list(map(int, input().split())) for _ in range(n) ] # s, r, c 입력 s, r, c = map(int, input().split()) # 함수들 # in_range(x, y) def in_range(x, y): return 0 2022. 9. 14.
[백준_22352] 항체인식 python # n, m 입력 n, m = map(int, input().split()) # case_before 입력 case_before = [ list(map(int, input().split())) for _ in range(n) ] # case_after 입력 case_after = [ list(map(int, input().split())) for _ in range(n) ] # 함수들 # test_2() def test_2(): # 색깔이 변한 횟수 cnt = 0 # 섹션의 대푯값들을 뽑기 for section in sections: x, y = section[0] if case_before[x][y] != case_after[x][y]: cnt += 1 # 두 섹션 이상에서 색깔이 변했으면, if cn.. 2022. 9. 13.
[백준_1245] 농장관리 python # n, m 입력 n, m = map(int, input().split()) # farm 입력 farm = [ list(map(int, input().split())) for _ in range(n) ] # 함수들 # is_mount_top(x, y) def is_mount_top(x, y): dxs, dys = [-1, -1, -1, 0, 0, 1, 1, 1], [-1, 0, 1, -1, 1, -1, 0, 1] for dx, dy in zip(dxs, dys): nx, ny = x + dx, y + dy # 주변 위치가 범위 내에 있으면서 현재 위치보다 높으면 실패 if in_range(nx, ny) and farm[x][y] < farm[nx][ny]: return False # 그런 산봉우리가 없으.. 2022. 9. 11.
[백준_6593] 상범빌딩 python 3차원배열 받는법좀 까먹지말자,, while True: # l, r, c 입력 l, r, c = map(int, input().split()) # 종료조건 if l == 0 and r == 0 and c == 0: break # building building = [ [[0 for _ in range(c)] for _ in range(r)] for _ in range(l) ] # building 입력받기 for h in range(l): for i in range(r): block = input() for j in range(c): # 시작 위치 저장 if block[j] == 'S': sh, sx, sy = h, i, j # 끝 위치 저장 if block[j] == 'E': eh, ex, ey = h,.. 2022. 9. 10.
[백준_17836] 공주님을 구해라 python # n, m, t 입력 n, m, t = map(int, input().split()) # castle 입력 castle = [ list(map(int, input().split())) for _ in range(n) ] # 함수들 # in_range(x, y) def in_range(x, y): return 0 t: return False # 성공시 리턴 return step[-1][-1] # 설계 # 큐 사용 준비 from collections import deque q = deque() # ans 설정 import sys ans = sys.maxsize # 검을 구하지 않고 갈 수 있는지 확인 후 if without_soward(): # ans 처리 ans = without_soward() # 검을.. 2022. 9. 9.
[백준_2589] 보물섬 python 바보같이 처음에 리커전을 통해, 두 좌표의 조합을 모두 구해 해결하려는 판단을 해 버렸고, 어림도없이 시간초과에 걸려버렸다. # 입력 속도 개선 import sys input = sys.stdin.readline # n, m 입력 n, m = map(int, input().split()) # island 설계 island = [ [0] * m for _ in range(n) ] # island 입력 for i in range(n): s = input() for j in range(m): # 땅이면 if s[j] == 'L': # 1로 처리 island[i][j] = 1 # 함수들 # in_range(x, y) def in_range(x, y): return 0 2022. 9. 5.
[백준_17141] 연구소 2 python bfs를 동시에 돌릴 줄 알아야 한다는 점과, 백트랙킹을 통해 바이러스를 놓는 조합을 모두 구해야 하는 점, 그리고 모든 바이러스가 이미 퍼져있는 상황을 판단하는 점 등이 중요했던 것 같다. # 입력 속도 개선 import sys input = sys.stdin.readline # n, m 입력 n, m = map(int, input().split()) # lab 입력 lab = [ list(map(int, input().split())) for _ in range(n) ] # 함수들 # all_done() def all_done(): # 바이러스를 놓을 수 있는 위치의 수와 m이 다르면, if len(possible_virus_pos) != m: # 실패 return False # lab 돌면서 for.. 2022. 9. 2.
[백준_16234] 인구이동 python 시뮬레이팅과 bfs를 적절히 사용하여 해결해야 한다. # n, l, r 입력 n, l, r = map(int, input().split()) # world 입력 world = [ list(map(int, input().split())) for _ in range(n) ] # 함수돌 # in_range(x, y) def in_range(x, y): return 0 2022. 8. 31.
[백준_2583] 영역 구하기 python dfs 문제를 풀때마다 느끼는거지만, 파이썬의 최대 리커전가능 횟수 디폴트값이 1000인건, 너무 야박한 것 같다. 꼭지점 좌표로 입력 받을 때, 역으로 이를 생각해야 하기에 조금 불편하겠다 싶었는데, 곰곰히 생각해보니 점대칭으로 그냥 받아도 아무차이없을 것 같아, 그대로 해봤더니 성공했다. # n, m, k 입력 n, m, k = map(int, input().split()) # grid grid = [ [0] * m for _ in range(n) ] # 꼭지점 좌표 입력 for _ in range(k): sy, sx, ey, ex = map(int, input().split()) # 직사각형 그려주기 for i in range(sx, ex): for j in range(sy, ey): grid[i].. 2022. 8. 30.
[백준_4963] 섬의 개수 python 사실 앞서 2시간 넘게 풀던 문제가 시간초과에 걸려, 오늘은 여기까지만 하자 하고 일보 후퇴하였다. 매우 쉽게 해결 가능한 문제,, while True: # w, h 입력 w, h = map(int, input().split()) # 종료조건 if w == 0 and h == 0: break # grid 입력 grid = [ list(map(int, input().split())) for _ in range(h) ] # 함수들 # in_range(x, y): def in_range(x, y): return 0 2022. 8. 29.
[백준_2468] 안전영역 python 왤케 dfs가 bfs보다 어려운 느낌인지,, # n 입력 n = int(input()) # town 입력 town = [ list(map(int, input().split())) for _ in range(n) ] # 함수들 # in_range(x, y) def in_range(x, y): return 0 max_height: max_height = town[i][j] # 최대 안전 영역 개수 max_safe_area = 1 # 최대 리커전 횟수 올려주기 sys.setrecursionlimit(100000) # 높이 1부터 최대높이 전까지 시뮬레이션 하면서 for h in range(1, max_height + 1): # 안전 영역 갯수 safe_area = 0 # visited 설계 및 초기화 visi.. 2022. 8. 26.
[백준_1012] 유기농배추 python 어제 과음한 관계로,, 오늘은 쉬운 문제,, # t 입력 t = int(input()) for _ in range(t): # m, n, k 입력 m, n, k = map(int, input().split()) # mount mount = [ [0] * m for _ in range(n) ] # x, y 입력 for i in range(k): x, y = map(int, input().split()) # 배추 심어주기 mount[y][x] = 1 # 함수들 # in_range(x, y) def in_range(x, y): return 0 2022. 8. 25.
[백준_2606] 바이러스 python 오늘은 좀 쉬어가자,, # com_num 입력 com_num = int(input()) # con_num 입력 con_num = int(input()) # start_points, end_points 설계 및 입력 start_points, end_points = [], [] for _ in range(con_num): s, e = map(int, input().split()) start_points.append(s) end_points.append(e) # dfs(vertex) def dfs(vertex): global ans for curr_v in range(1, com_num + 1): if graph[vertex][curr_v] and not visited[curr_v]: ans += 1 visi.. 2022. 8. 23.
[백준_7569] 토마토 python 3차원 배열만 잘 구현할 수 있다면, 어렵지 않게 해결할 수 있는 문제였다. # m, n, h 입력 m, n, h = map(int, input().split()) # storage 설계 storage = [] # 각 층 입력 for _ in range(h): floor = [ list(map(int, input().split())) for _ in range(n) ] storage.append(floor) # 함수들 # in_range(f, x, y) def in_range(f, x, y): return 0 2022. 8. 22.
[백준_2206] 벽 부수고 이동하기 python 처음 이 문제를 봤을 때에는 매우 쉽게 느껴졌으나, 시간초과의 늪에 걸리고 말았다. bfs를 돌릴 때, 큐에 넣어주는 인수에 w라는 인수를 만들어, 벽을 부쉈는지 못부쉈는지를 생각하며 나아가야 한다. 각각의 경우를 다 계산하려면, 시간초과에 걸리고 만다. # n, m 입력 n, m = map(int, input().split()) # grid 설계 grid = [ [0] * m for _ in range(n) ] # grid 입력 for i in range(n): maps = input() for j in range(len(maps)): if maps[j] == '1': grid[i][j] = 1 # 함수들 # in_range(x, y) def in_range(x, y): return 0 2022. 8. 21.
[백준_2573] 빙산 python 첫째로 실패했던 것은, is_divided()함수에서, 빙산이 있고, 방문한 적 없는 빙산을 체크해야 하는데, 두 번째 조건을 빼 놓고 생각했다는 것, 두 번째로 실패했던 것은, 최대 리커전 횟수를 늘려 주지 않았다는 것. 이외에는 재밌게 푼 문제같다. # 입력 # n, m 입력 n, m = map(int, input().split()) # north_pole 입력 north_pole = [ list(map(int, input().split())) for _ in range(n) ] # 함수들 # is_ocean(x, y) def is_ocean(x, y): return not north_pole[x][y] # check_pow(x, y) def check_pow(x, y): # pow pow = 0 #.. 2022. 8. 20.
[백준_1987] 알파벳 python 풀다가 정신병 걸릴뻔했다. 이유도 너무 어이가 없는 것이, 충분히 무시해도 될 만한, 함수리턴과, zip 상 하 좌 우 순서 상관 x dxs, dys = [-1, 1, 0, 0], [0, 0, -1, 1] for i in range(4): # 다음 위치 예측 nx, ny = x + dxs[i], y + dys[i] # 갈 수 있으면 if 0 방문한 알파벳을 기록해 줄 세트 visited_alphabet = set() # 제출용 정답 ans = 0 # 방문한 알파벳 기록해주고 visited_alphabet.add(grid[0][0]) # dfs 돌리기 dfs(0,0,1) # 출력 print(ans) 늘 만들어왔던, chek 함수와 in_range함수를 포기하고 코드를 더럽게 짤 수 밖에 만들었다. 그래도 .. 2022. 8. 19.