본문 바로가기

Computer Science/Algorithm

(117)
BOJ 11057: 오르막 수 (+중복조합 야매) 하... 이 문제를 보고 참아버리지 못했다. 물론 지금 컴퓨터 공부를 하고 있지만, 수학적으로 문제를 봐버리고 나니 다른 해답으로 풀기가 싫어진다. 문제부터 보자. 이 문제를 보고 dynamic programming으로 풀까라는 생각이 1초정도 났지만, 바로 확률과 통계에서 나오는 중복조합 H가 생각났다. 딱 중복 가능한, 순서 따져야 하는.... 중복조합 아닌가! 이걸로 풀었다. import math n=int(input()) print((math.factorial(9+n)//(math.factorial(9)*math.factorial(n)))%10007) 하지만, 코더의 본분은 코딩이거늘... dp로 마지막 자리로 index 잡고, 하나씩 늘려주면 된다! 하하 수학 1승.!
BOJ 11053: 가장 긴 증가하는 부분 수열 https://www.acmicpc.net/problem/11053 11053번: 가장 긴 증가하는 부분 수열 수열 A가 주어졌을 때, 가장 긴 증가하는 부분 수열을 구하는 프로그램을 작성하시오. 예를 들어, 수열 A = {10, 20, 10, 30, 20, 50} 인 경우에 가장 긴 증가하는 부분 수열은 A = {10, 20, 10, 30, 20, 50} 이 www.acmicpc.net 오늘의 문제다! 우선 실패한 코드부터 올려보려고 한다. n=int(input()) data=list(map(int,input().split())) streak=[1]*n pastScore=data for i in range(n): for j in range(0,i): if data[i] > pastScore[j]: st..
BOJ 11053: 가장 긴 증가하는 부분 수열 https://www.acmicpc.net/problem/11053 11053번: 가장 긴 증가하는 부분 수열 수열 A가 주어졌을 때, 가장 긴 증가하는 부분 수열을 구하는 프로그램을 작성하시오. 예를 들어, 수열 A = {10, 20, 10, 30, 20, 50} 인 경우에 가장 긴 증가하는 부분 수열은 A = {10, 20, 10, 30, 20, 50} 이 www.acmicpc.net 오늘의 문제다! 우선 실패한 코드부터 올려보려고 한다. n=int(input()) data=list(map(int,input().split())) streak=[1]*n pastScore=data for i in range(n): for j in range(0,i): if data[i] > pastScore[j]: st..
BOJ 11052: 카드 구매하기 안녕하세요! 23살 무니화니로 찾아뵙습니다! 새해 복 많이 받으시고 항상 즐코딩하십쇼! https://www.acmicpc.net/problem/11052 11052번: 카드 구매하기 첫째 줄에 민규가 구매하려고 하는 카드의 개수 N이 주어진다. (1 ≤ N ≤ 1,000) 둘째 줄에는 Pi가 P1부터 PN까지 순서대로 주어진다. (1 ≤ Pi ≤ 10,000) www.acmicpc.net 이 문제를 읽자마자, 굉장히 복잡하겠다는 생각이 들었다. 사실 근데 문제만 요란하지, 푸는 문제는 다이내믹 프로그래밍 그 자체로 풀 수 있었다. n=int(input()) cards=[0]+list(map(int,input().split())) prices=[0]*(n+1) for i in range(1,n+1): f..
BOJ 15990: 1,2,3 더하기 5 안녕하세요! 2021년 마지막 날에도 이 문제를 풀고 있네요 ㅎㅎ https://www.acmicpc.net/problem/15990 15990번: 1, 2, 3 더하기 5 각 테스트 케이스마다, n을 1, 2, 3의 합으로 나타내는 방법의 수를 1,000,000,009로 나눈 나머지를 출력한다. www.acmicpc.net 바로 이 문제입니다! n=int(input()) data=[[0]*4 for _ in range(100001)] data[1]=[0,1,0,0] data[2]=[0,0,1,0] data[3]=[0,1,1,1] for i in range(4,100001): data[i][1]=data[i-1][2]+data[i-1][3] data[i][2]=data[i-2][1]+data[i-2][3..
BOJ 1463: 1로 만들기 어제 백신을 맞아서 포스팅을 못 했는데, 오늘은 상태가 매우 괜찮아서 이렇게 왔습니다! 오늘의 문제 보시죠! 사실 이 문제도 예전에 스웨덴에서 있을 때 봤던 문제다. 그때는 알고리즘에 대한 기초 지식이 아예 없어서 어떻게 풀어야하는지 몰랐어서 굉장히 오랜 시간 고민하고 방황했었는데, 알고리즘 책도 읽고 다양한 문제를 풀면서 해결 방안을 바로 찾아냈다. 이렇게 간단한 코드로 해결한다. 우선, data라는 파일에 각 index별로 최소의 연산을 계산한다. 예를 들면 data[3]은 3을 만드는 데에 드는 연산의 수라고 할 수 있겠다. 이런 식으로 했을 때, 이미 있는 데이터보다 1을 더하거나, 2를 곱하거나, 3을 곱했을때 더 연산의 수가 적어지는 수로 업데이트한다. good!
BOJ 11576: Base Conversion 안녕하세요! 벌써 2021년 한 해가 저물어 갑니다. 본론으로 들어가서, 코드는 다음과 같다. 먼저, 각 자리를 받고, 보기 쉬운 10진법으로 만들었다. 만드는 방법은, 각 digit에 일정 가중값을 곱했다. 10진법에서 b진법으로 만들 때는 나누기에서 나오는 나머지를 이용해서 각 자리의 값을 구했다. 그래도 요즘에 파이썬 며칠 했다고, 코딩 치는게 조금 편해졌다. 남들이 놀 때 공부하고, 남들이 공부할 때 공부하는 것이 비결 아닐까? 벌써부터 속단하긴 이르지만, 결국 노력만이 승리하는 길이 아닐까 싶다.
BOJ 2089: -2진수 그럴 때 다들 있지 않으신가요 문제가 간단해 보이는데, 그래서 막상 풀려고 하면 마땅히 해답이 떠오르지 않는 경우요.. 생각보다 많으시다고요? 저도요. ㅋ. https://www.acmicpc.net/problem/2089 2089번: -2진수 -2진법은 부호 없는 2진수로 표현이 된다. 2진법에서는 20, 21, 22, 23이 표현 되지만 -2진법에서는 (-2)0 = 1, (-2)1 = -2, (-2)2 = 4, (-2)3 = -8을 표현한다. 10진수로 1부터 표현하자면 1, 110, 111, 100, 101, 11010, 110 www.acmicpc.net 바로 이 문제입니다! 간단한 듯이.... 어려운.... ㅋㅋㅋㅋㅋ.... 그럴 수록 정공법을 써야죠. 문제의 '원리'를 파악하기! 제 풀이입니다..