개요와 목적
자바의 문자열 문제를 풀면서, 문자열을 다루는 기능들에 대해서 알아보자.
문제 1. 대소문자 변환
String str = “SpEdCaR” 문자열 str의 각 알파벳을 소문자는 대문자로 대문자는 소문자로 바꿔보자.
풀이
public class Main{
public static void main(String[] args){
String str = "SpEdCaR";
char[] chars = str.toCharArray();
StringBuilder sb = new StringBuilder();
for (char c : chars) {
if (Character.isLowerCase(c)) {
sb.append(Character.toUpperCase(c));
} else {
sb.append(Character.toLowerCase(c));
}
}
System.out.println(sb.toString());
}
}
설명
Character 클래스 메소드 중에 해당 Char이 소문자인지 판단해주는 메소드를 사용하고, Char를 대 소문자로 변형해주는 메소드를 사용하면 된다.
String class를 변형시킬 때는, String Array보다, CharArray로 만들어서 해결하는 것이 좋다. 각 단어를 Char로 분리하면 Character Class로 할 수 있는 게 많아진다.
isDigit, isAlphabetic 같은 기능들
문제 2. 단어 뒤집기
String str =”DAMAGE”의 뒤집어 보기
풀이
String answer = new StringBuilder(str).reverse().toString();
StringBuilder를 사용하면, 문장을 뒤집을 수 있다.
StringBuild의 추가적 기능들
append(뒤에 문자 추가), delete(원하는 위치 삭제), insert(원하는 위치에 문자 추가), indexOf(문자 위치 찾기) 등등
문제 3. 특정 문자 뒤집기
a#b!GE*T@S
풀이
tocharArray와 Character.isAlphabetic를 사용해서 각 단어들이 알파벳인지 아닌지 파악한다.
lt rt 알파벳 지점인 것을 확인 한 후에 서로의 위치를 바꾼다.
그리고 rt가 lt 보다 커질 때까지 반복한다.
import java.util.Scanner;
public class 특정문자뒤집기 {
public static String solution(String str) {
char[] s = str.toCharArray();
int lt = 0;
int rt = s.length - 1;
while (lt < rt) {
if(!Character.isAlphabetic(s[lt])) lt++;
else if(!Character.isAlphabetic(s[rt])) rt--;
else{
//lt와 rt가 지칭하는 char이 모두 알파벳일 때, 서로 교환한다.
char tmp=s[lt];
s[lt]=s[rt];
s[rt]=tmp;
lt++;
rt--;
}
}
return String.valueOf(s);
}
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
String str = sc.next();
System.out.println(solution(str));
}
문제 4. 중복 문자 제거 가장 처음 발견되는 문자 발견하기
ksekkset
풀이
Stirng.indexOf()는 파라미터로 들어온 char이 String에서 가장 처음 존재하는 위치를 알려준다.
예를 들어서, Strings str =”abcb”가 있을 때 str.indexOf(’b’)를 입력하면 b가 가장 처음 등장하는 index 1 을 반한다. 해당 메소드를 사용해서 푼다.
import java.util.Scanner;
public class 중복문자제거 {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
String str = sc.next();
String answer = "";
for (int i = 0; i < str.length(); i++) {
//해당 문자열의 각 문자가 가장 처음 등장하는 알파벳이라면 answer에 추가한다.
if (str.indexOf(str.charAt(i)) == i) {
answer += str.charAt(i);
}
}
System.out.println(answer);
}
}
문제 5. 유효한 팰린드롬(알파벳만 남기기+정규식 사용)
“found7, time: study; Yduts; emit, 7Dnuof” 해당 문자열을 알파벳인 것만 놔두고 나머지를 지운 문자열을 구해라 (대소문자 구분할 필요 없다)
풀이
public class Main{
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
String str = sc.nextLine();
String answer = str.toUpperCase().replaceAll("[^A-Z]", "");
System.out.println(answer);
//FOUNDTIMESTUDYYDUTSEMITDNUOF
}
}
문제 6. 가장 짧은 문자 거리
teachermode e
풀이
public class Main{
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
String s = sc.next();
char t = sc.next().charAt(0);
int[] answer = new int[s.length()];
int p = 100;
for (int i = 0; i < s.length(); i++) {
if (s.charAt(i) == t) {
p = 0;
}
answer[i] = p;
p++;
}
System.out.println(Arrays.toString(answer));
p = 100;
for (int i = s.length()-1; i >=0 ; i--) {
if (s.charAt(i) == t) {
p = 0;
}
answer[i] = Math.min(answer[i], p);
p++;
}
System.out.println(Arrays.toString(answer));
}
}
문제 7. 문자열 압축 하기
KKHSSSSSSSE
풀이
import java.util.Scanner;
public class 문자열압축 {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
String str = sc.next();
String answer = "";
String s = str + " ";
int cnt = 1;
for (int i = 0; i < str.length(); i++) {
if (s.charAt(i) == s.charAt(i + 1)) {
cnt++;
} else {
answer += s.charAt(i);
if (cnt > 1) {
answer += String.valueOf(cnt);
}
cnt = 1;
}
}
System.out.println(answer);
}
}
'자바 자료구조 알고리즘 > 문자열 & 배열 & 투포인터 & 정렬' 카테고리의 다른 글
코딩 테스트 Java 정렬 문제 풀이 (0) | 2023.05.06 |
---|---|
코딩테스트 Java 투 포인터 문제 풀이 (0) | 2023.05.03 |
코딩 테스트 Java 배열 문제 풀이 (0) | 2023.05.02 |