본문 바로가기

알고리즘 with 자바

4. 단어 뒤집기

문제 설명

N개의 단어가 주어지면 각 단어를 뒤집어 출력하는 프로그램을 작성하세요.

첫 줄에 자연수 N(3<=N<=20)이 주어집니다.

두 번째 줄부터 N개의 단어가 각 줄에 하나씩 주어집니다. 단어는 영어 알파벳으로만 구성되어 있습니다.

 

입력예시:

3

good

Time

Big

 

출력예시:

doog

emiT

giB

문제 풀이

초기 아이디어는 charAt()을 사용해서 뒤에서 부터 for문으로 돌며 문자열을 붙이는 방법이었다.

public String[] solution(String[] arr) {
	
	String[] result = new String[arr.length];
	int x = 0;
	for(String s : arr) {
		
		String temp = "";
		
		for(int i = s.length()-1; i >= 0; i--) {
			temp += s.charAt(i);
		}
		
		result[x] = temp;
		x++;
	}
	
	return result;
}

 

살짝은 무식한 방법인거 같고.... 생각해 보니 StringBuilder Class에 reverse() 기능을 활용할 수 있다.

 

String과 StringBuilder의 차이점은 String은 불변(immutable)의 속성을 갖는 차이가 있음
즉, String을 사용하면 이후 변경되는 String값은 새로운 메모리에 올라가고 이전 값은 GC 대상이 되어 어플리케이션 성능관점에서 효율적이지 못함
StringBuilder와 StringBuffer의 차이점은 동기화 지원 여부의 차이로 동기화 처리를 고려해야 하는 멀티스레드 환경에서는 StringBuffer를 사용 해야함 (단, StringBuilder가 빠름)
public String[] solution2(String[] arr) {
	
	String[] result = new String[arr.length];
	int x = 0;
	
	for(String s : arr) {
		result[x] = new StringBuilder(s).reverse().toString();
		x++;
	}
	
	return result;
}

 

단, 전체 reverse가 아닌 부분 변경 등의 디테일한 요구사항이 나온다면 결국 문자 하나하나를 다뤄야 하는데, 첫번째 방법보단 아래의 방법이 시간복잡도 측면에서 좋을것 같음 (한번 처리에 양끝을 동시에 처리하기에 loop를 반만 수행함)

public String[] solution3(String[] arr) {
	
	String[] result = new String[arr.length];
	int x = 0;
	for(String s : arr) {
		
		char[] charArr = s.toCharArray();
		int lt = 0, rt = s.length() - 1;
		
		while(lt < rt) {
			char temp = charArr[lt];
			charArr[lt] = charArr[rt];
			charArr[rt] = temp;
			
			lt++;
			rt--;
		}
		result[x] = String.valueOf(charArr);
		x++;
	}
	
	return result;
	
}

'알고리즘 with 자바' 카테고리의 다른 글

6. 중복문자제거  (0) 2021.04.15
5. 특정 문자 뒤집기  (0) 2021.04.11
3. 문장 속 단어  (0) 2021.04.10
2. 대소문자 변환  (0) 2021.04.09
1. 문자 찾기  (0) 2021.04.09