단어 뒤집기 문제는 여러 방법으로 문제를 해결했다.
- StringBuilder의 reverse() 함수를 이용한 방법
- StringBuilder와 문자열 인덱스를 이용한 방법
- char[]와 swap을 이용한 방법
- while문에 leftIndex, rightIndex를 사용하여 swap을 이용한 방법
설명
N개의 단어가 주어지면 각 단어를 뒤집어 출력하는 프로그램을 작성하세요.
입력
첫 줄에 자연수 N(3<=N<=20)이 주어집니다.
두 번째 줄부터 N개의 단어가 각 줄에 하나씩 주어집니다. 단어는 영어 알파벳으로만 구성되어 있습니다.
출력
N개의 단어를 입력된 순서대로 한 줄에 하나씩 뒤집어서 출력합니다.
예시 입력 1
3
good
Time
Big
예시 출력 1
doog
emiT
giB
StringBuilder의 reverse() 함수를 이용한 방법
처음 문제를 접근할 때 StringBuilder에 reverse()라는 함수가 있는 것을 알고 있었기에 사용해서 바로 풀었다.
해당 방법은 편하고 간단하다.
package section01.E04_단어_뒤집기;
import java.io.*;
public class Main {
public String[] solution(int n, String[] words) {
String[] answer = new String[n];
for (int i = 0; i < n; i++){
StringBuilder reverseString = new StringBuilder(words[i]).reverse();
answer[i] = reverseString.toString();
}
return answer;
}
public static void main(String[] args) throws IOException {
Main T = new Main();
BufferedReader br = new BufferedReader(new InputStreamReader((System.in)));
BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(System.out));
int n = Integer.parseInt(br.readLine());
String[] words = new String[n];
for (int i = 0; i < n; i++){
words[i] = br.readLine();
}
String[] answer = T.solution(n, words);
for (String a : answer){
bw.write(a);
bw.newLine();
}
bw.flush();
bw.close();
}
}
StringBuilder와 문자열 인덱스를 이용한 방법
StringBuilder를 이용해서 새로운 String 객체를 계속 생성하지 않고,
문자열의 끝 인덱스부터 다음과 같이 wordLength - j - 1 접근하며 문제를 해결했다.
package section01.E04_단어_뒤집기;
import java.io.*;
public class Main {
public String[] solution(int n, String[] words) {
String[] answer = new String[n];
for (int i = 0; i < n; i++){
StringBuilder reverseWord = new StringBuilder();
int wordLength = words[i].length();
for (int j = 0; j < wordLength; j++){
reverseWord.append(words[i].charAt(wordLength - j - 1));
}
answer[i] = reverseWord.toString();
}
return answer;
}
}
char[]와 swap을 이용한 방법
"good"과 같은 문자열을 각 요소에 접근하고 값을 바꾸기 위해서 toCharArray() 함수를 통해서 char[] 배열로 변경했다.
"good" 문자열에 leftIndex의 값인 "g"와 rightIndex의 값이 "d"가 같지 않을 때
swap을 진행하기 위해서 분기 처리(if (word[leftIndex] != word[rightIndex]))를 했다.
word[leftIndex]가 "o"이고 word[rightIndex]가 "o"이면 동일하기에 자리를 바꾸지 않아도 된다.
package section01.E04_단어_뒤집기;
import java.io.*;
public class Main {
public String[] solution(int n, String[] words) {
String[] answer = new String[n];
for (int i = 0; i < n; i++) {
int wordLength = words[i].length();
char[] word = words[i].toCharArray();
for (int j = 0; j < wordLength / 2; j++) {
int leftIndex = j;
int rightIndex = wordLength - j - 1;
if (word[leftIndex] != word[rightIndex]) {
char swapValue = word[leftIndex];
word[leftIndex] = word[rightIndex];
word[rightIndex] = swapValue;
}
}
answer[i] = String.valueOf(word);
}
return answer;
}
}
while문에 leftIndex, rightIndex를 사용하여 swap을 이용한 방법
leftIndex와 rightIndex를 선언해서 leftIndex가 rightIndex보다 작을 때까지 반복하게 처리했다.
"good" 예시의 경우
- (leftIndex = 0 , rightIndex = 3)
- while (leftIndex < rightIndex)가 true이기에 "g", "d" swap이 진행된다 => "doog"
- (leftIndex = 1 , rightIndex = 2)
- while (leftIndex < rightIndex)가 true이기에 "o", "o" swap이 진행된다 => "doog"
- (leftIndex = 2 , rightIndex = 1)
- while (leftIndex < rightIndex)가 false 이기에 종료된다.
package section01.E04_단어_뒤집기;
import java.io.*;
public class Main {
public String[] solution(int n, String[] words) {
String[] answer = new String[n];
for (int i = 0; i < n; i++) {
String word = words[i];
char[] splitWord = word.toCharArray();
int leftIndex = 0, rightIndex = word.length() - 1;
while (leftIndex < rightIndex){
char swapValue = splitWord[leftIndex];
splitWord[leftIndex] = splitWord[rightIndex];
splitWord[rightIndex] = swapValue;
leftIndex++;
rightIndex--;
}
answer[i] = String.valueOf(splitWord);
}
return answer;
}
}
정리
단어 뒤집기 문제를 풀어보면서 StringBuilder, char[] 배열에 직접접근, leftIndex와 rightIndex를 사용하며 다양한 방법을 배웠다.