1. 문제 개요
오늘은 백준에서 문자열 관련 입문 문제 2개를 풀었다.
- 10808번 - 알파벳 개수
- 1157번 - 단어 공부
문제를 풀면서 자바에서 문자열을 다루는 기본 방법과,
특히 알파벳 개수를 배열로 세는 방식을 확실히 익힐 수 있었다.
2. 핵심 개념 정리
문자열에서 알파벳 개수를 세는 기본 패턴
int[] count = new int[26];
for (int i = 0; i < str.length(); i++) {
char ch = str.charAt(i); count[ch - 'a']++;
}
- 알파벳은 총 26개 (a~z)
- 'a'는 아스키코드 97 → 'a' - 'a' = 0, 'b' - 'a' = 1 ...
- 배열의 인덱스를 알파벳에 대응시켜 개수를 저장할 수 있음
대소문자 구분 없이 처리하려면?
String upper = str.toUpperCase();
count[upper.charAt(i) - 'A']++;
3. 백준 10808번 - 알파벳 개수
문제 설명
주어진 문자열에서 알파벳 a부터 z까지 각각 몇 번 등장했는지 출력한다.
출력은 공백으로 구분된 숫자 26개.
코드
import java.util.Scanner;
public class Main {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
String s = sc.next();
int[] count = new int[26];
for (int i = 0; i < s.length(); i++) {
count[s.charAt(i) - 'a']++;
}
for (int i = 0; i < 26; i++) {
System.out.print(count[i] + " ");
}
}
}
4. 백준 1157번 - 단어 공부
문제 설명
주어진 영어 단어에서 가장 많이 등장한 알파벳을 출력한다.
여러 개일 경우 ?를 출력하고, 대소문자는 구분하지 않는다.
핵심 포인트
- toUpperCase()로 대소문자 통일
- 알파벳 개수 배열 만들기
- 최댓값을 찾아 중복 여부 판단
import java.util.Scanner;
public class Main {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
String a = sc.next().toUpperCase();
int[] count = new int[26];
for (int i = 0; i < a.length(); i++) {
count[a.charAt(i) - 'A']++;
}
int max = -1;
char result = '?';
for (int i = 0; i < 26; i++) {
if (count[i] > max) {
max = count[i];
result = (char)(i + 'A');
} else if (count[i] == max) {
result = '?';
}
}
System.out.println(result);
}
}
5. 배운 점 정리
- 알파벳 개수를 세는 문제는 자바 배열을 활용하면 쉽게 해결할 수 있다.
- 문자를 배열 인덱스로 변환할 때 'a', 'A'를 기준으로 빼주는 방식은 매우 유용하다.
- 최댓값을 찾고, 중복 여부를 조건문으로 판단하는 패턴도 코딩테스트에서 자주 쓰인다.
6. 자바 문자열 문제 유형별 핵심 패턴 정리표
문자 하나씩 순회 | 문자열에서 한 글자씩 꺼내기 | 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]; ... } |
최댓값 중복 처리 | max값 중복이면 ? 출력 | 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] + " "); |
'코딩테스트' 카테고리의 다른 글
[코딩 테스트 문제 풀이 시리즈] 10431번 - 줄세우기: 직접 구현부터 삽입 정렬 개념까지 (2) | 2025.07.27 |
---|---|
자바 배열 문제 풀이 기록 (백준 1236 - 성지키기) (2) | 2025.07.25 |
알고리즘에서 꼭 나오는 시간복잡도 정리 (2) | 2025.07.23 |
자바 문자열 문제 풀이 기록 (백준 13223, 11718, 11654, 2525) (4) | 2025.07.23 |
자바 문자열 문제 풀이 기록 (백준 1543) (1) | 2025.07.22 |