2020. 6. 19. 18:23
728x90

1. 숫자의 끝에 0이 붙는다는 것은 그만큼 10을 곱했다는 소리다.

2. 10 = 2×5. 소인수의 경우 2보다 5가 차지하는 비율이 적다. 따라서 소인수 5의 개수만 구할 수 있으면 된다.

3. 팩토리얼을 구성하는 소인수 5의 개수는 n/5를 반복해서 합산하는 것으로 구할 수 있다.

    • 첫 번째 n/5는 5^1가 있는 수
    • 두 번째 n/5는 5^2가 있는 수
    • 세 번째 n/5는 5^3가 있는 수
    • 예시) 75!의 경우 75/5 = 15이고, 15 / 5 = 3이므로 0의 개수는 18개가 된다.

4. ×5의 개수를 구하는 코드는 아래와 같다.

void FactorialTrailingZeroes(int n)
{
	int ret = 0;
	while(n > 0)
	{
		ret += n / 5;
		n /= 5;
	}
	return ret;
}


※ 재귀함수로 구현한다면 한 줄로도 구현할 수 있다.

void FactorialTrailingZeroes(int n)
{
	return n < 5 ? 0 : trailingZeroes (n / 5) + n / 5;
}


728x90

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

백준 15740 - A+B - 9  (0) 2019.10.11
백준 10953 - A+B - 6  (0) 2019.10.11
프로젝트 오일러 문제 19  (0) 2019.10.08
백준 2558 - A+B - 2  (0) 2019.09.24
백준 2156 - 포도주 시식  (0) 2019.08.26
Posted by 아야카
2019. 10. 11. 20:20
728x90

문제 번호: 15740

문제 제목: A+B - 9

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


문제 내용

입력받은 두 수 A, B를 합한 결과를 출력한다.


테스트 케이스

1 2

3

-60 40

-20

-999999999 1000000000

1

1099511627776 1073741824

1100585369600

123456789123456789123456789 987654321987654321987654321

1111111111111111111111111110


문제 풀이

 문자열로 입력 받아서 덧셈을 하는 코드를 짠다. 주의사항은 아래와 같다.
 - 양수에는 부호가 없지만, 음수에는 - 부호가 있다.
 - 부호가 같으면 덧셈, 부호가 다르면 뺄셈을 한다.
 - 0은 항등원이므로 입력값에 0이 포함되는 경우에는 연산을 할 필요가 없다.

 일단 양수, 0에는 부호가 없으므로 이런 숫자가 입력으로 들어오면 앞에 +를 붙여준다.

 덧셈은 각 자리를 합한 뒤 10이 넘으면 다음 자리에 +1을 하고, 현재 자리에 10을 빼기만 하면 된다.
 뺄셈은 계산 결과에 따라 추가적으로 처리해야 할 것들이 있다.내 경우에는 아래와 같은 순서로 진행하였다.
 1. 음수인 배열의 각 자리에 -1을 곱한다.
 2. A와 B의 각 자리를 합한다.
 3. 합한 결과의 맨 앞이 0인 경우 0이 아닌 수가 나올 때까지 제거한다.
 4. 맨 앞의 수가 0보다 작은 경우 부호를 -로 하고 각 자리에 -1을 곱한다. 아닌 경우에는 부호를 +로 한다.
 5. 일의 자리부터 시작하여 0보다 작은 경우 앞의 자리 수를 1 빼고, 현재 자리 수에 +10을 한다.
 6. 조정 후 3.의 처리를 추가로 진행한다.

마지막으로 결과 출력이 char로 이루어지므로 각 자리에 '0'을 더해줘 정상적으로 출력될 수 있게 하고, 부호가 +일 경우 이를 제거해준다.


2019. 11. 05 - 0에 대한 예외처리 추가
 기존: 값이 0일 때도 연산 진행
 변경: 입력 값에 0이 포함되는 경우 다른 값을 반환

2019. 10. 21 - 앞에 위치한 0 제거 코드 수정
 기존: 맨 앞이 0인지 확인하여 erase. 0의 개수만큼 erase 함수 반복.
 변경: 맨 앞이 0일 경우 연속으로 0이 나오는 수량을 확인하여 범위 삭제. erase 함수는 1회만 실행하는 대신 연속으로 확인하는 과정에서 for문이 돌아감


풀이 코드


728x90

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

팩토리얼에서 끝에 붙는 0의 개수 구하기  (0) 2020.06.19
백준 10953 - A+B - 6  (0) 2019.10.11
프로젝트 오일러 문제 19  (0) 2019.10.08
백준 2558 - A+B - 2  (0) 2019.09.24
백준 2156 - 포도주 시식  (0) 2019.08.26
Posted by 아야카
2019. 10. 11. 16:04
728x90

문제 번호: 10953

문제 제목: A+B - 6

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


문제 내용

A, B가 ,로 구분되어 N개만큼 주어진다. A+B의 값을 출력한다.


테스트 케이스

5
1,1
2,3
3,4
9,8
5,2


2
5
7
17
7


문제 풀이

입력은 세 글자로 제한된다. A, B의 값이 1~9로 제한되기 때문.
문자열로 입력 받아서 [0], [2]에 있는 값끼리 합하면 된다.
단, 이렇게 입력 받은 경우에는 [0]과 [2]에 저장된건 아스키코드 값인 48~57이므로 계산을 할 때 각 문자에 '0'만큼의 값을 뺀 후 계산해야 한다.

문제와는 별개로 A, B의 입력 값이 10 이상인 경우에는 ,의 위치를 특정할 수 없으므로 데이터의 형식에 맞춰 int, char, int 순서로 입력 받아야 한다. int를 읽어들일 때 숫자가 아닌 데이터가 나올 경우 stream 읽는 것을 중단하기 때문.


풀이 코드


728x90

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

팩토리얼에서 끝에 붙는 0의 개수 구하기  (0) 2020.06.19
백준 15740 - A+B - 9  (0) 2019.10.11
프로젝트 오일러 문제 19  (0) 2019.10.08
백준 2558 - A+B - 2  (0) 2019.09.24
백준 2156 - 포도주 시식  (0) 2019.08.26
Posted by 아야카
2019. 10. 8. 19:59
728x90

Counting Sundays

   

Problem 19

You are given the following information, but you may prefer to do some research for yourself.

  • 1 Jan 1900 was a Monday.
  • Thirty days has September, April, June and November.
    All the rest have thirty-one, Saving February alone,
    Which has twenty-eight, rain or shine. And on leap years, twenty-nine.
  • A leap year occurs on any year evenly divisible by 4, but not on a century unless it is divisible by 400.

How many Sundays fell on the first of the month during the twentieth century (1 Jan 1901 to 31 Dec 2000)?


1901년 1월 1일 ~ 2000년 12월 31일까지 매월 1일이 일요일인 달이 몇 개인지 세는 문제.

1900년 1월 1일은 월요일이며, 윤년 규칙은 기존과 동일하게 4년(윤년), 100년(평년), 400년(윤년)의 구분자를 갖는다.

 * 윤년 규칙에 따라 1900년 2월은 평년으로 28일이다.


1. 계산을 시작하는 해의 1월 1일의 요일을 구한다.

 * 시작하는 해의 1월 1일이 일요일인 경우 반환값에 이것이 누락되지 않도록 해야 한다.

2. 각 월에 해당하는 날짜만큼을 더한 후 요일을 구하여 일요일이면 반환값에 +1을 한다.

 * 2월인 경우에는 % 4, % 100, % 400 에 대한 처리를 하여 요일을 구한다.

3. 구한 결과값을 반환한다.




728x90

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

백준 15740 - A+B - 9  (0) 2019.10.11
백준 10953 - A+B - 6  (0) 2019.10.11
백준 2558 - A+B - 2  (0) 2019.09.24
백준 2156 - 포도주 시식  (0) 2019.08.26
백준 10844 - 쉬운 계단 수  (0) 2019.08.26
Posted by 아야카
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. 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 아야카