ALGORITHMS (15) 썸네일형 리스트형 백준 2468 - 안전영역 import sys sys.setrecursionlimit(10000) dx = [-1,1,0,0] dy = [0,0,-1,1] def DFS(x,y,height): global count VIS[x][y] = True if GRAPH[x][y] > height: count+=1 #GRAPH[x][y] = -1 for i in range(4): nx = x + dx[i] ny = y + dy[i] if 0 height and VIS[i][j] == False: DFS(i,j,height) NUM_HOUSE_PER_COMPONENT.append((height,count)) #print(NUM_HOUSE_PER_COMPONENT) ANS.append(len(NUM_HOUSE_PER_COMPONENT)) #p.. when to BFS vs DFS BFS - 최단경로/미로찾기 --> 거리 구할때 GRAPH[nx][ny] = GRAPH[x][y] + 1 업데이트 --> return GRAPH[N-1][M-1] inside WHILE loop - BFS로 모든 노드 방문하는 법 --> nested for loop and call BFS() - Good time complexity but bad space complexity DFS - 완전탐색 (Brute Force Search All) - 조합/순열 --> 모든 경우의 수 [모든 노드 방문] - BACKTRACKING (with some condition) - Good space complexity but bad time complexity (recursion & must visit all nodes) BFS vs DFS [adj. matrix] * USE DEQUE instead of queue # BFS vs DFS [adj matrix] # https://sexy-developer.tistory.com/54 #1. BFS ------------------------------------------------------------------------------------- def bfs(graph, start): visited = [False] * len(graph) answer = [] queue = [start] visited[start] = True while queue: node = queue.pop(0) answer.append(node) for i in range(len(graph[node])): if graph[node][i] .. BFS vs DFS [adj. list] from collections import deque #1. ADJACENCY MATRIX REPRESENTATION --> MUST SORT FIRST WHEN CONSTRUCTING GRAPH 2. USE DEFAULT DICT #2. DFS --> STACK or RECURSION #3. BFS --> QUEUE (DEQUE) --> CANNOT USE RECURSION #4. APPEND (for adj in node[cur]) vs EXTEND (no looping required) graph1 = { 'A': ['B'], 'B': ['A', 'C', 'H'], 'C': ['B', 'D'], 'D': ['C', 'E', 'G'], 'E': ['D', 'F'], 'F': ['E'], 'G': ['.. BACKTRACKING 1. BACKTRACKING ==> DFS (Constraints ) 2. BRANCHING ==> BFS https://www.youtube.com/watch?v=DKCbsiDBN6c&list=PLDN4rrl48XKpZkf03iYFl-O29szjTrs_O&index=63 프로그래머스 LEVEL3: 베스트앨범 문제 설명 스트리밍 사이트에서 장르 별로 가장 많이 재생된 노래를 두 개씩 모아 베스트 앨범을 출시하려 합니다. 노래는 고유 번호로 구분하며, 노래를 수록하는 기준은 다음과 같습니다. 속한 노래가 많이 재생된 장르를 먼저 수록합니다. 장르 내에서 많이 재생된 노래를 먼저 수록합니다. 장르 내에서 재생 횟수가 같은 노래 중에서는 고유 번호가 낮은 노래를 먼저 수록합니다. 노래의 장르를 나타내는 문자열 배열 genres와 노래별 재생 횟수를 나타내는 정수 배열 plays가 주어질 때, 베스트 앨범에 들어갈 노래의 고유 번호를 순서대로 return 하도록 solution 함수를 완성하세요. 제한사항 genres[i]는 고유번호가 i인 노래의 장르입니다. plays[i]는 고유번호가 i인 노래가 재생된 횟수입니.. 프로그래머스 Level2 - 거리두기 확인하기 거리두기 확인하기 문제 설명 개발자를 희망하는 죠르디가 카카오에 면접을 보러 왔습니다. 코로나 바이러스 감염 예방을 위해 응시자들은 거리를 둬서 대기를 해야하는데 개발 직군 면접인 만큼 아래와 같은 규칙으로 대기실에 거리를 두고 앉도록 안내하고 있습니다. 1. 대기실은 5개이며, 각 대기실은 5x5 크기입니다. 2. 거리두기를 위하여 응시자들 끼리는 맨해튼 거리1가 2 이하로 앉지 말아 주세요. 3. 단 응시자가 앉아있는 자리 사이가 파티션으로 막혀 있을 경우에는 허용합니다. 예를 들어, 5개의 대기실을 본 죠르디는 각 대기실에서 응시자들이 거리두기를 잘 기키고 있는지 알고 싶어졌습니다. 자리에 앉아있는 응시자들의 정보와 대기실 구조를 대기실별로 담은 2차원 문자열 배열 places가 매개변수로 주어집니.. 코드업 1467 - 2차원 배열 n, m = 3,4 10 7 4 1 11 8 5 2 12 9 6 3 n, m = 4,5 17 13 9 5 1 18 14 10 6 2 19 15 11 7 3 20 16 12 8 4 r,c = map(int,input().split()) GRAPH = [[0]*c for _ in range(r)] count = 0 for i in reversed(range(c)): # bigger loop going left for j in range(r): # smaller loop going down count += 1 GRAPH[j][i] = count # [j] to fill columm, [i] to fill row for i in GRAPH: print(*i) 백준 1931 - 달팽이 배열 n = 5 25 10 11 12 13 24 9 2 3 14 23 8 1 4 15 22 7 6 5 16 21 20 19 18 17 n = 7 import numpy as np n = 7 GRAPH = [[0]*n for _ in range(n)] r,c = 0,0 dist = 0 dr = [1,0,-1,0] # 하,우,상,좌 dc = [0,1,0,-1] for i in range(n*n,0,-1): GRAPH[r][c] = i r+=dr[dist] c+=dc[dist] # BOUNDARY CHECKING --> if GRAPH[r][c] != 0, done with outer boundary (ie. "26", "10", "2" if r = n or c = n or GR.. 프로그래머스 - 더 맵게 (Heap) 문제 설명 매운 것을 좋아하는 Leo는 모든 음식의 스코빌 지수를 K 이상으로 만들고 싶습니다. 모든 음식의 스코빌 지수를 K 이상으로 만들기 위해 Leo는 스코빌 지수가 가장 낮은 두 개의 음식을 아래와 같이 특별한 방법으로 섞어 새로운 음식을 만듭니다. 섞은 음식의 스코빌 지수 = 가장 맵지 않은 음식의 스코빌 지수 + (두 번째로 맵지 않은 음식의 스코빌 지수 * 2) Leo는 모든 음식의 스코빌 지수가 K 이상이 될 때까지 반복하여 섞습니다. Leo가 가진 음식의 스코빌 지수를 담은 배열 scoville과 원하는 스코빌 지수 K가 주어질 때, 모든 음식의 스코빌 지수를 K 이상으로 만들기 위해 섞어야 하는 최소 횟수를 return 하도록 solution 함수를 작성해주세요. 제한 사항 scovil.. 프로그래머스 기능개발 (스택/큐) 문제 설명 프로그래머스 팀에서는 기능 개선 작업을 수행 중입니다. 각 기능은 진도가 100%일 때 서비스에 반영할 수 있습니다. 또, 각 기능의 개발속도는 모두 다르기 때문에 뒤에 있는 기능이 앞에 있는 기능보다 먼저 개발될 수 있고, 이때 뒤에 있는 기능은 앞에 있는 기능이 배포될 때 함께 배포됩니다. 먼저 배포되어야 하는 순서대로 작업의 진도가 적힌 정수 배열 progresses와 각 작업의 개발 속도가 적힌 정수 배열 speeds가 주어질 때 각 배포마다 몇 개의 기능이 배포되는지를 return 하도록 solution 함수를 완성하세요. 제한 사항 작업의 개수(progresses, speeds배열의 길이)는 100개 이하입니다. 작업 진도는 100 미만의 자연수입니다. 작업 속도는 100 이하의 자.. 백준 2667 - 단지번호 붙이기 문제 과 같이 정사각형 모양의 지도가 있다. 1은 집이 있는 곳을, 0은 집이 없는 곳을 나타낸다. 철수는 이 지도를 가지고 연결된 집의 모임인 단지를 정의하고, 단지에 번호를 붙이려 한다. 여기서 연결되었다는 것은 어떤 집이 좌우, 혹은 아래위로 다른 집이 있는 경우를 말한다. 대각선상에 집이 있는 경우는 연결된 것이 아니다. 는 을 단지별로 번호를 붙인 것이다. 지도를 입력하여 단지수를 출력하고, 각 단지에 속하는 집의 수를 오름차순으로 정렬하여 출력하는 프로그램을 작성하시오. 입력 첫 번째 줄에는 지도의 크기 N(정사각형이므로 가로와 세로의 크기는 같으며 5≤N≤25)이 입력되고, 그 다음 N줄에는 각각 N개의 자료(0혹은 1)가 입력된다. 출력 첫 번째 줄에는 총 단지수를 출력하시오. 그리고 각 .. 백준 2178 - 바이러스 문제 N×M크기의 배열로 표현되는 미로가 있다. 1 0 1 1 1 1 1 0 1 0 1 0 1 0 1 0 1 1 1 1 1 0 1 1 미로에서 1은 이동할 수 있는 칸을 나타내고, 0은 이동할 수 없는 칸을 나타낸다. 이러한 미로가 주어졌을 때, (1, 1)에서 출발하여 (N, M)의 위치로 이동할 때 지나야 하는 최소의 칸 수를 구하는 프로그램을 작성하시오. 한 칸에서 다른 칸으로 이동할 때, 서로 인접한 칸으로만 이동할 수 있다. 위의 예에서는 15칸을 지나야 (N, M)의 위치로 이동할 수 있다. 칸을 셀 때에는 시작 위치와 도착 위치도 포함한다. 입력 첫째 줄에 두 정수 N, M(2 ≤ N, M ≤ 100)이 주어진다. 다음 N개의 줄에는 M개의 정수로 미로가 주어진다. 각각의 수들은 붙어서 입력.. 백준 2178 - 미로탐색 (BFS) 문제 N×M크기의 배열로 표현되는 미로가 있다. 1 0 1 1 1 1 1 0 1 0 1 0 1 0 1 0 1 1 1 1 1 0 1 1 미로에서 1은 이동할 수 있는 칸을 나타내고, 0은 이동할 수 없는 칸을 나타낸다. 이러한 미로가 주어졌을 때, (1, 1)에서 출발하여 (N, M)의 위치로 이동할 때 지나야 하는 최소의 칸 수를 구하는 프로그램을 작성하시오. 한 칸에서 다른 칸으로 이동할 때, 서로 인접한 칸으로만 이동할 수 있다. 위의 예에서는 15칸을 지나야 (N, M)의 위치로 이동할 수 있다. 칸을 셀 때에는 시작 위치와 도착 위치도 포함한다. 입력 첫째 줄에 두 정수 N, M(2 ≤ N, M ≤ 100)이 주어진다. 다음 N개의 줄에는 M개의 정수로 미로가 주어진다. 각각의 수들은 붙어서 입력.. 백준 10808 - 알파벳 개수 문제 알파벳 소문자로만 이루어진 단어 S가 주어진다. 각 알파벳이 단어에 몇 개가 포함되어 있는지 구하시오. Input baekjoon Output 1 1 0 0 1 0 0 0 0 1 1 0 0 1 2 0 0 0 0 0 0 0 0 0 0 0 My Code from collections import defaultdict import string s = input() def solution(s): ans = [] dic = dict(zip(string.ascii_lowercase,[0]*26)) for c in s: dic[c] += 1 for i in dic.values(): ans.append(i) return ans ans = solution(s) for i in ans: print(i, end = '.. 이전 1 다음