영어 알파벳과 특수문자로 구성된 문자열이 주어지면 영어 알파벳만 뒤집고,
특수문자는 자기 자리에 그대로 있는 문자열을 만들어 출력하는 프로그램을 작성하세요.
첫 줄에 길이가 100을 넘지 않는 문자열이 주어집니다.
첫 줄에 알파벳만 뒤집힌 문자열을 출력합니다.
string이 들어오면 문자배열로 만들어준다.
먼저 가장 앞에 있는 index를 lt, 마지막 index를 rt로 놓는다.
lt가 가리키는게 알파벳인지, 특수문자인지,를 확인한다.
lt가 가리키는 것도 알파벳이고 rt가 가리키는 것도 알파벳이면 교환하는 것이다.
그리고 동시에 lt++, rt-- 된다.
lt, rt가 가리키는 것이 알파벳이 아니면 그냥 lt++, rt--된다.
while문 돌면서 if돌릴건데, lt == 특수문자 면 lt++
elseif rt == 특수문자 면 rt--,
else 교환 후 lt++, rt--
또 다시 while돌리고,, lt>rt되면 break되는거다.
string을 받는다.
String str = kb.next();
string을 character배열로 만들어야한다. 문자배열이 하나 만들어진다.
char[] s = str.toCharArray();
lt, rt를 정의해준다.
int lt = 0;
int rt = str.length() - 1;
while문 걍 외워놓자. 이런 형태의 문제 많이 나올거다.
while (lt < rt) {
알파벳이 아니면,(특수문자면)
if (!Character.isAlphabetic(s[lt])) {
lt++;
} else if (!Character.isAlphabetic(s[rt])) {
rt--;
} else {
char tmp = s[lt];
s[lt] = s[rt];
s[rt] = tmp;
lt++;
rt--;
}
}
answer에다가 strng화 시켜준다.
answer = String.valueOf(s);
package string;
import java.util.Scanner;
public class Main {
public String solution(String str) {
String answer;
char[] s = str.toCharArray();
int lt = 0;
int rt = str.length() - 1;
while (lt < rt) {
if (!Character.isAlphabetic(s[lt])) {
lt++;
} else if (!Character.isAlphabetic(s[rt])) {
rt--;
} else {
char tmp = s[lt];
s[lt] = s[rt];
s[rt] = tmp;
lt++;
rt--;
}
}
answer = String.valueOf(s);
return answer;
}
public static void main(String[] args) {
Main T = new Main();
Scanner kb = new Scanner(System.in);
String str = kb.next();
System.out.println(T.solution(str));
}
}
[개인적인 생각]
처음 문제를 봤을 때
1. 문자와 특수문자를 나누기
2. 특수문자는 문자와 인덱스를 저장, 문자는 문자만 따로 임시저장
3. 문자는 StringBuilder의 reverse로 뒤집기
4. 둘이 합치는 과정에서 순서만 맞게 저장
이렇게 할 계획이었는데 답을 보니 내가 복잡하게 생각했던 것 같다.
좀 더 알고리즘을 공부하고 연습해야겠다.