본문 바로가기
728x90

백준 풀이103

[백준/BOJ] - 2668번 python 풀이 - DFS 1. 꼬리잡기 문제이다.(사이클 문제) 2. 꼬리를 잡았을 경우 idx 집합과 val 집합이 동일한지 여부를 확인하여 해당할 경우 최종 결과 집합에 넣어준다. 3. 꼬리를 잡았는데 idx 집합과 val 집합이 동일하지 않으면 실패한 경우이므로 False를 반환하여 함수를 탈출한다. 4. 꼬리를 잡지 못한 상황에선 재귀적으로 dfs 함수를 호출한다. 5. 메인 함수 쪽에서는 result 집합에 target element가 없을 경우 해당 element의 dfs 함수를 호출한다. *아스테리크를 활용하여 최종 결과 값을 출력한다. 구분자는 '\n'을 사용한다. separate import sys sys.setrecursionlimit(1000000) n = int(input()) arr = [0] #0번 id.. 2023. 3. 5.
[백준/BOJ] - 1245번 python 풀이 - DFS 문제 자체가 이해가 안 가 블로그를 참고해 분석한 문제 1. 주변 산봉우리보다 커야 한다. -> 주변 산봉우리가 더 크면 trigger을 false로 2. 같은 높이의 산봉우리는 산봉우리 취급 -> 탐색하며 같은 높이의 산봉우리는 방문처리 해버린다. import sys sys.setrecursionlimit(10 ** 6) # dfs 탐색 def dfs(a, b): # 상/하/좌/우/대각선 확인 dx = [1, -1, 0, 0, 1, 1, -1, -1] dy = [0, 0, 1, -1, 1, -1, -1, 1] # 산봉우리인지 체크 global trigger # 탐색 체크 visited[a][b] = True # 8가지 방향 탐색 for i in range(8): x = a + dx[i] y = b + .. 2023. 3. 1.
[백준/BOJ] - 1743번 python 풀이 - DFS 1. 배열의 크기를 입력받고 해당하는 값들을 모두 0으로 초기화 한다. 2. 다음 쓰레기를 1로 설정해놓는다. 3. 2중 for문을 돌리며 탐색을 시작한다. 4. 쓰레기를 방문했을 경우 0으로 변경하여 다시 되돌아가는 경우가 없도록 한다. 5. 주어진 쓰레기 좌표는 0 좌표가 없다고 생각하고 진행하기 때문에 리스트로 표현하는 특성상 해당 좌표에서 x,y 좌표를 각각 -1씩 연산하여 쓰레기 좌표를 정정해준다. import sys input= sys.stdin.readline sys.setrecursionlimit(1000000) storage = [] cnt = 0 dx,dy = (-1,1,0,0),(0,0,-1,1) def dfs(x,y): global cnt cnt += 1 arr[x][y] = 0 f.. 2023. 2. 28.
[백준/BOJ] - 11725번 python 풀이 - DFS 1. 방문 여부 확인 노드를 true, false로 정하지 말고 0으로 기본값을 정해 놓고 그래프 탐색하며 해당 노드를 방문했을 경우 그의 부모 노드를 해당 visited 값에 등록해준다. 2. 스타트는 항상 1번부터 시작해야 하므로 dfs(1)을 한번 호출해준다. 3. 순차적으로 탐색되는 노드를 기반으로 재귀적 호출을 진행한다. import sys sys.setrecursionlimit(100000) input = sys.stdin.readline n= int(input()) arr= [[] *0 for i in range(n+1)] #n이 7이면 7까지 0~7 visited = [0] * (n+1) #8개 만들기 0~7 def dfs(s): for i in arr[s]: if visited[i] ==.. 2023. 2. 27.
[백준/BOJ] - 2210번 python 풀이 - DFS 1. 숫자판에서 상하좌우로 이동하며 6자리의 수를 완성시키는 것이기 때문에 탐색 문제이다. 2. 만들 수 있는 6자리의 수가 겹칠 가능성이 있으므로 이는 중복된 값을 허용하지 않는 set 자료형을 통해 해결한다. 3. input 받을 때 str형으로 입력받고 숫자 판에 있는 값들을 문자열 + 을 통해 합쳐주고 이를 set 자료형에 저장시켜 겹치는 값들을 예외처리한다. #모든 위치에서 시작할 수 있게 반복문 세팅 #set으로 겹치는 것들 없애 #문자열로 ㄱㄱ import sys input = sys.stdin.readline sys.setrecursionlimit(100000) dx,dy = (-1,1,0,0),(0,0,-1,1) s1 = set([]) def dfs(x,y, number): number .. 2023. 2. 27.
[백준/BOJ] - 15810번 python 풀이 - 이분탐색 Key Point 이분탐색으로 해결함 left를 1으로 두고 - 걸리는 시간은 자연수 이므로 right를 풍선이 나누어 떨어지지 않고(그래서+1 해줌) 가장 느리게 부는 스태프가 다 불 경우 mid값은 시간 이므로 해당 시간을 스태프의 풍선 부는 시간으로 나누어 주며 해당 값(mid)의 최솟값을 구하는 과정이다. # min(arr) ~ 1000000 # mid값으로 각 스태프 풍선 부는 시간을 나눈 몫의 합이 M이랑 같으면 import sys input = sys.stdin.readline n,m = map(int, input().split()) arr = list(map(int, input().split())) #1 start left = 1 #풍선이 나누어 떨어지지 않고(그래서 +1 해줌) 가장 느리.. 2023. 2. 1.
728x90