본문 바로가기

전체 글

(148)
[백준/14225/파이썬] 부분수열의 합 소스코드 N = int(input()) seq = list(map(int,input().split())) bf = [False] * 10000000 subsets = [[]] for num in seq: size = len(subsets) for y in range(size): bf[sum(subsets[y]+[num])] = True subsets.append(subsets[y]+[num]) for i in range (1,len(bf)): if bf[i] == False : print(i) break 알고리즘 1. 모든 가능한 부분 수열의 합을 구한다. 2. 존재를 체크하는 list 선언 후 수열의 합이 있으면 True를 선언한다. 3. 1부터 for 문을 돌면서 수열의 합으로 나타내지 못한 애 (F..
[백준/2468/파이썬] 안전영역 - DFS(재귀) 소스코드 import sys sys.setrecursionlimit(100000) N = int(sys.stdin.readline()) area = [list(map(int,sys.stdin.readline().split())) for _ in range(N)] #입력받기 dx = [-1,1,0,0] dy = [0,0,1,-1] def dfs(x,y,h): #범위내 조건을 만족하면 재귀 돌면서 실행 for i in range(4): nx = x + dx[i] ny = y + dy[i] if (0
[백준/7576/파이썬] 토마토 소스코드 from collections import deque m, n = map(int, input().split()) matrix = [list(map(int, input().split())) for _ in range(n)] queue = deque([]) dx, dy = [-1, 1, 0, 0], [0, 0, -1, 1] res = 0 for i in range(n): for j in range(m): if matrix[i][j] == 1: queue.append([i, j]) def bfs(): while queue: x, y = queue.popleft() for i in range(4): nx, ny = dx[i] + x, dy[i] + y if 0
[백준/14500/파이썬] 테트로미노 소스코드 (틀린풀이) from collections import deque N,M = map(int,input().split()) tetro = [] for i in range(N): tetro.append(list(map(int,input().split()))) dx = [-1,1,0,0] dy = [0,0,-1,1] def bfs(x,y): queue = deque() queue.append((x,y)) #시작 지점 queue에 삽입 SUM = tetro[x][y] Max_place = () visited = [(x,y)] for _ in range (3): #테트로미노는 자기포함 4번 움직임 poly = queue.popleft() Max = 0 nlist = [] for i in range(4):..
[백준/16922/파이썬] 로마 숫자 만들기 소스코드 n = int(input().strip()) lst = [] for i in range(n + 1): for j in range(n + 1 - i): for k in range(n + 1 - i - j): t = n - i - j - k total = i * 1 + j * 5 + k * 10 + t * 50 lst.append(total) print(len(set(lst))) 알고리즘 그냥 for문 3번돌리면 되는,,무식한 BF문제로 풀었다. 백트래킹으로 풀어보려 했지만 시간초과가 났다. simple is the best!
[백준/11048/파이썬] 이동하기 - DP 소스코드 n, m = map(int, input().split()) s = [] dp = [[0] * (m + 1) for i in range(n + 1)] for i in range(n): s.append(list(map(int, input().split()))) for i in range(1, n + 1): for j in range(1, m + 1): dp[i][j] = s[i - 1][j - 1] + max(dp[i - 1][j], dp[i][j - 1], dp[i - 1][j - 1]) print(dp[n][m]) 알고리즘 DP는 점화식을 잘 세우면 되는것 같아요~ 이제 슬슬 깨닫게 되는것 같습니다. 1 2 3 6 5 7 7 8 9 12 11 10 이런 입력을 받았을 때 DP 리스트에는 다음과 ..
[백준/12026/파이썬] BOJ거리 소스코드 n = int(input()) boj = list(input()) big = 99999999 dp = [big]*(n) dp[0] = 0 def prev_block(x): if x == 'B': return 'J' elif x == 'O': return 'B' elif x == 'J': return 'O' for i in range(1,n): for j in range(i): if boj[j] == prev_block(boj[i]): dp[i] = min(dp[i],dp[j] + pow(i - j,2)) print(dp[n - 1] if dp[n - 1] != big else -1) 알고리즘 DP문제입니다. 아직 감이 완전히 잡히지는 않은것 같아요,,ㅜㅡㅜ 이번 문제는 B,O,J 순서대로 가면서..
[백준/12869/파이썬] 뮤탈리스크 소스코드 n = int(input()) scv = list(map(int, input().split())) scv.extend([0, 0]) dp = [[[0]*61 for _ in range(61)] for _ in range(61)] dp[scv[0]][scv[1]][scv[2]] = 1 comb = [(9, 3, 1), (9, 1, 3), (3, 9, 1), (3, 1, 9), (1, 9, 3), (1, 3, 9)] for i in range(60, -1, -1): for j in range(60, -1, -1): for k in range(60, -1, -1): if dp[i][j][k] > 0: for c in comb: i_ = i-c[0] if i-c[0] >= 0 else 0 j_ = j-..