개발놀이터

1-4. 단어 바꾸기 본문

기타/코딩테스트

1-4. 단어 바꾸기

마늘냄새폴폴 2023. 2. 7. 15:56

 

package string.flipword14.my;

import java.util.Scanner;

public class Main {

    /**
     * 으아아아아아아아 맞췄다아아아아아아아아아아아아아
     */

    /**
     * case1:
     * StringBuilder 클래스의 reverse 를 이용하면 정말 쉽게 풀린다.
     * 내가 푼 방법은 정말 원시적인 리버스이고 선생님이 푼 방식이 정말 깔끔한 리버스이다 다시 복습할 것
     *
     * case2:
     * 1. String 문자열을 toCharArray 로 char 배열로 바꾼다.
     *
     * 2. lt, rt 의 개념 도입
     * cf) lt, rt 란?
     * 예를 들어 study 라는 문자열을 char 배열로 바꾸면
     * 0 1 2 3 4
     * s t u d y
     * 이렇게 바뀐다.
     *
     * 여기서
     * lt      rt            lt  rt
     * 0 1 2 3 4     -->   0 1 2 3 4
     * s t u d y     -->   s t u d y
     *
     * 이렇게 lt 와 rt 를 lt 는 오른쪽 rt 는 왼쪽으로 한칸씩 움직인다.
     *
     * 3. A 와 B 의 자리를 바꿀 때 tmp 의 개념을 도입해 바꿔준다.
     * ex)
     * tmp = A
     * A = B
     * B = tmp
     *
     * 4. 마지막으로 lt 는 ++ rt 는 -- 로 값을 변경해준다 (lt 는 오른쪽으로 한칸 rt 는 왼쪽으로 한칸 이동)
     *
     * 5. 해당 반복문은 while 문으로 조건식은 lt < rt 이다.
     */

    public static void main(String[] args) {
        Scanner kb = new Scanner(System.in);
        int line = kb.nextInt();
        String array[] = new String[line];
        for (int i = 0; i < line; i++) {
            String input = kb.next();
            array[i] = input;
        }

        for (int i = 0; i < line; i++) {
            String[] solution = solution(line, array[i]);
            System.out.println(solution[i]);
        }
    }

    private static String[] solution(int line, String input) {
        String answer[] = new String[100];

        for (int i = 0; i < line; i++) {
            String answerWord = "";
            for (int j = 0; j < input.length(); j++) {
                char c = input.charAt(input.length() - j - 1);
                answerWord += c;
            }
            answer[i] = answerWord;
        }
        return answer;
    }
}

 

맞추긴 했지만 정말 구질구질하게 풀어낸 문제라 정말 아쉬움

 

StringBuiilder 클래스의 reverse를 사용하면 정말 간단하게 풀리는 문제

 

StringBuilder 클래스는 모든 문자열을 뒤집을 때 사용하면 정말 편하지만 특정 문자를 뒤집고 싶을 때는 주석에 나와있는 대로 lt (left) 와 rt (right) 를 도입하여 수동으로 리버스 해야함

 

이 다음 문제에서 사용하기 때문에 반드시 알아야 하는 풀이방식

 

또한 tmp 를 통해 A 와 B 의 값을 뒤바꾸는 알고리즘은 정말 기초적인 부분이니 꼭 숙지하도록 하자

 

위에서 작성한 주석과 선생님의 풀이를 꼼꼼히 볼 것

 

package string.flipword14.teacher;

import java.util.ArrayList;
import java.util.Scanner;

public class Main {

    private static ArrayList<String> solution(int n, String[] str) {
        ArrayList<String> answer = new ArrayList<>();

        /**
         * StringBuilder 클래스를 이용해서 전체 단어 뒤집기
         */
        for (String x : str) {
            String tmp = new StringBuilder(x).reverse().toString();
            answer.add(tmp);
        }

        /**
         * lt 와 rt 를 도입하여 수동으로 뒤집는 방법
         */
        for (String x : str) {
            char[] s = x.toCharArray();
            int lt = 0, rt = x.length();

            while (lt < rt) {
                char tmp = s[lt];
                s[lt] = s[rt];
                s[rt] = tmp;
                lt++;
                rt--;
            }
            String tmp = String.valueOf(s);
            answer.add(tmp);
        }

        return answer;
    }

    public static void main(String[] args) {
        Scanner kb = new Scanner(System.in);
        int n = kb.nextInt();
        String[] str = new String[n];

        for (int i = 0; i < n; i++) {
            str[i] = kb.next();
        }

        for (String x : solution(n, str)) {
            System.out.println(x);
        }
    }
}

 

'기타 > 코딩테스트' 카테고리의 다른 글

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