본문 바로가기

Problem Solving/Baekjoon Online Judge

(13)
[BOJ/백준] 4386번 별자리 만들기 | 최소 신장 트리 | 파이썬 문제 설명 문제 풀이 모든 별은 서로 직/간접적으로 이어져 있어야 하고, 별자리를 만드는 최소 비용을 구해야 한다고 해서 그래프 문제, 그중 최소 신장 트리 알고리즘을 사용하는 문제라고 생각했다. * 신장 트리(Spanning Tree): 하나의 그래프에서 모든 노드를 포함하면서 사이클이 존재하지 않는 부분 그래프. 최소 신장 트리는 신장 트리 중에서도 최소 비용으로 만들 수 있는 신장 트리를 찾는 알고리즘이다. 최근에 이코테에서 크루스칼 알고리즘에 대해 공부했기 때문에 이를 적용해보기로 했다! 크루스칼 알고리즘(Kruskal Algorithm)의 과정은 다음과 같다. 1) 간선 데이터 오름차순으로 정렬하기 2) 간선을 확인하며 2-1) 사이클이 만들어지면 pass 2-2) 사이클이 만들어지지 않으면 최..
[BOJ/백준] 5014번 스타트링크 | BFS | 파이썬 문제 풀이 from collections import deque F, S, G, U, D = map(int, input().split()) visited = [0] * (F + 1) def bfs(visited, v): queue = deque([v]) dx = [U, - D] while queue: x = queue.popleft() if x == G: break for i in range(len(dx)): # 해당하는 층이 없을 때 움직이지 않는다 if dx[i] == 0: continue nx = x + dx[i] if 0 역시 엘리베이터 버튼을 누르지 않아도 된다(반복문에서 continue) 5014번: 스타트링크 첫째..
[BOJ/백준] 10799번 쇠막대기 | 스택 | 파이썬 문제 풀이 import sys def cutIron(bar): stack = [] cnt = 0 for i in range(len(bar)): if bar[i] == '(': stack.append('(') elif bar[i] == ')': if bar[i-1] == '(': stack.pop() cnt += len(stack) else: stack.pop() cnt += 1 return cnt bar = list(sys.stdin.readline()) print(cutIron(bar)) 스택 자료구조를 사용한 문제. 입력으로 받은 문자열을 리스트 bar로 바꿔 쇠막대기 개수를 세는 함수 cutIron에 넣었다. bar의 길이만큼 반복문을 수행한다. 1) bar[i] 값이 '('이면 쇠막대기의 시작을 ..
[BOJ/백준] 2630번 색종이 만들기 | 분할정복 | 파이썬 문제 풀이 import sys def cutPaper(x, y, n): # x,y좌표와 색종이 크기 global cnt_white, cnt_blue print(x, y, n) for i in range(x, x+n): for j in range(y, y+n): if paper[x][y] != paper[i][j]: cutPaper(x, y, n//2) cutPaper(x, y+n//2, n//2) cutPaper(x+n//2, y, n//2) cutPaper(x+n//2, y+n//2, n//2) return # 호출한 함수는 중복되지 않도록 종료시킴 if paper[x][y] == 1: cnt_blue += 1 else: cnt_white += 1 n = int(input()) paper = [list..
[BOJ/백준] 5430번 AC | 덱 | 파이썬 문제 풀이 import sys from collections import deque T = int(sys.stdin.readline()) for _ in range(T): func = list(sys.stdin.readline().rstrip()) n = int(sys.stdin.readline()) queue = deque(sys.stdin.readline().rstrip()[1:-1].split(",")) if n == 0: queue = deque() error = False cnt_R = 0 for i in range(len(func)): if func[i] == 'D': if queue: if cnt_R % 2 == 1: queue.pop() else: queue.popleft() else: e..
[BOJ/백준] 1874번 스택 수열 | 파이썬 문제 풀이 import sys n = int(input()) target = [int(sys.stdin.readline().strip()) for _ in range(n)] stack = [] res = [] for i in range(1, n+1): stack.append(i) res.append('+') while stack and target: if stack[-1] == target[0]: stack.pop() res.append('-') del target[0] else: break if target: print('NO') else: for i in range(len(res)): print(res[i]) 1부터 n까지의 수로 입력된 수열을 만드는 문제. sys.stdin.readline().st..
[BOJ/백준] 10828번 스택 | 파이썬 (🌠sys.stdin.readline으로 시간 초과 해결) 문제 풀이 import sys n = int(sys.stdin.readline()) stack = [] for i in range(n): cmd = sys.stdin.readline().strip() if 'push' in cmd: stack.append(cmd[5:]) elif cmd == 'pop': if len(stack) == 0: print(-1) else: print(stack.pop()) elif cmd == 'size': print(len(stack)) elif cmd == 'empty': if len(stack) == 0: print(1) else: print(0) elif cmd == 'top': if len(stack) == 0: print(-1) else: print(stack[-1..
[BOJ/백준] 1697번 숨바꼭질 | BFS | 파이썬 문제 풀이 from collections import deque def bfs(start, end): queue = deque() queue.append(start) while queue: x = queue.popleft() if x == end: return visited[x] for nx in (x-1, x+1, x*2): if 0