문자열 문제를 풀다 보면 문자열에서 어떤 특정 부분을 찾거나 다른 문자열로 치환해야 되는 경우가 많이 있다. 문자 대소문자 변환 메서드 toUpperCase(), toLowerCase()도 치환 메서드 중 하나이다.
문자 찾기와 바꾸기
문자열 내 특정 부분을 찾는 메서드와 바꾸는 메서드를 알아보자.
문자열 포함여부를 검사하는 메서드
메서드 | 반환형 | 내용 |
contains(CharSequence s) | boolean | 전달받은 문자열이 원본 문자열에 있는지 검사 |
startsWith(String prefix) | boolean | 원본 문자열이 전달받은 문자열로 시작하는 지 검사 |
endWith(String suffix) | boolean | 원본 문자열이 전달받은 문자열로 끝나는지 검사 |
indexOf(String str) | int | 원본 문자열이 전달받은 문자열로 끝나는지 검사 |
문자열 치환 메서드
메서드 | 반환형 | 내용 |
replace(char oldChar, char newChar) | String | 원본 문자열의 oldChar 문자들을 newChar 문자로 치환한 문자열을 반환 |
replace(CharSequence target, CharSequence replacement) | String | 원본 문자열에서 등장하는 targer 문자열을 replacement 문자열로 치환해서 반환하는 메서드 |
CharSequence는 문자열을 나타내는 인터페이스이다. 그러므로 String 클래스와 StringBuilder 등 문자열을 나타내는 클래스들과 동일하다고 생각해도 무방하다.
프로그래머스 문제 풀이
https://school.programmers.co.kr/learn/courses/30/lessons/12916?language=java
1. 문자열 내 p와 y의 개수
이 문제를 푸는 방법을 생각해 보자.
1. 문자열을 모두 소문자(or 대문자)로 변환
2. "p"의 개수 세기
- 문자열에 등장하는 모든 p를 문자열 ""로 치환
- 원본 문자열과 변환된 문자열의 길이 차이로 p의 개수 구하기
3. 2와같은 방식으로 y값 개수 세기
4. 구한 p와 y 값의 개수 비교
구현 코드
class Solution {
boolean solution(String s) {
// 1. 문자열을 모두 소문자로 변환
s = s.toLowerCase();
// 2. "p"의 개수 세기
int ps = s.length() - s.replace("p", "").length();
// 3. "y"의 개수 세기
int ys = s.length() - s.replace("y", "").length();
return ps == ys;
}
}
물론 toCharArray()를 이용하며 직접 순회하는 방식도 있지만 본문의 문자열 메서드를 이용한 방식으로 구현했다고 생각하면 된다.
2. 숫자 문자열과 영단어
이 문제를 풀이 흐름을 생각해 보자.
1. 각 인덱스 값에 해당하는 영단어가 저장되어 있는 영단어 문자열 배열을 구성한다.
2. 영단어 배열을 순회하며 입력 문자열에 등장하는 모든 영단어로 치환한 문자열을 생성한다.
3. 변환된 문자열을 정수로 변환 후 반환한다.
구현 코드
import java.util.*;
class Solution {
public int solution(String s) {
String[] strArr = {"zero", "one", "two", "three", "four", "five", "six", "seven", "eight", "nine"};
for(int i = 0; i < strArr.length; i++) {
s = s.replace(strArr[i], Integer.toString(i));
}
return Integer.parseInt(s);
}
}
참조
'코딩테스트 > 이론' 카테고리의 다른 글
[JAVA] 정수와 문자열 입력값의 각 자리수 합 구하기 (0) | 2024.11.28 |
---|---|
[코딩테스트] 문자열 활용 - 문자열 뒤집기(특정단어) with Java (0) | 2024.08.30 |
[코딩테스트] 문자열 with Java (0) | 2024.08.26 |
[코딩테스트] 동적계획법과 냅색(Knapsack) 문제 (0) | 2023.09.26 |
[코딩테스트] 구현(Implement)과 dx, dy 테크닉 (0) | 2023.09.21 |