문제
: 영어 알파벳과 특수문자의 조합으로 이루어진 문자열에 대해서,
특수문자는 본래 위치를 유지하되 영어 알파벳만 역순으로 위치시키기
위 문제의 요구사항을 "전체 문자열 중, 영어 알파벳만 색출하여 뒤집기" 로 이해하였다.
이에 따라 문제를 해결하기 위해서는 1) 영어 알파벳 색출 / 2) 문자 역순으로 뒤집기
이 두가지 방법이 필요하다고 판단하였다.
나는 위 두 가지 방법을 아래와 같은 로직으로 구현하여 코드로 작성하였다.
1) 영어 알파벳 색출
- 일단 전체 문자열을 구성하는 각 문자 단위로 접근할 수 있어야 하므로,
String을 char 배열로 변환시켜주는 String 클래스의 인스턴스 메서드 toCharArray() 사용- 이후 영어 대문자 알파벳 문자의 아스키 코드값은 65~90,
영어 소문자 알파벳 문자의 아스키코드값은 97~122 라는 점을 이용하여
각각의 문자 중 영어 알파벳 만을 색출
2) 문자 역순으로 뒤집기
- 알파벳과 특수문자가 조합된 전체 문자열 중,
알파벳만을 색출하여 별도의 char 배열에 담은 뒤- 그 char 배열의 역순으로 접근하여 ,
원래 char 배열의 문자 자리에 - 문자를 그대로 대입
위 방법을 이용하여 문제를 해결하면, 처음 알파벳을 색출할 때 1번, 그리고 이후 역순 알파벳을 기존 문자열에 대입시킬 때 1번,
총 2번 탐색을 해야 하지만, 그럼에도 직관적인 해결 로직이라고 생각되어 이렇게 문제를 해결하였다.
실제 작성한 코드는 아래와 같다.
import java.util.Scanner;
public class Main {
public static String solution(String str){
char[] charArr = str.toCharArray();
char[] charArr2 = new char[charArr.length];
int idx = 0;
//1) 일단 전체 문자열 중에서 영어 알파벳만 순서대로 추출한 후
for (char c : charArr) {
if( (c>=65 && c<=90) || (c>=97 && c<=122))
charArr2[idx++] = c;
}
idx--; //여기서 idx값 하나를 미리 줄여줘야 - charArr2 배열에서 마지막 글자를 가리키게 된다는 점 주의!
//2) 기존 배열의 알파벳 자리에 , 추출한 문자열을 역순으로 대입
for(int i=0; i<charArr.length; i++){
if((charArr[i]>=65 && charArr[i]<=90) || (charArr[i]>=97 && charArr[i]<=122))
charArr[i] = charArr2[idx--];
}
return String.valueOf(charArr);
}
public static void main(String[] args){
//0. Scanner 준비
Scanner sc = new Scanner(System.in);
//1. 문자열 입력
String str = sc.next();
//2. solution() 호출
String output = solution(str);
//3. 변환 결과 출력
System.out.println(output);
}
}
지금까지 문자열 주제의 문제를 풀면서,
String을 char 배열로 / char배열을 String으로 변환하는 작업이 빈번하게 발생함을 느꼈다.
따라서 이에 따른 아래 두 메서드는 잘 익혀두는게 좋을 것 같았다.
1) String을 char배열로 변환
: toCharArray() - String 클래스의 인스턴스 메서드
2) char배열을 String으로 변환
: String.valueOf() - String 클래스의 static 메서드