2019. 9. 24. 03:22
728x90

문제 번호: 2558

문제 제목: A+B - 2

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


문제 내용

입력된 두 수의 합계를 출력한다. 입력 값은 개행 문자로 구분된다.


테스트 케이스

1
2

3


문제 풀이

1000번 문제와 다른 점이라곤 입력이 공백으로 구분되는게 아니라, 개행으로 구분된다는 점 뿐이다.
cin은 둘 다 구분자로 인식하므로 별도의 처리를 해줄 필요는 없다.


풀이 코드

728x90

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

백준 10953 - A+B - 6  (0) 2019.10.11
프로젝트 오일러 문제 19  (0) 2019.10.08
백준 2156 - 포도주 시식  (0) 2019.08.26
백준 10844 - 쉬운 계단 수  (0) 2019.08.26
백준 1463 - 1로 만들기  (0) 2019.08.26
Posted by 아야카
2019. 9. 15. 05:08
728x90

erase를 사용할 때는 erase로 반환되는 iterator를 변수에 대입해야 합니다.
erase(it)를 했다고 it가 자동으로 갱신되는게 아니라 it = erase(it)로 대입을 해줘야 합니다.
erase를 할 경우 iterator 변수는 empty 상태로 변경되기 때문입니다.

Visual Studio에서는 조사식으로 확인할 때 이 iterator의 값이 empty로 표기되지 않고 
삭제한 결과에 맞게 자동으로 갱신된 것처럼 표기됩니다.


erase를 하기 전의 상태
it는 nums[1]을 가리키고 있는 상태이며, 조사식에도 it의 [ptr]이 &nums[1]과 같은 것을 볼 수 있습니다.



erase를 하고 난 후의 상태
it도 갱신되고 [ptr]도 &nums[1]의 것과 동일한 것으로 출력됩니다.


하지만 막상 iterator 변수를 참조하려고 하는 순간 런타임 에러가 발생합니다.


Leetcode 문제를 풀다 iterator 사용법을 헷갈려하여 잠시 헤맸던 상황이었고
혹시 저와 같은 문제로 고생 중인 분이 있을 수도 있기에 포스팅으로 남깁니다.


for (auto it = nums.begin() + 1; it != nums.end();)
{
	if (*it == *(it - 1))
	{
		nums.erase(it);		// 이러면 it 참조 시 에러 발생
		it = nums.erase(it);	// it를 계속 사용할 거라면 이렇게.
	}
	else
	{
		it++;
	}
}
728x90
Posted by 아야카
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 아야카