본문 바로가기

분류 전체보기

(158)
[백준/11726/파이썬] 2×n 타일링 소스코드 n = int(input()) dp = [0]*(1001) dp[1] = 1 dp[2] = 2 for i in range (3,1001): dp[i] = dp[i-1]+dp[i-2] print(dp[n]%10007) 알고리즘 dp라는걸 알고 풀면 정말 쉬운 문제입니다. 2 - 2 3 - 3 4 - 5 5 - 8 6 - 13 7 - 21 8 - 34 9 - 55 이렇게 n번째 숫자를 구할때는 (n-1번째) + (n-2번째)를 해주면 됩니다. 이제 백준 실버 난이도는 손쉽게 풀 수 있을 것 같다는 자신감을 얻었습니다.
[백준/1182/파이썬] 부분수열의 합 소스코드 from itertools import combinations N,S = map(int,input().split()) seq = list(map(int,input().split())) result = [] cnt = 0 for i in range(len(seq)+1): result = result+list(combinations(seq,i)) del result[0] for i in result: if (sum(i)) == S: cnt += 1 print(cnt) 알고리즘 파이썬의 itertools에 있는 combinations를 이용하여 부분 순열을 구한다. 공집합은 제거한다 합이 S인 개수를 구한다. 기본적인 문제라 시시했다.
[백준/6064/파이썬] 카잉 달력 소스코드 T = int(input()) def sol(m,n,x,y): while x
[백준/3085/파이썬] 사탕게임 - 브루트포스 소스코드 n = int(input()) board = [] ans =0 for _ in range(n): candy = list(map(str,input())) board.append((candy)) def count_candy(board): #개수세는 함수 N = len(board) max_candy = 1 for i in range(N): cnt = 1 for j in range(1,N): if board[i][j] == board[i][j-1]: cnt += 1 else : cnt = 1 if max_candy
[백준/1476/파이썬] 날짜계산 - 브루트포스 소스코드 E,S,M = map(int,input().split()) (ear,sun,moon) = (1,1,1) year = 1 while (ear,sun,moon) != (E,S,M): ear = ear + 1 sun = sun + 1 moon = moon +1 if ear > 15: ear = ear - 15 if sun > 28: sun = sun - 28 if moon > 19: moon = moon - 19 year += 1 print(year) 알고리즘 (1,1,1)에서 하나씩 증가하고 각각의 숫자가 최대치를 넘어가면 빼준다. 종료 조건은 입력값과 같아질때입니다
[백준/1339/파이썬] 단어수학 - 그리디 소스코드 n = int(input()) digit = [0]*26 for _ in range(n): num = list(input().rstrip()) for i in range(len(num)): digit[ord(num[i])-65] += 10 ** (len(num)-i-1) digit.sort(reverse=True) ans = 0 dig = 9 for i in digit: if not i: break ans += i*dig dig -= 1 print(ans) 알고리즘 이 문제는 그리디를 이용하여 풀 수 있는 문제이다. 찾아보니 딕셔너리를 이용한 풀이가 많았는데 입력이 대문자 알파벳이란 특성을 가지고 푸는 풀이가 있어서 힌트를 얻어 풀 수 있었다. ord('A')는 A의 아스키 코드 65를 나타내어..
[백준/1107/파이썬] 리모컨 - Brute force 소스코드 target = int(input()) ans = abs(100 - target) M = int(input()) if M: broken = set(input().split()) else: broken = set() for num in range(1000001): for N in str(num): if N in broken: break else: ans = min(ans, len(str(num)) + abs(num - target)) print(ans) 알고리즘 가능한 숫자 조합을 생각하여 문제를 푸려고 했는데 런타임에러가 자꾸 나서 다른 사람의 풀이를 참고했는데 그냥 무식하게 쭉 브루트 포스 알고리즘을 사용하여 풀면 되는 문제였다. 단순한게 또 먹히는 문제도 있는 걸 깨달았다.
[백준/1463/파이썬] 1로 만들기 - DP 소스코드 x = int(input()) dp = [0]*(x+1) dp[1] = 0 for i in range(2,x+1): dp[i] = dp[i-1] + 1 if i % 3 == 0: dp[i] = min(dp[i], dp[i // 3] + 1) if i % 2 == 0: dp[i] = min(dp[i], dp[i // 2] + 1) print(dp[x]) 알고리즘 DP문제는 많이 풀어봐서 이번 문제는 그리 어렵지는 않았다. 1이 되기 위해서 필요한 연산의 숫자를 구하는 것 이다. 2,3은 1에 2배,3배를 하면 된다. 4는 2까지 걸린 연산 횟수의 1번 더(2배) 하면 된다. 5는 4까지의 연산에 1번더(+1) 6은 2까지의 연산에 1번더(*2) 최소 횟수에 대해 전에 걸 불러와서 연산해 나가는 방..