본문 바로가기

알고리즘 with 자바

5. 특정 문자 뒤집기

문제 설명

영어 알파벳과 특수문자로 구성된 문자열이 주어지면 영어 알파벳만 뒤집고,

특수문자는 자기 자리에 그대로 있는 문자열을 만들어 출력하는 프로그램을 작성하세요.

 

입력예시: 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를 활용하여 루프의 반만 돌면서 양끝을 줄여나가며 처리하는 방법이다.

rara-project.tistory.com/7

 

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