[Bronze III] 열 개씩 끊어 출력하기 - 11721
성능 요약
메모리: 14280 KB, 시간: 124 ms
분류
문자열, 구현
제출 일자
2024년 6월 1일 00:14:29
문제 설명
알파벳 소문자와 대문자로만 이루어진 길이가 N인 단어가 주어진다.
한 줄에 10글자씩 끊어서 출력하는 프로그램을 작성하시오.
입력
첫째 줄에 단어가 주어진다. 단어는 알파벳 소문자와 대문자로만 이루어져 있으며, 길이는 100을 넘지 않는다. 길이가 0인 단어는 주어지지 않는다.
출력
입력으로 주어진 단어를 열 개씩 끊어서 한 줄에 하나씩 출력한다. 단어의 길이가 10의 배수가 아닌 경우에는 마지막 줄에는 10개 미만의 글자만 출력할 수도 있다.
코드
import java.io.*;
public class Main {
private static int CHUNK_SIZE = 10;
public static void main(String[] args) throws IOException {
/**
* 문제
* 알파벳 소문자와 대문자로만 이루어진 길이가 N인 단어가 주어진다.
*
* 한 줄에 10글자씩 끊어서 출력하는 프로그램을 작성하시오.
*
* 입력
* 첫째 줄에 단어가 주어진다. 단어는 알파벳 소문자와 대문자로만 이루어져 있으며, 길이는 100을 넘지 않는다. 길이가 0인 단어는 주어지지 않는다.
*
* 출력
* 입력으로 주어진 단어를 열 개씩 끊어서 한 줄에 하나씩 출력한다. 단어의 길이가 10의 배수가 아닌 경우에는 마지막 줄에는 10개 미만의 글자만 출력할 수도 있다.
*/
// 입력 데이터를 명시적으로 작성
// String input = "BaekjoonOnlineJudge";
// String input = "OneTwoThreeFourFiveSixSevenEightNineTen";
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
// BufferedReader br = new BufferedReader(new StringReader(input));
BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(System.out));
String chunkString = br.readLine();
int length = chunkString.length();
for(int i = 0; i < length; i += CHUNK_SIZE){
int end = Math.min(length, i + CHUNK_SIZE);
String unitString =chunkString.substring(i, end);
bw.write(unitString);
bw.newLine();
}
bw.flush();
bw.close();
}
}
시간 복잡도
위 코드는 입력된 문자열을 10글자씩 끊어서 출력하는 프로그램입니다. 이 코드의 시간 복잡도를 분석해보겠습니다.
시간 복잡도 분석
주요 연산 분석
입력 읽기 (O(N))
String chunkString = br.readLine();
- 이 줄은 입력된 문자열을 한 번에 읽습니다. 입력 길이를
N
이라고 할 때, 이 연산은 O(N)의 시간 복잡도를 가집니다.
- 이 줄은 입력된 문자열을 한 번에 읽습니다. 입력 길이를
반복문 (O(N))
- for (int i = 0; i < length; i += CHUNK_SIZE)
- 이 반복문은 i를 0부터 문자열의 길이 (length = N)까지 CHUNK_SIZE (10)만큼 증가시키며 실행됩니다.
- 반복문의 총 반복 횟수는 N / CHUNK_SIZE = N / 10입니다. 즉, 반복문의 횟수는 O(N/10)입니다. 상수를 무시하면 O(N)으로 볼 수 있습니다.
부분 문자열 추출 및 출력 (O(1))
- Sring unitString = chunkString.substring(i, end);
- substring 메서드는 시작 인덱스와 끝 인덱스를 사용하여 부분 문자열을 추출합니다. 이 메서드는 상수 시간 O(1)에 실행됩니다.
- bw.write(unitString); bw.newLine();
- BufferedWriter의 write와 newLine 메서드는 각각 O(1)의 시간 복잡도를 가집니다.
총 시간 복잡도
위에서 각 주요 연산의 시간 복잡도를 고려하여, 전체 코드의 시간 복잡도를 계산할 수 있습니다.
- 입력 읽기: O(N)
- 반복문 내 연산 (부분 문자열 추출 및 출력): O(N) (반복문 자체가 O(N), 각 반복 내 연산이 O(1))
따라서, 전체 프로그램의 시간 복잡도는 다음과 같이 합산됩니다:
[ O(N) + O(N) = O(N) ]
결론
이 프로그램의 시간 복잡도는 O(N)입니다. 여기서 N은 입력 문자열의 길이입니다. 이 복잡도는 주어진 문제의 조건 (문자열 길이가 100을 넘지 않음) 내에서는 매우 효율적입니다.
'여러가지 > 알고리즘 & 자료구조' 카테고리의 다른 글
[백준] 신기한 소수 찾기 - 2023번 (1) | 2024.06.10 |
---|---|
[백준] 나이트의 이동 - 7562번 (1) | 2024.06.10 |
[백준] KMP는 왜 KMP일까? - 2902번 (0) | 2024.06.01 |
동적 프로그래밍과 반대 개념 프로그래밍 (1) | 2024.05.31 |
[백준] 피보나치 수1 - 24416번 (0) | 2024.05.31 |