본문 바로가기
카테고리 없음

[Java] 단어 뒤집기

by codeok 2022. 6. 11.
반응형

단어 뒤집기 문제는 여러 방법으로 문제를 해결했다.

 

  1. StringBuilder의 reverse() 함수를 이용한 방법
  2. StringBuilder와 문자열 인덱스를 이용한 방법
  3. char[]와 swap을 이용한 방법
  4. 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" 예시의 경우

 

  1. (leftIndex = 0 , rightIndex = 3)
    • while (leftIndex < rightIndex)가 true이기에 "g", "d"  swap이 진행된다 =>  "doog"
  2. (leftIndex = 1 , rightIndex = 2)
    • while (leftIndex < rightIndex)가 true이기에 "o", "o"  swap이 진행된다 =>  "doog"
  3. (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를 사용하며 다양한 방법을 배웠다.

반응형