본문 바로가기

Algorithm(BOJ, Python)100

[백준_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.
[백준_2293] 동전 1 python 확실히 dp의 경우 골드와 실버 차이가, 격렬하게 느껴진다,, 풀다가 모르겠어서 구글링을 통해 아이디어를 얻었다. 이걸 어케 생각하는거지,, # n, k 입력 n, k = map(int, input().split()) # coin_list coin_list = [] # coin_list 입력 for _ in range(n): coin_list.append(int(input())) # dp 설계 dp = [ 0 for _ in range(k + 1) ] # dp 초기설정 dp[0] = 1 # dp 채워넣기 # 코인리스트에서 코인을 하나씩 꺼내서 for coin in coin_list: # dp를 돌면서 for i in range(k + 1): # 지금 위치 - 코인 값 만큼이 존재하면, if i - coi.. 2022. 8. 24.
[백준_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.
[백준_7576] 토마토 python 오늘 배운 점 : bfs 동시에 돌릴 수 있다. (좌표를 다 큐에 때려놓고 시작하면 된다.) # m, n 입력 m, n = map(int, input().split()) # storage storage = [ list(map(int, input().split())) for _ in range(n) ] # in_range(x, y): def in_range(x, y): return 0 2022. 8. 18.
[백준_2133] 타일 채우기 python dp 를 풀었을 때 뭔가 찜찜한 느낌이 들면 그 느낌은 결코 배신하지 않는 것 같다. 각 경우마다 새로운 조합이 2개씩 생겨난다는 것을 생각치 못하였다. # dp 설계 dp = [ 0 for _ in range(31) ] # dp 초기설정 dp[2] = 3 dp[4] = 11 # dp 채워넣기 for i in range(6, 31, 2): # 두번 전의 값 * 3 dp[i] = dp[i-2] * 3 # 네번째 전, 여섯 번째 전 ,,, for j in range(4, i, 2): # 각각 2개씩 경우의수가 붙음 dp[i] += dp[i-j] * 2 # 새로운 조합 2개 나옴 dp[i] += 2 # n 입력 n = int(input()) # 출력 print(dp[n]) 2022. 8. 17.
[백준_10026] 적록색약 python 처음 이 문제를 풀었을 때, 런타임 에러가 떴다. 테스트 케이스는 통과했는데 런타임 에러가 뜨는 경우는, 인덱스 설정을 잘못 했을 경우가 많다는 것을 경험적으로 알고 있었기에, 여기저기 찾아봤지만 아무리 찾아봐도 잘못된 점이 없었다. 그러던 중 n이 100까지 갈 수 있다는 것을 알게 되었고, 혹시 최대 리커젼 가능 횟수에 걸린 것이 아닐까 하는 생각이 들었다. 파이썬은 최대 리커젼 가능 횟수가 1000회로 디폴트값이 설정되어있기 때문에, 이 이상의 재귀를 돌릴라면, 이를 인위적으로 바꿔주는 코드가 필요하다. 역시나, 이를 바꿔주니 해결되었다. # n 입력 n = int(input()) # grid 설계 grid = [ [0] * n for _ in range(n) ] # grid 채워넣기 for i i.. 2022. 8. 16.
[백준_14502] 연구소 python 오늘 배운 점은, 조합을 구하는 재귀를 돌릴 때, 보다 빠른 방법을 찾았다는 것이다. # 입력 속도 개선 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) ] # visited visited = [ [0] * m for _ in range(n) ] # in_range(x, y) def in_range(x, y): return 0 비어있는 공간의 좌표를 기록해줄 리스트 empty_pos = [] # 연구실을 돌면서 for i in range(n): for j in range(m): # 빈 공간을 찾으.. 2022. 8. 15.
[백준_15686] 치킨배달 python 재귀함수를 이용하여, 조합을 만들어 주는 법을 미리 알고 있어야 수월하게 해결할 수 있는 문제다. import sys # n, m 입력 n, m = map(int, input().split()) # town town = [ list(map(int, input().split())) for _ in range(n) ] # ans_list ans_list = [] # calc() def calc(): # ans_list 갱신 global ans_list # 전체 거리 total_dist = 0 for house in house_pos: # 집 위치 언팩킹 hx, hy = house # 치킨 거리 chicken_dist = sys.maxsize for chicken in alive_chicken_pos: # 치.. 2022. 8. 14.
[백준_7562] 나이트의 이동 python 최소 경로를 탐색해야 하는 문제이므로, dfs가 아닌 bfs를 사용해야 한다. 경로는 step배열을 이용하여 구한다. # 큐 사용 위한 준비 from collections import deque # t 입력 t = int(input()) # n 입력 for _ in range(t): n = int(input()) # 시작 위치 입력 s_x, s_y = map(int, input().split()) # 종료 위치 입력 e_x, e_y = map(int, input().split()) # grid grid = [ [0] * n for _ in range(n) ] # visited visited = [ [0] * n for _ in range(n) ] # step step = [ [0] * n for _ in.. 2022. 8. 13.
[백준_2178] 미로탐색 python 경로를 찾는 데에 bfs를 사용하든 dfs를 사용하든 자기 맘이다. 더 자신있는 것을 사용하는 쪽이 좋다. 그러나 최소 경로를 찾을 때에는 bfs를 사용해야 한다. # n, m 입력 n, m = map(int, input().split()) # maze maze = [ [0] * m for _ in range(n) ] # maze 채우기 for i in range(n): # block 입력받기 block = input() for j in range(len(block)): # 이동할 수 있는 칸은 if block[j] == '1': # 1로 표시 maze[i][j] = 1 # visited visited = [ [0] * m for _ in range(n) ] # step step = [ [0] * m f.. 2022. 8. 12.
[백준_2667] 단지번호붙이기 python 입력 형식에서 띄어쓰기 기준으로 입력을 받으면 큰일난다. 각 줄을 문자열로 입력받아. 이를 정수형으로바꿔 다시 하나하나 넣어주는 과정이 필요하다. # n 입력 n = int(input()) # grid grid = [ [0] * n for _ in range(n) ] # grid 채워넣기 for i in range(n): towns = input() for j in range(len(towns)): grid[i][j] = int(towns[j]) # visited visited = [ [0] * n for _ in range(n) ] # in_range(x, y) def in_range(x, y): return 0 2022. 8. 11.
[백준_1260] DFS와BFS python 오늘 코테 캠프에서 배운 내용이였다. 복습하기에 안성맞춤인 문제였다. 중요 포인트를 정리해보자면, DFS와 BFS를 코테에서 사용할 때는 둘 중 자신있는 것을 사용하면 된다. n이 1000을 넘지 않는 경우에는 2차원 배열로 이를 구현하는 것이 좋으며, 넘을 경우에는 인접 리스트로 이를 구현하는 쪽이 메모리 측면에서 유리하다. DFS는 재귀를 이용해, BFS는 큐(Queue)를 이용하여 구현한다. 최단거리를 구할 때는 BFS와 step 배열을 사용한다. visited의 관리가 중요하다. BFS든 DFS든 먼저 초기 vertex를 호출해주고 시작하는것이 직관적이다. (실수할 가능성이 줄어든다) # n, m, v 입력 n, m, v = map(int, input().split()) # starts, ends.. 2022. 8. 10.
[백준_5215] 지구온난화 python 뭔가 더 잘 풀수 있을 것 같은데,, 확실히 시뮬레이션 단원이 코드가 길게 나오는 것 같다. # r, c 입력 r, c = map(int, input().split()) # grid grid = [ [0] * c for _ in range(r) ] # grid 채워넣기 for i in range(r): a = input() for j in range(len(a)): # 육지는 if a[j] == 'X': # 1로 표시 grid[i][j] = 1 # temp temp = [ [1] * c for _ in range(r) ] # in_range(x, y) def in_range(x, y): return 0 = 3: # 침수 return True # 이하면 살아남음 return False # find_min_.. 2022. 8. 9.