https://www.acmicpc.net/problem/10824
10824번: 네 수
첫째 줄에 네 자연수 A, B, C, D가 주어진다. (1 ≤ A, B, C, D ≤ 1,000,000)
www.acmicpc.net
문제
네 자연수 A, B, C, D가 주어진다. 이때, A와 B를 붙인 수와 C와 D를 붙인 수의 합을 구하는 프로그램을 작성하시오.
두 수 A와 B를 합치는 것은 A의 뒤에 B를 붙이는 것을 의미한다. 즉, 20과 30을 붙이면 2030이 된다.
입력
첫째 줄에 네 자연수 A, B, C, D가 주어진다. (1 ≤ A, B, C, D ≤ 1,000,000)
출력
A와 B를 붙인 수와 C와 D를 붙인 수의 합을 출력한다.
예제 입력 1
10 20 30 40
예제 출력 1
4060
- 풀이
- 문제에서 두 개의 숫자를 이어 붙이니 숫자가 최대 10000001000000까지 커지게 됩니다. (문제에서 각 숫자의 최댓값은 1,000,000) 그러므로 int형 자료형에다가 10000001000000 숫자를 담으려 하면 int 자료형이 커버할 수 있는 최대 범위(2147483647)를 초과해 오버플로우가 발생합니다. 그래서 int가 아닌 long long으로 큰 수를 받을 수 있게 합니다.
- Line 31~34는 숫자 범위가 1부터 1,000,000까지이므로 범위 안에 있는지만 확인하려고 넣은 코드입니다.
- 아이디어
- 예를 들어 A = 15, B = 3000이라 하면 A와 B를 이은 숫자는 153000입니다.
- 103000은 150000 + 3000 이라 표현할 수 있고 이는 15 * 10^4 + 3000이라 표현할 수 있습니다.
- 즉 A에 B의 자릿수 만큼 10을 곱한 후에 그것을 B랑 더하면 됩니다.
- 식으로 나타내면 A* 10^(B자릿수) + B
- C, D도 같이 C * 10^(D자릿수) + D
- Check함수는 자릿수 개수를 세가지고 자릿수를 리턴해줍니다.
- ppow 함수는 math.h 라이브러리에 있는 pow(10, x)와 같은 함수입니다. (x가 parameter가 되는 것입니다) 그런데 double형으로 계산되기 때문에 long long형으로 리턴해주기 위해 제가 그냥 직접 구현했습니다.
- 각 B를 check 함수에 넣어 자릿수를 구하고 그것을 각각 new_b에 대입합니다.
- ppow함수에 new_b를 넣어 리턴된 값을 A랑 곱하고 B랑 더합니다.
- C, D도 같은 방법으로 진행하고 각 나온 값을 위에서 나온 값이랑 더합니다.
본 게시물은 제가 공부한 내용을 올린 글이라 내용이 틀리거나 오류가 있을 수도 있습니다. 만약 그럴 시 jaewonahn1234@gmail.com으로 피드백해주시면 감사하겠습니다.
'SW > 백준' 카테고리의 다른 글
[GCD 알고리즘] Euclidean Algorithm (0) | 2022.01.05 |
---|---|
[백준] 11656번: 접미사 배열 (C) (0) | 2022.01.04 |
[백준] 11655번: ROT13 (C) (0) | 2022.01.04 |
[백준] 2743: 단어 길이 재기 (C) (0) | 2022.01.04 |
[백준] 10820: 문자열 분석 (C) (0) | 2022.01.04 |