Blocking / Non-BlockingBlocking: 자신의 작업을 진행하다가 다른 주체의 작업이 시작되면 다른 작업이 끝날 때까지 기다렸다가 자신의 작업을 시작하는 것 Non-Blocking: 다른 주체의 작업에 관련없이 자신의 작업을 하는 것 → 다른 주체가 작업을 할 때 자신에게 제어권이 있는지 없는지. 제어의 관점. 제어권의 유무 Sync / AsyncSync: 동기. 끝나는 동시에 시작한다. 함수의 종료 시점과 결과값을 전달하는 시점이 동일하다. Async: 비동기. 끝나는 동시에 시작하지 않는다. 함수의 종료 시점과 결과값을 전달하는 시점이 일치하지 않는다. → 순서와 결과(처리)의 관점. 결과의 관심 유무 💡 Blocking == Sync, Non-Blocking == Async ??..
🗂️ 문제링크: https://www.acmicpc.net/problem/10026 💡 접근법적록색약인 경우 R과 G를 같은 색으로 취급한다.따라서 BFS를 일반 BFS와 적록색약을 처리하는 BFS 두 함수를 정의하고, 적록색약을 처리하는 BFS 함수에서(color == "R" or color == "G") and (maps[nx][ny] == "R" or maps[nx][ny] == "G") 조건을 통해 R과 G를 같은 색으로 처리한다. 아니면, 적록색약용 맵(R을 모두 G로 변경)을 따로 생성하여 정상인을 처리할 때와 동일한 BFS를 사용할 수도 있다. 😎 내 코드(1) 적록색약 유무에 따른 BFS 함수 분리import sysfrom collections import dequeN = int(sy..
🗂️ 문제https://www.acmicpc.net/problem/2468 💡 접근법영역의 최대 높이를 구한 뒤 0부터 최대높이까지 모든 경우에 대해 안전한 영역의 수를 센다. 이때 안전한 영역의 수를 세기 위해 DFS나 BFS를 통해 지도를 탐색하여 특정 높이보다 해당 영역의 높이가 높다면(maps[nx][ny] > m) 탐색을 계속한다. 그리고 최종적으로 영역의 개수의 최댓값을 출력한다. 또한, 상하좌우로 이어진 것을 하나의 영역으로 보기 때문에 BFS를 썼을 경우에 성능을 더 최적화할 수 있다. 😎 내 코드import syssys.setrecursionlimit(10**6)N = int(sys.stdin.readline())maps = []max_value = 0for _ in range(N)..
🗂️ 문제링크: https://www.acmicpc.net/problem/4963 💡 접근법섬의 개수를 세기 위해 DFS를 통해 탐색한다.이때 상하좌우뿐만 아니라 대각선으로 연결되어 있어도 하나의 섬으로 본다. 따라서 이를 고려하여 탐색해야 한다. 또한 파이썬의 최대 재귀 깊이가 1000이므로 의도적으로 깊이를 늘려줘야 한다. 그렇지 않으면 RecursionError가 발생한다. 😎 내 코드import syssys.setrecursionlimit(10**6)dx = [0, 0, -1, 1, 1, 1, -1, -1] # 상하좌우 + 대각선dy = [1, -1, 0, 0, 1, -1, 1, -1]def DFS(y, x): visited[y][x] = True for ax, ay in zi..
🗂️ 문제링크: https://school.programmers.co.kr/learn/courses/30/lessons/43105 프로그래머스SW개발자를 위한 평가, 교육, 채용까지 Total Solution을 제공하는 개발자 성장을 위한 베이스캠프programmers.co.kr 💡 접근법DP의 top-down 방식으로 풀었다.triangle을 모두 탐색하면서 값을 업데이트 해나갔다. 현재 위치까지 도달하는 모든 경로 중 최댓값을 저장해야 한다. 따라서 위의 칸의 대각선 두 값 중 더 큰 값을 선택하여 더한다. 만약 대각선에 값이 존재하지 않는다면, 이는 삼각형의 범위를 벗어난 것이므로 이를 따로 처리해야 한다. 점화식은 dp[i][j] = dp[i-1][j-1] + dp[i-1][j] (i>=1, ..
🗂️ 문제링크: https://school.programmers.co.kr/learn/courses/30/lessons/42898# 프로그래머스SW개발자를 위한 평가, 교육, 채용까지 Total Solution을 제공하는 개발자 성장을 위한 베이스캠프programmers.co.kr 🚀 시행착오def solution(m, n, puddles): # m: 열, n: 행 answer = 0 dict = {} # key: 경로, value: 경로 개수 visited = [[False] * (m+1) for _ in range(n+1)] dx = [0, 1] # 아래쪽, 오른쪽 dy = [1, 0] def DFS(y, x, cnt): visi..
🗂️ 문제링크: https://school.programmers.co.kr/learn/courses/30/lessons/42746# 💡 접근법주어진 숫자 리스트를 이어붙여 만들 수 있는 모든 경우의 수를 탐색하면 시간 초과가 발생한다. 따라서 문자열 정렬을 활용해 가장 큰 수를 만들어야 한다. 문자열 정렬의 특성- 문자열 정렬은 숫자의 크기나 자릿수와 상관없이 문자 순서대로 사전식 정렬된다.- 문자열의 길이가 다를 때, 더 짧은 문자열은 사전식 정렬에서 먼저 온다. ex) "1"과 "10"을 비교하면, "1"이 "10"의 부분 문자열이므로 "1"이 "10"보다 앞에 정렬된다. 올바른 정렬을 수행하기 위해 자릿수를 맞춰서 비교해야 한다.문자열 정렬은 사전식 정렬로 수행되므로, 이는 [1, 10] ..
🗂️ 문제링크: https://www.acmicpc.net/problem/2606 💡 접근법1번 컴퓨터가 웜 바이러스에 걸렸고, 이와 네트워크 상에 연결된 모든 컴퓨터가 바이러스에 걸리게 된다. 따라서 1번과 연결된 노드의 개수를 구하면 되는 문제이다. DFS, BFS 두 가지 방식으로 모두 해결 가능하며, 아래는 DFS를 통해 푼 코드이다.연결된 노드에 대해 방문처리를 해주므로, 최종적으로는 방문처리가 된 노드의 개수에서 1번 노드를 빼주면 된다. 😎 내 코드import sysN = int(sys.stdin.readline())K = int(sys.stdin.readline())graph = [[] for _ in range(N+1)]visited = [False] * (N+1)for _ in r..