
난이도: ★★☆☆☆ • solved on: 2025-10-17

s에서 길이 k인 모든 연속된 부분 문자열(substring)을 추출하고,자료구조
String — 불변(immutable) 문자열로, substring()을 통해 부분 문자열 생성ArrayList 또는 배열 — 추출한 substring들을 저장하는 용도 (단, 공간 낭비 방지를 위해 직접 비교 가능)알고리즘/기법
compareTo() 메서드)핵심 키워드
문제 분해
s의 길이가n, 부분 문자열 길이가k라면
가능한 substring 개수는n - k + 1개이다.s.substring(i, i + k)를 이용해 모든 substring 추출.- 각 substring을 lexicographical order 로 비교하며 smallest/largest 갱신.
핵심 로직 흐름
smallest = s.substring(0, k) largest = s.substring(0, k) for i in [1, n - k]: sub = s.substring(i, i + k) if sub.compareTo(smallest) < 0: smallest = sub if sub.compareTo(largest) > 0: largest = sub
- 예외 처리
s.length() == k인 경우: substring은 하나뿐 →smallest = largest = sk > s.length()인 입력은 주어지지 않음 (문제 보장)
import java.util.*;
public class Solution {
public static String getSmallestAndLargest(String s, int k) {
String smallest = s.substring(0, k);
String largest = s.substring(0, k);
for (int i = 1; i <= s.length() - k; i++) {
String sub = s.substring(i, i + k);
if (sub.compareTo(smallest) < 0) smallest = sub;
if (sub.compareTo(largest) > 0) largest = sub;
}
return smallest + "\n" + largest;
}
public static void main(String[] args) {
Scanner scan = new Scanner(System.in);
String s = scan.next();
int k = scan.nextInt();
scan.close();
System.out.println(getSmallestAndLargest(s, k));
}
}
substring() 생성이 O(K), 총 N−K+1회 반복)i += k로 진행하면 겹치는 부분이 누락되어 오답이 됨.compareTo() 가 핵심이다.charAt(0)으로 비교하면 두 번째 문자 이후의 순서 비교가 누락된다.s.length() - k + 1개만 생성하면 되므로, index 범위를 정확히 지정하는 것이 중요하다.비슷한 유형 (GPT 추천) :
확장 문제 (GPT 추천) :