[백준 11944] NN [Java]
2025. 12. 1. 03:05ㆍPS 풀이/Baekjoon Online Judge
문제
요약
- 주어진 N을 N번 출력하자.
- 완성된 문자열이 M보다 길다면, 앞 M자리만 출력하자.
풀이 과정
아이디어
N번 만큼 반복한 문자열을 만들고, 길이가 M보다 크다면 앞 M자리까지 잘라서 출력하면 된다.
// Solve
String ori = in[0].repeat(N);
if (ori.length() > M) {
ori = ori.substring(0, M);
}
최적화
N번 만큼 반복한 문자열의 최대 길이는 $2^{13}$이다.
M은 최대 $2^{11}$이므로, 불필요한 문자열을 생성 후 자르게 된다.
반복한 문자열의 길이가 M보다 클 때, 필요한 최소 반복 횟수만큼 생성 후 문자열을 잘라도 된다.
final int len = in[0].length();
final int oriLen = in[0].length() * N;
String result;
if (oriLen > M) {
final int repeatNeed = (M + len) / len;
result = in[0].repeat(repeatNeed).substring(0, M);
} else {
result = in[0].repeat(N);
}
제출 결과 성능 상 유의미한 차이는 없었다.
Java의 char는 2바이트 이므로, 불필요한 6144자의 문자 생성은 약 12KB 정도이기 때문이다.
성능 분석
- 제출결과: Accepted / 104ms / 14,168MB
회고
불필요한 문자열 약 6,000자가 생성되는 문제를 발견하고 최적화를 진행했지만, 문자열을 반복 생성하는 구조가 아니었기 때문에 코드 복잡도가 증가한 것에 비해 성능 개선 효과는 미미했다. 최적화의 목적과 방법이 실제 병목과 일치해야 의미 있는 성능 향상이 나온다는 점을 다시 확인했다.
또한 수치를 근거로 판단해야 하는 상황에서도, 사람은 숫자에 취약하면서 동시에 숫자가 주는 ‘정확함’의 느낌에 쉽게 확신을 얻을 수 있다는 사실을 체감했다. 앞으로는 숫자를 해석하고 검증하는 과정까지 포함해 의사결정을 해야겠다고 다짐했다.
참고
문제
소스코드
https://github.com/rogi-rogi/problem-solving/blob/main/baekjoon-online-judge/practice/11944.java
'PS 풀이 > Baekjoon Online Judge' 카테고리의 다른 글
| [백준 25393] 교집합 만들기 [Java] (0) | 2025.12.07 |
|---|---|
| [백준 34817] 쉬운 정렬 문제 [Java] (0) | 2025.12.06 |
| [백준 12946] 육각 보드 [Java] (0) | 2025.11.29 |
| [백준 24938] 키트 분배하기 [Java] (0) | 2025.11.23 |
| [백준 02262] 토너먼트 만들기 [Java] (0) | 2025.11.21 |