Notice
Recent Posts
Recent Comments
Link
개발 공부~
[문자열] 특정 문자 뒤집기 .java 본문
설명
영어 알파벳과 특수문자로 구성된 문자열이 주어지면 영어 알파벳만 뒤집고,
특수문자는 자기 자리에 그대로 있는 문자열을 만들어 출력하는 프로그램을 작성하세요.
입력
첫 줄에 길이가 100을 넘지 않는 문자열이 주어집니다.
출력
첫 줄에 알파벳만 뒤집힌 문자열을 출력합니다.
예시 입력 1
a#b!GE*T@S
예시 출력 1
S#T!EG*b@a
내 풀이
알파벳과 특수문자로만 구성된 문자열에서 알파벳만 뒤집고 특수문자는 그대로 있어야한다
- 알파벳 뒤집기 = FILO -> 스택 이용
- 알파벳인지 확인 -> Character.isAlphabetic(검사할문자) 이용
- 알파벳이면 스택에 push, 특수문자면 변화 없음
- 알파벳 자리이면 스택에서 pop하여 배열 갱신
import java.util.Scanner;
import java.util.Stack;
public class Main {
public static void main(String[] args){
Scanner sc = new Scanner(System.in);
char[] chars = sc.nextLine().toCharArray();//한글자씩 배열에
Stack<Character> stack = new Stack<Character>();//알파벳만 담을 스택
for(int i=0; i<chars.length; i++){
if(Character.isAlphabetic(chars[i])){//알파벳이면
stack.push(chars[i]);//스택에 넣고
}
}
for (int i = 0; i < chars.length; i++) {
if (Character.isAlphabetic(chars[i])) {//알파벳이 들어갈 자리면
chars[i] = stack.pop();//맨 마지막에 들어간 알파벳부터 저장 -> 뒤집기
}
}
System.out.println(String.valueOf(chars));//문자열형태로 출력
}
}
다른 풀이 - 투 포인터
lt(left)는 0, rt(right)는 인덱스 마지막(길이 -1)
-> lt < rt 일때
-> 각 가리키는 문자 모두 알파벳이면 서로 교환후 lt 하나 증가, rt 하나 감소
-> 만약 특수문자면 다음으로 이동
import java.util.Scanner;
public class Main {
public String solution(String str){
char[] chars = str.toCharArray();//문자열 -> 문자 배열
int lt = 0;
int rt = chars.length - 1;
while(lt < rt) {
if(!Character.isAlphabetic(chars[lt])) {//특수문자이면
lt++;//lt 증가
} else if(!Character.isAlphabetic(chars[rt])) {
rt--;
} else{
//알파벳 서로 교환
char tmp = chars[lt];
chars[lt] = chars[rt];
chars[rt] = tmp;
//다음으로 이동
lt++;
rt--;
}
}
return String.valueOf(chars); //문자열로 반환
}
public static void main(String[] args){
Main T = new Main();
Scanner sc = new Scanner(System.in);
String str = sc.next();
System.out.println(T.solution(str));
}
}
💡
스택만 생각났었는데 투 포인터로 풀 수 있구나를 알게해준 문제다
이후 스택을 StringBuilder로 대신할 수 있다는 것도 생각나서 구현해봤다
import java.util.Scanner;
public class Main {
public static void main(String[] args){
Scanner sc = new Scanner(System.in);
char[] chars = sc.nextLine().toCharArray();//한글자씩 배열에
StringBuilder stack = new StringBuilder();//알파벳을 저장할 StringBuilder
for(int i=0; i<chars.length; i++){
if(Character.isAlphabetic(chars[i])){//알파벳이면
stack.append(chars[i]);//스택 역할: 알파벳을 저장
}
}
// 뒤집어진 알파벳을 저장할 인덱스
int idx = stack.length() - 1;
for (int i = 0; i < chars.length; i++) {
if (Character.isAlphabetic(chars[i])) {//알파벳 자리면
chars[i] = stack.charAt(idx--);//뒤집어서 저장
}
}
System.out.println(String.valueOf(chars));
}
}
'코딩테스트 > 기타' 카테고리의 다른 글
[문자열] 유효한 팰린드롬 .java (2) | 2024.09.23 |
---|---|
[문자열] 중복문자제거 .java (0) | 2024.09.08 |
[문자열] 단어 뒤집기 .java (0) | 2024.09.07 |
[문자열] 문장 속 단어 .java (3) | 2024.08.30 |
[문자열] 대소문자 변환 .java (0) | 2024.08.30 |