문제 설명
영어 알파벳과 특수문자로 구성된 문자열이 주어지면 영어 알파벳만 뒤집고,
특수문자는 자기 자리에 그대로 있는 문자열을 만들어 출력하는 프로그램을 작성하세요.
입력예시: a#b!GE*T@S
출력예시: S#T!EG*b@a
문제 풀이
초기 아이디어는 입력 문자열에서 배열로 변환 후 index를 유지하면서 알파벳만 별도로 분리하고 이를 SpringBuilder 클래스를 통해 reverse하고 원래 문자열에 뒤집힌 문자를 넣어주는 방식이었다.
이를 코드로 구현하면 다음과 같다.
public String solution(String s) {
char[] result = s.toCharArray();
String alphaString = "";
for(int i = 0; i < result.length; i++) {
if((result[i] >= 65 && result[i] <= 90) || (result[i] >= 97 && result[i] <= 122)) {
alphaString += result[i];
result[i] = 0;
}
}
String reverseString = new StringBuilder(alphaString).reverse().toString();
int x = 0;
for(int i = 0; i < result.length; i++) {
if(result[i] == 0) {
result[i] = reverseString.charAt(x);
x++;
}
}
return String.valueOf(result);
}
알파벳인지를 아스킷코드를 기반으로 찾아내고 별도 변수에 담아둔다. 그리고 분리한 알파벳값은 원래 배열에서 별 의미없는 값(예를들면 0)을 넣어줬다.
이후 StringBuilder를 통해 reverse한 후 다시 for문을 돌며 아까 0으로 할당한 값들을 찾아 뒤집한 문자열의 앞에서 부터 다시 넣어주면 최종 원하는 값을 얻을 수 있다.
다른 방법으로는 아래에서 소개한 lt, rt를 활용하여 루프의 반만 돌면서 양끝을 줄여나가며 처리하는 방법이다.
4. 단어 뒤집기
문제 설명 N개의 단어가 주어지면 각 단어를 뒤집어 출력하는 프로그램을 작성하세요. 첫 줄에 자연수 N(3<=N<=20)이 주어집니다. 두 번째 줄부터 N개의 단어가 각 줄에 하나씩 주어집니다.
rara-project.tistory.com
public String solution2(String s) {
char[] arr = s.toCharArray();
int lt = 0, rt = arr.length - 1;
while(lt < rt) {
if(!Character.isAlphabetic(arr[lt])) {
lt++;
}else if(!Character.isAlphabetic(arr[rt])) {
rt--;
}else {
char temp = arr[rt];
arr[rt] = arr[lt];
arr[lt] = temp;
lt++;
rt--;
}
}
return String.valueOf(arr);
}
아이디어는 arr[lt] 혹은 arr[rt] 하나라도 알파벳이 아니라면 lt++ 혹은 rt--를 하고 이 두 경우를 제외한 경우(모두 알파벳인 경우)는 양 끝을 서로 교환하는 방식이다.
추가로 알파벳인지 여부를 확인하기 위해 Character.isAlphabetic()이라는 함수가 있다.
'알고리즘 with 자바' 카테고리의 다른 글
7. 회문 문자열 (0) | 2021.04.15 |
---|---|
6. 중복문자제거 (0) | 2021.04.15 |
4. 단어 뒤집기 (0) | 2021.04.10 |
3. 문장 속 단어 (0) | 2021.04.10 |
2. 대소문자 변환 (0) | 2021.04.09 |