코딩테스트

자바 문자열 문제 풀이 기록 (백준 1543)

dev-nadan 2025. 7. 22. 22:06

1. 문제 개요

오늘은 백준 문자열 문제 중에서 단어의 등장 횟수를 세는 문제를 풀었다.

1543번 - 문서 검색

단순히 문자열.contains() 같은 방식이 아니라,
겹치지 않게 몇 번 등장했는지를 세는 게 핵심 포인트였다.


2. 핵심 개념 정리

String.indexOf(String str, int fromIndex) 메서드를 활용해
앞에서부터 단어를 찾고, 찾았으면 그 뒤부터 다시 탐색하는 식으로 구현한다.

int index = 0;
int count = 0;

while (true) {
    int found = document.indexOf(word, index);
    if (found == -1) break;
    count++;
    index = found + word.length(); // 겹치지 않게 다음 위치로 이동
}
  • indexOf()는 문자열 내에서 특정 문자열의 시작 인덱스를 반환한다.
  • 두 번째 인자인 fromIndex부터 탐색을 시작할 수 있어 반복 탐색에 유용하다.
  • 문자열 탐색에서 indexOf()는 자주 쓰이는 도구다.

3. 백준 1543번 - 문서 검색

문제 설명

문서와 찾고 싶은 단어가 주어졌을 때,
문서에서 해당 단어가 겹치지 않게 몇 번 등장하는지 출력한다.

 

import java.util.Scanner;

public class Main {
    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        String document = sc.nextLine();
        String word = sc.nextLine();

        int index = 0;
        int count = 0;

        while (true) {
            int found = document.indexOf(word, index);
            if (found == -1) break;
            count++;
            index = found + word.length();
        }

        System.out.println(count);
    }
}

 


4. 배운 점 정리

  • indexOf()를 이용하면 특정 문자열이 어디서 등장하는지 알 수 있다.
  • 두 번째 인자인 fromIndex를 이용하면, 탐색 위치를 점프할 수 있어
    겹치지 않게 문자열을 세는 문제에 유용하게 쓸 수 있다.
  • 단어가 겹치지 않게 몇 번 등장했는지를 세려면, 단순한 반복문이 아니라
    문자열 탐색 흐름을 명확히 이해하는 사고방식이 필요하다.

5. 자바 문자열 문제 유형별 핵심 패턴 정리표

유형설명코드 예시
문자 하나씩 순회 문자열에서 한 글자씩 꺼내기 for (int i = 0; i < str.length(); i++)
char ch = str.charAt(i);
알파벳 개수 세기 a~z 알파벳 등장 횟수 저장 int[] count = new int[26];
count[ch - 'a']++;
대소문자 통일 대소문자 구분 없이 처리 str.toUpperCase() 또는 str.toLowerCase()
문자 → 배열 인덱스 문자를 숫자로 변환 'a' = 0 → ch - 'a'
'A' = 0 → ch - 'A'
배열 최댓값 찾기 가장 많이 나온 문자 찾기 if (count[i] > max) { max = count[i]; ... }
최댓값 중복 처리 최댓값 중복 여부 판단 else if (count[i] == max) result = '?';
문자 인덱스 → 문자 숫자 → 알파벳 문자 (char)(i + 'a') 또는 (char)(i + 'A')
문자 → 숫자 문자형 숫자를 정수로 변환 int num = ch - '0';
문자열 공백으로 나누기 단어 분리 등 split 사용 String[] words = str.split(" ");
배열 출력 알파벳 개수 전부 출력 System.out.print(count[i] + " ");
문자열 탐색 특정 문자열 찾기 str.indexOf(sub, fromIndex)
문자열 포함 여부 포함 여부만 확인 str.contains(sub)