2019. 8. 26. 02:00
728x90

문제 번호: 2156

문제 제목: 포도주 시식

문제 주소: https://www.acmicpc.net/problem/2156


문제 내용

포도주 잔 n과 각 잔에 들어있는 포도주의 양이 주어질 때 최대로 마실 수 있는 포도주의 양을 출력한다.
단, 연속으로 놓여 있는 세 잔을 모두 마실 수는 없다.


테스트 케이스

6
6 10 13 9 8 1

33

6
8 2 0 0 2 8

20


문제 풀이

계단 오르기 문제와 비슷하지만 건너 뛰는 간격에 대한 제한이 없다는 차이가 있다. 즉, 2칸을 건너뛰지 않고 3칸을 건너뛸 수도 있다는 것.
이 때문에 점화식을 만든 후 값을 구하는 것은 계단오르기와 동일하나 dp[i - 2]와 dp[i-3]만 알면 되었던 계단오르기와 달리, dp[i - 3] 대신 dp[0] ~ dp[i - 3] 중에서 가장 큰 값을 알아야 한다. dp 중에서 가장 큰 값을 저장하는 변수를 만들고 새로운 dp 값을 구할 때마다 이 변수에 가장 큰 값을 입력해두는 식으로 진행하면 최대로 마실 수 있는 포도주의 양을 구할 수 있다.


풀이 코드

728x90

'공부 > 문제풀기' 카테고리의 다른 글

프로젝트 오일러 문제 19  (0) 2019.10.08
백준 2558 - A+B - 2  (0) 2019.09.24
백준 10844 - 쉬운 계단 수  (0) 2019.08.26
백준 1463 - 1로 만들기  (0) 2019.08.26
백준 2579 - 계단 오르기  (0) 2019.08.23
Posted by 아야카
2019. 8. 26. 01:48
728x90

문제 번호: 10844

문제 제목: 쉬운 계단 수

문제 주소: https://www.acmicpc.net/problem/10844


문제 내용

글자 수 N이 주어졌을 때 N글자로 만들 수 있는 계단 수의 가짓수를 10억으로 나눈 나머지로 출력한다.
계단수는 45656처럼 인접한 숫자 간의 차의 절대값이 1인 수를 의미한다. 단, 0으로 시작할 수는 없다.


테스트 케이스

1

9

2

17

100

18404112


문제 풀이

i으로 끝나는 숫자는 그 다음 숫자가 i - 1, i + 1이 된다.
즉, N - 1글자의 M으로 끝나는 수는 N글자의 M - 1인 수와 M + 1인 수가 된다.
이를 표로 나타내보면 아래와 같다.

N

0

1

2

3

4

5

6

7

8

9

1

0

1

1

1

1

1

1

1

1

1

2

1

1

2

2

2

2

2

2

2

1

3

1

3

3

4

4

4

4

4

3

2

4

3

4

7

7

8

8

8

7

6

3

5

4

10

11

15

15

16

15

14

10

6

따라서 동적계획법으로 코드를 작성한다면 위와 같이 N*10개짜리 배열을 만들고 1~8는 N-1의 i - 1과 i + 1를 합친 값을 대입하고, 0은 N-1의 1 값을, 9는 N-1의 8 값을 대입하는 것으로 N자의 글자 수를 구할 수 있다.


풀이 코드



728x90

'공부 > 문제풀기' 카테고리의 다른 글

백준 2558 - A+B - 2  (0) 2019.09.24
백준 2156 - 포도주 시식  (0) 2019.08.26
백준 1463 - 1로 만들기  (0) 2019.08.26
백준 2579 - 계단 오르기  (0) 2019.08.23
백준 1932 - 정수 삼각형  (0) 2019.08.23
Posted by 아야카
2019. 8. 26. 01:26
728x90

문제 번호: 1463

문제 제목: 1로 만들기

문제 주소: https://www.acmicpc.net/problem/1463


문제 내용

아래 세 가지 규칙을 바탁으로 X를 1로 만드는데 필요한 최소한의 연산 횟수를 출력한다.
1. X가 3으로 나누어 떨어지면, 3으로 나눈다.
2. X가 2로 나누어 떨어지면, 2로 나눈다.
3. 1을 뺀다.


테스트 케이스

2

1

10

3

10000

14


문제 풀이

일정 범위까지 점화식을 만들고 점화식을 바탕으로 아래의 내용에 대해 판단한다.
1. m1, m2, m3 변수를 만들고 100만보다 큰 수로 초기화 한다.
2. n % 3 == 0인 경우 [n / 3]의 값을 구해 m1에 저장한다.
3. n % 2 == 0인 경우 [n / 2]의 값을 구해 m2에 저장한다.
4. [n - 1]의 값을 구해 m3에 저장한다.
5. m1, m2, m3의 값을 비교해 가장 작은 값 + 1을 [n]에 저장한다.
6. 1~5를 반복한다.


풀이 코드


728x90

'공부 > 문제풀기' 카테고리의 다른 글

백준 2156 - 포도주 시식  (0) 2019.08.26
백준 10844 - 쉬운 계단 수  (0) 2019.08.26
백준 2579 - 계단 오르기  (0) 2019.08.23
백준 1932 - 정수 삼각형  (0) 2019.08.23
백준 1149 - RGB거리  (0) 2019.08.23
Posted by 아야카
2019. 8. 23. 17:28
728x90

문제 번호: 2579

문제 제목: 계단 오르기

문제 주소: https://www.acmicpc.net/problem/2579


문제 내용

계단을 올라갈 때마다 밟을 칸의 점수를 획득한다. 도착지점까지 오르면서 얻을 수 있는 최고 점수를 출력한다.
단, 계단은 한 칸 또는 두 칸 간격으로 올라갈 수 있으며 연속해서 세 개를 밟을 수는 없다.


테스트 케이스

6
10
20
15
25
10
20

75

1
10

10

2
10
20

30

3
10
20
30

50

6
10
15
20
10
25
20

80


문제 풀이

최대 이동 간격이 두 칸이라는 점, 연속해서 세 개의 계단을 밟을 수 없다는 점이 풀이의 핵심이다.
N번째 위치에 도달하는 경우는 직전에서 올라오는 경우, 두 칸 전에서 올라오는 경우로 나뉜다.
직전에서 올라오는 경우에는 직전 칸 도달의 최대값을 현재 칸 값에 더하면 되고, 
두 칸 전에서 올라오는 경우에는 세 칸 전 도달의 최대값 + 두 칸 전의 계단값에 현재 칸 값을 더하면 된다.

이미지로 표현하면 아래 두 가지 경우 중에 큰 값을 최대값 n에 넣는 것과 같다.

풀이 코드



728x90

'공부 > 문제풀기' 카테고리의 다른 글

백준 10844 - 쉬운 계단 수  (0) 2019.08.26
백준 1463 - 1로 만들기  (0) 2019.08.26
백준 1932 - 정수 삼각형  (0) 2019.08.23
백준 1149 - RGB거리  (0) 2019.08.23
백준 9461 - 파도반 수열  (0) 2019.08.21
Posted by 아야카
2019. 8. 23. 14:55
728x90

문제 번호: 1932

문제 제목: 정수 삼각형

문제 주소: https://www.acmicpc.net/problem/1932


문제 내용

크기가 n인 정수 삼각형이 주어졌을 때 최상층에서 최하층까지 이동하면서 합계가 가장 큰 경로의 값을 출력한다.


테스트 케이스

5
7
3 8
8 1 0
2 7 4 4
4 5 2 6 5

30

1
1

1

15
75
95 64
17 47 82
18 35 87 10
20 04 82 47 65
19 01 23 75 03 34
88 02 77 73 07 63 67
99 65 04 28 06 16 70 92
41 41 26 56 83 40 80 70 33
41 48 72 33 47 32 37 16 94 29
53 71 44 65 25 43 91 52 97 51 14
70 11 33 28 77 73 17 78 39 68 17 57
91 71 52 38 17 14 91 43 58 50 27 29 48
63 66 04 68 89 53 67 30 73 16 69 87 40 31
04 62 98 27 23 09 70 98 73 93 38 53 60 04 23

1074


문제 풀이

RGB거리와 비슷한 방식으로 풀 수 있는 문제다. 문제에서는 최대값만을 구하면 되므로 최하층에서 최상층으로 좁혀간 뒤 최상층에서 계산한 결과 값을 바로 출력해주면 된다.
최상층에서 최하층으로 넓혀가면서 구할 경우 최하층 계산이 끝난 후 N개의 배열에서 결과값을 찾는 연산을 추가로 해줘야 한다. 목적에 따라서는 최상층에서 최하층으로 이동하는 것이 적절할 수 있으나 문제에서 요구하는 것과는 관계가 없다.


풀이 코드


728x90

'공부 > 문제풀기' 카테고리의 다른 글

백준 1463 - 1로 만들기  (0) 2019.08.26
백준 2579 - 계단 오르기  (0) 2019.08.23
백준 1149 - RGB거리  (0) 2019.08.23
백준 9461 - 파도반 수열  (0) 2019.08.21
백준 1904 - 01타일  (0) 2019.08.21
Posted by 아야카
2019. 8. 23. 14:28
728x90

문제 번호: 1149

문제 제목: RGB거리

문제 주소: https://www.acmicpc.net/problem/1149


문제 내용

1. 집은 일렬로 쭉 늘어서 있다. 단, [0]과 [N - 1]은 인접하지 않았다.
2. 인접한 집의 색이 동일하지 않아야 한다. (RRG는 불가능, RGR은 가능)
3. 입력으로 각 집의 RGB에 대한 도색 비용이 주어진다.
위 조건에 맞춰 [0]부터 [N - 1]번째 집까지 도색하는 비용의 최소값을 출력한다.


테스트 케이스

3
26 40 83
49 60 57
13 89 99

96

1
26 40 83

26


문제 풀이

비용이 최소인 경로를 구하는 문제. 이런 종류의 문제는 각 출발지에서 목적지까지 도달한 후에 경로별 값을 비교하는 것으로 구할 수 있다.
[1]의 R은 [0]의 G, B와 비교하여 작은 값과 더하고, [1]의 G는 [0]의 R, B와 비교, [1의 B는 [0]의 R, G와 비교하여 최소 값을 구하는 식으로 목적지인 [N-1]까지 최소 합계를 구하고, [N-1]의 R, G, B 중에서 가장 작은 값을 출력하는 것으로 해결할 수 있다.


풀이 코드


728x90

'공부 > 문제풀기' 카테고리의 다른 글

백준 2579 - 계단 오르기  (0) 2019.08.23
백준 1932 - 정수 삼각형  (0) 2019.08.23
백준 9461 - 파도반 수열  (0) 2019.08.21
백준 1904 - 01타일  (0) 2019.08.21
백준 1003 - 피보나치 함수  (0) 2019.08.19
Posted by 아야카
2019. 8. 21. 16:14
728x90

문제 번호: 9461

문제 제목: 파도반 수열

문제 주소: https://www.acmicpc.net/problem/9461


문제 내용

위 이미지와 같이 P(N)의 값이 증가한다고 할 때 P(N)의 값을 출력한다.
P(N)의 값은 1 1 1 2 2 3 4 7 9 12 ... 순서로 증가한다.


테스트 케이스

5
1
5
6
12
100


1
2
3
16
888855064897



문제 풀이

위 이미지에서 색칠이 된 선분을 보면 직전 삼각형과 5번째 이전 삼각형의 변 길이의 합이라는 것을 알 수 있다.
즉, f(n) = f(n - 1) + f(n - 5)라는 규칙을 갖는다.
점화식으로 [0] ~ [4]까지 1, 1, 1, 2, 2를 넣어주고 [5] ~ [100]까지 수열을 구해준 이후 테스트 케이스에 해당하는 결과값을 출력해주면 된다.
결과 값이 최대 88억까지 나올 수 있으므로 수열의 기본 자료형은 64bit 이상으로 하여야 한다.


풀이 코드


728x90

'공부 > 문제풀기' 카테고리의 다른 글

백준 1932 - 정수 삼각형  (0) 2019.08.23
백준 1149 - RGB거리  (0) 2019.08.23
백준 1904 - 01타일  (0) 2019.08.21
백준 1003 - 피보나치 함수  (0) 2019.08.19
백준 2748 - 피보나치 수 2  (0) 2019.08.19
Posted by 아야카
2019. 8. 21. 15:59
728x90

문제 번호: 1904

문제 제목: 01타일

문제 주소: https://www.acmicpc.net/problem/1904


문제 내용

00과 1을 조합하여 표현할 수 있는 글자 N개의 가짓수를 출력한다.


테스트 케이스

1

1

2

2

4

5

7

21

1000000

7871


문제 풀이

f(4)에 대해 구한다고 할 경우 아래와 같이 구할 수 있다.
1. 1로 시작하는 숫자는 1xxx가 된다. xxx는 f(4)일 때의 가짓수가 동일하다.
2. 00으로 시작하는 숫자는 00xx가 된다. xx는 f(3) 일 때의 가짓수와 동일하다.
3. f(5)의 가짓수는 1로 시작하는 숫자와 00으로 시작하는 숫자의 가짓수를 합한 것과 동일하다.
 - f(5) = f(4) + f(3)
즉, 이 문제는 점화식이 1, 2인 피보나치 수열이다. 함수 구현은 피보나치 수열을 구현하듯이 하면 된다.

다만 결과 출력이 15746으로 나눈 나머지이고, 나머지 연산의 법칙상 (a % m + b % m) % m은 성립이 되므로# 피보나치 수열을 구하는 과정에서 각 수를 15746으로 나눈 나머지로 계산하여야 올바른 값을 얻을 수 있다.


풀이 코드


728x90

'공부 > 문제풀기' 카테고리의 다른 글

백준 1149 - RGB거리  (0) 2019.08.23
백준 9461 - 파도반 수열  (0) 2019.08.21
백준 1003 - 피보나치 함수  (0) 2019.08.19
백준 2748 - 피보나치 수 2  (0) 2019.08.19
백준 10814 - 나이순 정렬  (0) 2019.08.19
Posted by 아야카