1. 9461번: 파도반 수열 

-문제: https://www.acmicpc.net/problem/9461

 

9461번: 파도반 수열

오른쪽 그림과 같이 삼각형이 나선 모양으로 놓여져 있다. 첫 삼각형은 정삼각형으로 변의 길이는 1이다. 그 다음에는 다음과 같은 과정으로 정삼각형을 계속 추가한다. 나선에서 가장 긴 변의

www.acmicpc.net

수열이 1,1,1,2,2,3,4,5,7,9로 진행되는 것에 기반해서 점화식까지 구하는 건 성공함.오늘 풀었던 세문제 중 가장 쉬웠던 문제

-점화식: P(N)= P(N-5)+P(N-1)

 

 

-정답풀이 : 

-틀린 풀이1:

  • 4번에 i를 j로 바꿔야함(이거때문에 뻘짓함. NameError 조심)

 

-틀린 풀이2:

 

  • dp에 숫자 모두 입력되고, 거기서 출력하는것이 맞음

 

2. 14051번: 퇴사 (여러번 반복해서 봐야할 문제)

-문제: https://www.acmicpc.net/problem/14501

 

14501번: 퇴사

첫째 줄에 백준이가 얻을 수 있는 최대 이익을 출력한다.

www.acmicpc.net

0번째 컬럼부터 생각하고 알고리즘 설정하려고 했는데 이게 아니라 마지막 컬럼을 기준으로 풀어나가야하는 문제 

 

-정답풀이: 

n=int(input())
T=[]
P=[]
dp=[]

for i in range(n):
    x,y=map(int,input().split())
    T.append(x)
    P.append(y)
    dp.append(y)
    
dp.append(0)#n번째 인덱스에 0대입 

for i in range(n-1,-1,-1):
    if T[i]+i>n:#일이 퇴사후까지 진행되면 다음으로 넘김
        dp[i]=dp[i+1]
    else:
        dp[i]=max(dp[i+1],P[i]+dp[i+T[i]])
print(dp[0])

:여기서 왜 dp[i+T[i]]가 나오는지 이해가 가지 않는다 

 

 

3. 9465번: 스티커 

-문제: https://www.acmicpc.net/problem/9465

 

9465번: 스티커

첫째 줄에 테스트 케이스의 개수 T가 주어진다. 각 테스트 케이스의 첫째 줄에는 n (1 ≤ n ≤ 100,000)이 주어진다. 다음 두 줄에는 n개의 정수가 주어지며, 각 정수는 그 위치에 해당하는 스티커의

www.acmicpc.net

이것도 어려웠던 문제 대각선으로 값을 더해야하는 건 알겠는데 어떻게 진행해야하는지 몰랐던 문제. 

 

-정답풀이:

t=int(input())
for i in range(t):
    s=[]
    n=int(input())
    for k in range(2):
        s.append(list(map(int,input().split())))
    for j in range(1,n):
        if j==1:
            s[0][j]+=s[1][j-1]
            s[1][j]+=s[0][j-1]
        else:
            s[0][j]+= max(s[1][j-1],s[1][j-2])
            s[1][j]+= max(s[0][j-1],s[0][j-2])
    print(max(s[0][n-1],s[1][n-1]))

1. 1010번: 다리놓기

-문제: https://www.acmicpc.net/problem/1010

 

1010번: 다리 놓기

입력의 첫 줄에는 테스트 케이스의 개수 T가 주어진다. 그 다음 줄부터 각각의 테스트케이스에 대해 강의 서쪽과 동쪽에 있는 사이트의 개수 정수 N, M (0 < N ≤ M < 30)이 주어진다.

www.acmicpc.net

어렵게 생각했는데 알고보니 조합 문제였던; 수학적으로 생각해보는 것도 해보고, 단순하게 생각할 수 있으면 최대한 그렇게 해보자

 

-정답풀이: 

  • 조합 구하는 식 알아두기 

 

2. 11052번: 카드 구매하기

-문제: 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())
d=[0]*(n+1)
p=[0]+list(map(int,input().split()))
d[1]=p[1]
for i in range(2,n+1):
    for j in range(1,i+1):
        if d[i]<d[i-j]+p[j]:
            d[i]=d[i-j]+p[j]
print(d[n])

다른 블로그 참조해서 이해한 결과 

d[i]에서 i는 구매하는 카드의 개수이고 다음과 같은 규칙을 가진다.

d[1]=p[1] (카드를 하나 구매하면 당연히 카드 한개의 가격의 가짓수이다)

d[2]=d[0]+p[2], d[1]+p[1](1개카드 두개 구매하는거)

d[3]=d[0]+p[3], d[1]+p[2], d[2]+p[1]

d[4]=d[0]+p[4], d[1]+p[3],d[2]+p[2],d[3]+p[1]

 

3. 1904번: 01타일 

-문제: https://www.acmicpc.net/problem/1904

 

1904번: 01타일

지원이에게 2진 수열을 가르쳐 주기 위해, 지원이 아버지는 그에게 타일들을 선물해주셨다. 그리고 이 각각의 타일들은 0 또는 1이 쓰여 있는 낱장의 타일들이다. 어느 날 짓궂은 동주가 지원이

www.acmicpc.net

피보나치 수열로 쉬운 문제였다

 

-정답풀이: 

-틀린 풀이: 

  • 리스트 다 구하고 15746으로 나누니 메모리 초과 발생. append할 때 나누어서 넣어야한다
  • 그리고 1자리 수에 00은 불가능하지만, 1은 가능하므로 1의 값을 가진다(초기값 설정하는데 생각 더하자)

 

1. 10844번: 쉬운 계단수

-문제: https://www.acmicpc.net/problem/10844

 

10844번: 쉬운 계단 수

첫째 줄에 정답을 1,000,000,000으로 나눈 나머지를 출력한다.

www.acmicpc.net

: 숫자가 한개일 때 쉬운 계단수를 못 구한하지 않나?라는 생각에 쉬운 계단수라는 개념이 처음에 이해가지 않았음. 

숫자가 한개일 때는 그냥 하나로 세고, 숫자길이 2일 때부터 생각하면됨. 이후 3부터는 숫자 길이 1,2일 때의 반복임을 이용하면된다.

 

-정답 풀이:

 

n=int(input())
dp=[[0 for i in range(10)] for j in range(101)]

#숫자가 무엇이든간에 자릿수가 1이면 계단수 1개임을 의미함 
for i in range(1,10):
    dp[1][i]=1
    
for i in range(2,n+1):
    for j in range(10):
        #i위치에 0이 오면 전행의 1의 개수와 동일하다(1의 -1이 0)
        if j==0:
            dp[i][j]=dp[i-1][1]
        #i위치에 9가오면 이전위치에 8밖에 못옴. 전행의 8의 개수와 동일    
        elif j==9:
            dp[i][j]=dp[i-1][8]
        else:
            dp[i][j]=dp[i-1][j-1]+dp[i-1][j+1]
print(sum(dp[n])% 1000000000)

-그리고 오타 조심하기!!!  print를 priint라고 서서 NameError 엄청냄,,

 

2. 2193번: 이친수

**처음으로 풀이 안보고 맞힌 문제(피보나치 유형), 겉모습은 다르지만 점화식을 구해보면 피보나치 구조를 가지므로, 구현해서 답을 구함.

복잡해보이지만 알고보면 단순한 문제 

-문제: https://www.acmicpc.net/problem/2193

 

2193번: 이친수

0과 1로만 이루어진 수를 이진수라 한다. 이러한 이진수 중 특별한 성질을 갖는 것들이 있는데, 이들을 이친수(pinary number)라 한다. 이친수는 다음의 성질을 만족한다. 이친수는 0으로 시작하지 않

www.acmicpc.net

 

-정답풀이:

  • for문의 끝 인덱스가 n+1인 이유: 길이가 n인 이진수를 구하므로 n번째 인덱스 값을 출력해야하기 때문이다

 

-틀린풀이: 초기값이랑, 인덱스 조심(이거 꼭 제대로 하고 넘어가기)

 

 

3. 11727번: 2xn 타일링2(ssafy공부할 때 있었던 문제)

-문제:https://www.acmicpc.net/problem/11727

 

11727번: 2×n 타일링 2

2×n 직사각형을 1×2, 2×1과 2×2 타일로 채우는 방법의 수를 구하는 프로그램을 작성하시오. 아래 그림은 2×17 직사각형을 채운 한가지 예이다.

www.acmicpc.net

: 인덱스를 잘못구해서 오류가 많았음. 점화식은 옳게 구함-> 인덱스 똑바로 정하는 연습하기. 해당문제 다시 풀어봐야함

-점화식: s(i)=2*s(i-2)+s(i-1)

점화식은 각 항의 값을 직접 구해서 규칙성을 찾으려했음 

 

-정답 풀이:

  • 마지막에 10007로 나누는 거 잊지말기 
  • dp 초기값 설정하는데 오류발생(dp=[0 for i in range(n)]이라고 설정해서 되도록이면 끝값으로 크게 설정하기)
  • 이것도 n번째 인덱스 값을 출력해야함

1. 1912번: 연속합 

:max 두번 사용하는 아이디어는 얻었으나, 시간초과로 풀지 못함 -> 빠른 속도로 구현하는 방법 익히기 

 

문제: https://www.acmicpc.net/problem/1912

 

1912번: 연속합

첫째 줄에 정수 n(1 ≤ n ≤ 100,000)이 주어지고 둘째 줄에는 n개의 정수로 이루어진 수열이 주어진다. 수는 -1,000보다 크거나 같고, 1,000보다 작거나 같은 정수이다.

www.acmicpc.net

 

-정답: 

==> i+1번째 값(d[i+1])이랑 이전 누적값(m[i])이랑 합을 비교해서 최댓값 넣고, 그중에서 최댓값 출력하기 

 

-시간초과 풀이(사실 틀릴 수도 있음):

 

 

2. 2156번: 포도주 시식 

-문제: https://www.acmicpc.net/problem/2156

 

2156번: 포도주 시식

효주는 포도주 시식회에 갔다. 그 곳에 갔더니, 테이블 위에 다양한 포도주가 들어있는 포도주 잔이 일렬로 놓여 있었다. 효주는 포도주 시식을 하려고 하는데, 여기에는 다음과 같은 두 가지 규

www.acmicpc.net

==> 계단 오르기와 비슷한 유형의 문제 공부하자!!

 

-정답 풀이: 

 

 

3. 2748번 : 피보나치 수2

-문제 :  https://www.acmicpc.net/problem/2748

 

2748번: 피보나치 수 2

피보나치 수는 0과 1로 시작한다. 0번째 피보나치 수는 0이고, 1번째 피보나치 수는 1이다. 그 다음 2번째 부터는 바로 앞 두 피보나치 수의 합이 된다. 이를 식으로 써보면 Fn = Fn-1 + Fn-2 (n ≥ 2)가

www.acmicpc.net

==> 이전 피보니치와 같은 문제라고 생각해 재귀함수로 구현했으나 시간초과했음 

==> 이럴땐 리스트에 접화식 append하는 형식으로 진행하면 됨

 

 

-정답 풀이:

 

-틀린풀이

: 인덱스 문제로 틀림. 인덱스도 주의하자.

  • for문의 마지막 인덱스가 n이 아니라 n+1d인 이유: 문제 설명에 보면 n=17일때, F17을 구하는 것이므로 총 18개의 숫자출력함. 따라서 n+1까지 인덱스 구해야함

+ Recent posts