영어 알파벳과 특수문자로 구성된 문자열이 주어지면 영어 알파벳만 뒤집고,
특수문자는 자기 자리에 그대로 있는 문자열을 만들어 출력하는 프로그램을 작성하세요.
첫 줄에 길이가 100을 넘지 않는 문자열이 주어집니다.
첫 줄에 알파벳만 뒤집힌 문자열을 출력합니다.
a#b!GE*T@S
S#T!EG*b@a
import java.util.*;
import java.util.stream.Collectors;
public class Main {
public String solution(String str){
char[] ch = str.toCharArray();
List<Character> chArr = new ArrayList<>();
for(char c : ch){
if('a'<=c && c<='z' || 'A'<=c&&c<='Z'){
chArr.add(c);
}
}
Collections.reverse(chArr);
String answer = "";
int i=0;
for(char c : ch){
if('a'<=c && c<='z' || 'A'<=c&&c<='Z'){
answer+=chArr.get(i);
i++;
}
else{
answer+=c;
}
}
return answer;
}
public static void main(String[] args){
Main T = new Main();
Scanner sc = new Scanner(System.in);
String str = sc.nextLine();
System.out.println(T.solution(str));
}
}
문자열을 받은후 char로된 array로 변형
각 char를 조사해서 알파벳인경우만 빈 arr에 추가후에 리버스를 해준다.
다시 array를 조사해서 알파벳인경우만 새로생성한 arr에서 하나씩 조회해서 알파벳만 거꾸로 출력해준다.
import java.util.*;
class Main {
public String solution(String str){
String answer;
char[] s=str.toCharArray();
int lt=0, 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));
}
}
탐색 위치를 두개로 둔상태로 진행한다.
lt는 맨왼쪽 rt는 맨 오른쪽을 둔상태로 알파벳을 만날때까지 움직인다. 둘다 알파벳인경우 둘의 위치를 바꿔준다.
lt<rt라는 조건문을 통해서 엇갈리게되면 그만두게된다.