[String] 4. 단어 뒤집기
CS/Data Structure & Algorithm

[String] 4. 단어 뒤집기

문제

설명

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

입력

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

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

출력

N개의 단어를 입력된 순서대로 한 줄에 하나씩 뒤집어서 출력합니다.

예시 입력 1 

3
good
Time
Big

예시 출력 1

doog
emiT
giB

 

직접 풀어보기

원하는 단어 수 만큼 받아오기

단어 3개를 받아온다고 가정했을 때, int num을 선언하여 이를 원하는 단어 수 변수로 설정한 후, String[] 배열을 선언하여 for문을 통해 사용자로부터 String을 받아 배열에 저장하게 한 후 이를 num 만큼 반복하였습니다.

 

단어 뒤집기

일일이 뒤집는 방법을 선택하였습니다. char[] 배열로 단어를 toCharArray()를 통해 저장하였고, answer char[] 배열을 선언하여 사이즈가 똑같게 만들어서 답을 옮길 공간을 만들었습니다. 그 후 for문을 사용하여 그림과 같은 방식으로 옮겨주었습니다.

배열 선언부와 사용할 때 []안에있는 숫자의 의미가 다름을 인지하고 있어야 합니다. 인덱스 접근 문제로 OutOfBounds 에러가 발생할 수 있습니다.

 

한계

반복할 때마다 word와 answer 배열을 계속 초기화 시켜줘야되는 단점이 있습니다. 이 경우 메모리 낭비와 시간 초과로 이어질 수 있습니다. 이를 최소화 할 수 있는 방법이 필요합니다.

import java.util.*;

class Main {
    public void solution(String[] words, int n) {

        for(int i = 0; i < n; i++) {
            char[] word = words[i].toCharArray();
            char[] answer = new char[words[i].length()];

            
            for(int j = 0; j < words[i].length(); j++) {
                answer[j] = word[words[i].length()-j-1];
            }

            answer.toString();
            System.out.println(answer);

        }
    }

    public static void main(String[] args) {
        Main m = new Main();
        Scanner in = new Scanner(System.in);

        int num = in.nextInt();
        String[] stringArr = new String[num];

        for(int i = 0; i < num; i++){
            stringArr[i] = in.next();
        }

        m.solution(stringArr, num);
    }
}

 

풀이

*. 정답 print할 때

문자열을 받고 solution에 넘길 때, ArrayList<String>를 활용하였습니다.

편의상 for each 구문을 사용해서 더 간결하게 보이기 위함입니다. 또한, solution에서 항상 return값을 반환해서 main에서 print할 수 있는 구조를 만들기 위해 사용했습니다.

public ArrayList<String> solution(String[] words, int n) {
	ArrayList<String> answer = new ArrayList<>();
    ...
    
    return answer;
}

public static void main(String[] args) {
	Main t = new Main();
    ...
    for(String x : m.solution(stringArr, num)) {
    	print
    }
}

 

1. StringBuilder의 reverse()

String을 여러개 다룰 때 쓰기 좋은 String 타입의 여러 기능들을 제공해주는 StringBuilder 클래스를 사용했습니다. 이에 StringBuilder의 reverse() 기능을 사용해 단어를 뒤집고 다시 toString()을 통해 String 객체로 바꾼 뒤 이를 반환하는 방법을 사용했습니다.

public ArrayList<String> solution(String[] words, int n) {
	ArrayList<String> answer = new ArrayList<>();
		for(String t : words) {
			String temp = new StringBuilder(t).reverse().toString();
			answer.add(temp);
		}
		return answer;
}

 

2. char[]로 한개씩 직접 뒤집기

직접 풀이 방법에서 한계점을 보완한 방법입니다. 기존에는 word와 answer 둘 다 메모리 공간에 할당되어 공간낭비가 이루어졌습니다. word에서 answer로 단어 하나씩 옮기는 방법이 아닌, word 내에서 뒤집는 방법을 선택하면 됩니다.

그림과 같이 toCharArray()를 이용해 char[] 배열로 받는 후에 처음 인덱스를 lt, 마지막 인덱스를 rt로 설정하여 이 두 인덱스에 있는 값을 temp 변수를 사용하여 switching하면 됩니다.

 

이 방법은 단순히 문자를 뒤집는 것에서 한단계 나아가 원하는 문자를 선택하여 뒤집을 수 있는 방법입니다. 이에 메서드를 사용하지 않고 순수 손코딩으로 풀어서 해결합니다.

public ArrayList<String> solution(String[] words) {
	ArrayList<String> answer = new ArrayList<>();
	for(String t : words) {
		char[] word = t.toCharArray();
		int lt = 0;
		int rt = t.length()-1;
		char temp;
		
		while(lt < rt) {
			temp = word[lt];
            word[lt] = word[rt];
            word[rt] = temp;
            
            lt++;
            rt--;
		}
			
		String answerWord = String.valueOf(word);
		answer.add(answerWord);
	}
	return answer;
}