본문 바로가기

코딩테스트

문자열 뒤집기

못풀었음

 

substring() 까지만 생각났었음

언젠가 해본적 있는데 기억나지 않았다

 

깔끔하게 다시 공부하는쪽으로 가자

 

총 6가지 방법을 공부한다


For문을 활용해서 문자열 뒤집기

    public void test1() {
        String s1 = "java is my life";
        String s2 = "";

        System.out.println("s1.length() = " + s1.length());

        for(int i = s1.length() - 1; i >= 0; i--) { // i는 s1의 길이 -1부터 시작. i가 0이 될때까지
            s2 = s2 + s1.charAt(i); // String에서 특정 위치의 문자열을 특정하는 charAt 메서드
            System.out.println("s2 : " + s2);
        }

        System.out.println("reversed String of the " + s1 + " is " + s2);
        System.out.println(s2);
    }

 

charAt() 메서드를 활용해서 문자열을 뒤집음

 

메서드보다 중요하다고 생각되는건 for문의 식에 대해서인데,

초기식을 int i = s1.length() - 1 로 지정해준다

그리고 조건식을 i >= 0으로 해주고, 증감식을 i--로 지정해주면 s1.length() - 1 부터 0까지 for문을 돌릴 수 있다

 

이후 미리 정의해둔 String 타입인 s2에 s1에 있는 문자열을 뒤에서부터 넣어주는데,

이 때 s2 이후에 s1.charAt(i)를 더해주면 아래와 같은 형태로 반복문이 돌아갈 것이다

 

// s2 + s1.charAt(i)

"" + 'e' = "e"
"e" + 'f' = "ef"
"ef" + 'i' = "efi"
"efi" + 'l' = "efil"
"efil" + ' ' = "efil "
"efil " + 'y' = "efil y" // ...

StringBuilder를 활용하여 문자열 뒤집기

    public void test2() {
        StringBuilder s1 = new StringBuilder("스프링");
        System.out.println("s1 = " + s1);
        StringBuilder s2 = new StringBuilder("프레임워크");
        System.out.println("s2 = " + s2);
        StringBuilder s3 = new StringBuilder("라이브러리");
        System.out.println("s3 = " + s3);

        System.out.println("reversed String of the " + s1 + " is " + s1.reverse());
        System.out.println("reversed String of the " + s2 + " is " + s2.reverse());
        System.out.println("reversed String of the " + s3 + " is " + s3.reverse());
    }

 

StringBuilder라는 클래스가 있다

얘는 문자열을 '수정하면서' 쓰는 도구라고 한다. 가변 객체라고 함

 

String은 불변이며, 얘 안의 문자열이 바뀌면 새로운 객체를 생성한다

StringBuilder는 가변이며, 같은 객체 안에서 계속 수정이 이루어진다

그래서 반복문이나 문자열을 조립할땐 일반적으로 StringBuilder를 사용한다고 한다

 

이 StringBuilder 클래스 안에 reverse()라고 하는 메서드가 있다

StringBuilder만 따로 정리해서 올려보자

 


재귀를 활용해서 문자열 뒤집기

    public String ReverseStringTest(String str) {
        if(str.isEmpty()) {
            System.out.println("자바입니다");
            return str;
        } else {
            return ReverseStringTest(str.substring(1)) + str.charAt(0);
        }
    }

 

substring() 메서드와 charAt() 메서드를 활용한 방법

 

// 과정
// ReverseStringTest(str.substring(1)) + str.charAt(0)
// 조건문에 막힐때까지 해당 메서드를 재귀적으로 호출한다
"바입니다" + '자' = "바입니다자"
"입니다" + '바' + '자' = "입니다바자"
"니다" + '입' + '바' + '자' = "니다입바자"
"다" + '니' + '입' + '바' + '자' = "다니입바자"

 

String + char형은 자동적으로 String이 된다

 

 

 

재귀를 활용한 또다른 방법

    public static String reverseString(String str) {
        if(str.length() == 1) {
            return str;
        }
        return str.charAt(str.length() - 1) + reverseString(str.substring(0, str.length() - 1));
    }

 

재귀를 뒤에서 반복하는 메서드이다


배열을 활용한 문자열 뒤집기

    public String test3(String str) {
        if(str == null || str.equals("")) {
            return str;
        }

        int length = str.length();
        char[] newArr = new char[length];

        for(int i = 0; i < length; i++) {
            newArr[length - i - 1] = str.charAt(i);
        }
        return String.valueOf(newArr);
    }

 

배열을 선언하고 반복문을 활용하여 새로운 배열에 배열 끝에서부터 차례대로 char형 문자를 넣는 방식

 

이 방식은 배열의 길이가 정해져있을 때 사용하는게 좋다

그렇지 않으면 에러가 터질 수 있음


Stream을 활용한 문자열 뒤집기

 

솔직히 이건 개에바라고 생각하는데, 공부용으로 좋음

    public String test4(String str) {
        return str.chars() // 문자열을 int 스트림으로 변환하기, chars()이긴한데 유니코드 값으로 나온다
                .mapToObj(c -> (char)c) // int를 char형으로 다시 변환함
                .collect(StringBuilder::new, StringBuilder::append, StringBuilder::append)
                .reverse()
                .toString();
    }

 

Stream과 StringBuilder를 활용해서 정말 비효율적으로 문자열을 뒤집는 방법

하지만 이러한 방법은 공부가 되기 때문에 참고하는 것이 좋다

 

StringBuilder는 이후에 따로 게시글을 작성해서 정리해두겠다!


스택을 활용한 문자열 뒤집기

    public String test5(String str) {
        Stack<Character> stack = new Stack<>();
        for(int i = 0; i < str.length(); i++) {
            stack.push(str.charAt(i));
        }
        StringBuilder sb = new StringBuilder();
        while (!stack.isEmpty()) {
            sb.append(stack.pop());
        }
        return sb.toString();
    }

 

스택에 대해서는 다시 공부해야한다

 

코테 고난이도 문제에서 스택, 큐와 관련된 문제들이 자주 출제될 수 있기 때문

 


참고한곳

https://velog.io/@jmjgirl/JAVA-%EB%AC%B8%EC%9E%90%EC%97%B4-%EB%92%A4%EC%A7%91%EA%B8%B0-reverse

https://hianna.tistory.com/543

https://codegym.cc/ko/groups/posts/ko.1015.html

 

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

문자 반복 출력하기  (0) 2026.04.22
짝수 홀수 개수  (0) 2026.04.22
배열 뒤집기  (0) 2026.04.12
나이 출력  (0) 2026.04.10
아이스 아메리카노  (0) 2026.04.07