이 알고리즘 문제는 인프런의 자바(Java) 알고리즘 문제풀이 입문: 코딩테스트 대비(https://cote.inflearn.com/contest/10/problems) (김태원)의 문제입니다.


문제 설명

 

코드

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;

public class sec01_05 {
    public static String solution(String str) {
        char[] temp = str.toCharArray();
        int lp = 0; int rp = str.length() - 1;
        while (lp < rp){
            if(!Character.isAlphabetic(temp[lp])) ++lp;
            else if(!Character.isAlphabetic(temp[rp])) --rp;
            else {
                char tmp = temp[lp];
                temp[lp] = temp[rp];
                temp[rp] = tmp;
                ++lp; --rp;
            }
        }
        return String.valueOf(temp);
    }

    public static void main(String[] args) throws IOException {
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        System.out.println(solution(br.readLine()));
    }
}

 

설명

초기 설정

  • char[] temp = str.toCharArray();: 입력 문자열을 문자 배열로 변환한다. 문자열은 불변 객체이므로, 배열로 변환하여 개별 문자에 접근하고 수정하기 위함이다.
  • int lp = 0; int rp = str.length() - 1;: 두 개의 포인터 lp와 rp를 설정한다. lp는 배열의 시작을, rp는 배열의 끝을 가리킨다.

 

반복문

  • while (lp < rp): 두 포인터가 교차할 때까지 반복한다.
  • if (!Character.isAlphabetic(temp[lp])) ++lp;: lp가 가리키는 문자가 알파벳이 아니면 lp를 오른쪽으로 이동한다.
  • else if (!Character.isAlphabetic(temp[rp])) --rp;: rp가 가리키는 문자가 알파벳이 아니면 rp를 왼쪽으로 이동한다.
  • else: 두 포인터가 가리키는 문자가 모두 알파벳이면 두 문자를 교환하고, lp와 rp를 각각 오른쪽과 왼쪽으로 이동한다.

 

문자열 변환

  • return String.valueOf(temp);: 변환된 문자 배열을 문자열로 다시 변환하여 반환한다.

 

char[]의 toString() 메서드

char[] 배열에 대해 toString() 메서드를 호출하면, 배열의 요소를 문자열로 변환하는 것이 아니라, 배열 객체의 메모리 주소를 나타내는 해시코드를 포함한 문자열을 반환하게 된다.
이는 Object 클래스의 toString() 메서드가 호출되기 때문이다.
char[] 배열은 Object 클래스를 상속받기 때문에, 특별히 오버라이드된 toString() 메서드가 없다면 기본적으로 Object의 toString() 메서드가 사용된다.