본문 바로가기

컴퓨터/코테

카카오 매출하락 최소화 - 트리 dp 처음 접해본 트리 dp 문제.. https://www.acmicpc.net/problem/2533 2533번: 사회망 서비스(SNS) 첫 번째 줄에는 친구 관계 트리의 정점 개수 N이 주어진다. 단, 2 ≤ N ≤ 1,000,000이며, 각 정점은 1부터 N까지 일련번호로 표현된다. 두 번째 줄부터 N-1개의 줄에는 각 줄마다 친구 관계 트리의 에 www.acmicpc.net 이 문제로 연습한번 하고 바로 들어갔다. import sys def solution(sales, links): def dfs(cur): check[cur] = False dp[cur][0] = 0 # 선택 안할경우 dp[cur][1] = sales[cur-1] # 선택 할경우 for i in tree[cur]: if check[i].. 더보기
백준 5569, 11726 - 출근 경로, 2xn 타일링 [dp] """ 백준 5569 """ w, h = map(int, input().split()) dp = [[[[0 for __ in range(2)] for _ in range(2)] for j in range(w)] for i in range(h)] for i in range(1,w): dp[0][i][1][0] = 1 for i in range(1,h): dp[i][0][1][1] = 1 # 0 0 회전 불가능 가로로 # 1 1 회전 가능 세로로 for i in range(1, h): for j in range(1,w): dp[i][j][0][0] = dp[i][j-1][1][1] dp[i][j][0][1] = dp[i-1][j][1][0] dp[i][j][1][0] = dp[i][j-1][0][0] + d.. 더보기
백준 7576 - 토마토 import sys from collections import deque input = sys.stdin.readline M, N = map(int, input().split()) arr = [list(map(int, input().split())) for _ in range(N)] dir = [ [1,0], [-1,0], [0,1], [0,-1] ] tomatoes = deque([]) for i in range(N): for j in range(M): if arr[i][j] == 1: tomatoes.append([i,j]) while tomatoes: y,x = tomatoes.popleft() nextVal = arr[y][x] + 1 for d in dir: ny = y + d[0] nx = x.. 더보기
프로그래머스 여행경로 - 백트래킹 def dfs(ans, routes, pointNum, answer, isFinished): if len(ans) == pointNum: if not isFinished[0]: for i in ans: answer.append(i) isFinished[0] = True return nexts = isPossible(ans[-1], routes) for next in nexts: if not isFinished[0]: next[1] = True ans.append(next[0]) dfs(ans, routes, pointNum, answer, isFinished) # 티켓 사용여부 False로 돌려놓음 next[1] = False ans.pop() def isPossible(start, routes): re.. 더보기
릿코드 37- Sudoku Solver, nQueen 다시풀기 def dfs(board, empty, count): global isEnd if count == len(empty): for i in board: print(i) isEnd = True return y,x = empty[count] nums = possible(board, y, x) for num in nums: if not isEnd: board[y][x] = num dfs(board, empty, count+1) board[y][x] = 0 def possible(board, y, x): nums = [True for i in range(10)] for i in range(9): nums[board[y][i]] = False nums[board[i][x]] = False y = (y//3) * 3 .. 더보기
nQueen - 백트래킹 def dfs(positions, row) : n = len(positions) if n == row: #끝까지 왔으므로 1 return 1 count = 0 for col in range(n) : positions[row] = col if check(positions, row): count += dfs(positions, row + 1) return count def check(pos, row) : for i in range(row): if pos[i] == pos[row] or (row-i == abs(pos[i] - pos[row])): return False return True def solution(n): ans = [0] * n return dfs(ans, 0) # 1~12까지 for i i.. 더보기
백준 2042 세그먼트 트리 import sys N, M, K = map(int, input().split()) nums = [0] + [int(sys.stdin.readline()) for _ in range(N)] position = [0 for _ in range(N+1)] orders = [list(map(int, sys.stdin.readline().split())) for _ in range(M+K)] arr = [0] * 4 * N def init(start = 1, end = N, index = 1): if start == end : arr[index] = nums[start] position[start] = index return arr[index] mid = (start + end) // 2 arr[index] =.. 더보기
백준 17114 - 미세먼지 확산 빡구현 문제였다. 카카오 기출 카드짝 맞추기도 그렇고 이번문제도 그렇고 이것저것 많이 풀어보다보니 확실히 구현문제 실력이 성장한 것 같다. def spread(arr, height, width, cleaner) : spreadList = [] direction = { 0:[0,-1], 1:[0,1], 2:[-1,0], 3:[1,0] } newArr = [[ 0 for _ in range(width)] for i in range(height)] newArr[cleaner[0]][0] = -1 newArr[cleaner[1]][0] = -1 for y in range(height): for x in range(width): if arr[y][x] == -1 : continue if arr[y][x] != 0.. 더보기
백준 11657 타임머신 INF = int(1e9) def solution() : for i in range(node): for s,e,v in edgeArr: if dist[s] != INF and dist[e] > dist[s] + v : dist[e] = dist[s] + v if i == node-1: return True return False node, edge = map(int, input().split()) edgeArr = [] dist = [INF] * (node + 1) dist[1] = 0 for i in range(edge) : edgeArr.append(list(map(int,input().split()))) if solution() : print(-1) else : for i in range(2, no.. 더보기
카카오 기출 - 카드 뒤집기 from itertools import permutations def movePosition(start, end, board): startY, startX = start endY, endX = end cnt = 0 # 가로먼저 이동 if startX < endX: if endX - startX == 1: cnt += 1 elif endX - startX == 2: if board[startY][startX + 1] != 0: cnt += 2 elif endX == 3: cnt += 1 elif board[startY][endX] != 0: cnt += 1 elif board[startY][endX] == 0: cnt += 2 elif endX - startX == 3: for i in range(1, 4.. 더보기