728x90
SMALL
백준 문제 풀이: 11947 (이런 반전이)
문제 링크: https://www.acmicpc.net/problem/11947
문제 설명:
주어진 정수 N
에 대해 다음 조건을 만족하는 수를 찾아야 합니다:
- 0부터 9까지의 숫자를 반전시킨 **보수 수**를 계산합니다. 예: 123 → 876.
- 정수
N
과 그 보수 수의 곱을 구합니다. - 이 중 **최대 곱**을 출력합니다.
문제 해결 코드
#include <iostream>
#include <string>
using namespace std;
int main() {
ios::sync_with_stdio(false);
cin.tie(NULL);
int T; // 테스트 케이스 개수
cin >> T;
while (T--) {
string n;
cin >> n;
// 입력이 10억인 경우 특별 처리
if (n == "1000000000") {
cout << "8999999999000000000\n";
continue;
}
// 기준이 되는 값 k = 5 followed by (n.size() - 1) zeros
string k = "5";
for (int i = 0; i < n.size() - 1; i++) {
k += '0';
}
long long nn = stoll(n); // 입력 N을 숫자로 변환
long long kk = stoll(k); // k를 숫자로 변환
long long ss = 0; // 보수 값을 계산
if (nn < kk) { // N이 k보다 작을 때
for (int i = 0; i < n.size(); i++) {
ss *= 10;
ss += 9 - (n[i] - '0');
}
cout << nn * ss << '\n'; // N과 보수 값의 곱 출력
} else { // N이 k 이상일 때
for (int i = 0; i < k.size(); i++) {
ss *= 10;
ss += 9 - (k[i] - '0');
}
cout << kk * ss << '\n'; // k와 보수 값의 곱 출력
}
}
return 0;
}
코드 설명
코드의 주요 로직과 사용된 알고리즘 설명:
- 보수 수 계산:
입력 숫자
N
또는 기준값k
를 반전시켜 9에서 각 자릿수를 빼줍니다. - 기준 값 설정:
k = 5 * 10^(n.size() - 1)
: 입력 길이 기준으로 '5' 뒤에 0을 붙여 생성합니다. - 조건 분기:
N < k
: 입력N
의 보수를 구해 곱셈을 수행합니다.N ≥ k
: 기준 값k
의 보수를 구해 곱셈을 수행합니다.
- 특수 처리: 입력이 **1000000000**인 경우에는 고정된 값을 출력합니다.
시간 복잡도 분석
- 각 숫자의 길이를
n
이라고 하면 보수를 구하는 작업의 시간 복잡도는 **O(n)**입니다. - 총 **T**개의 테스트 케이스에 대해 시간 복잡도는 **O(T ⋅ n)**입니다.
결과
입력된 숫자에 대해 최댓값이 되는 곱을 출력합니다.
- 입력 예시:
3 12 1000 1000000000
- 출력 예시:
936 8991000 8999999999000000000
다른 접근 방식이나 개선 사항이 있다면 댓글로 공유 부탁드립니다!
728x90
LIST
'BAEKJOON > 수학' 카테고리의 다른 글
백준 5988번 [홀수일까 짝수일까](C++) -yes6686- 티스토리 (0) | 2024.05.16 |
---|---|
백준 31430번 [A+B - 투 스텝](C++) -yes6686- 티스토리 (0) | 2024.05.11 |
백준 20949번 [효정과 새 모니터](C++) -yes6686- 티스토리 (0) | 2024.05.09 |
백준 1456번 [거의 소수](C++) -yes6686- 티스토리 (0) | 2024.05.07 |
백준 5613번 [계산기 프로그램](C++) -yes6686- 티스토리 (0) | 2024.05.07 |