성장일기

내가 보려고 정리하는 공부기록

코딩테스트/프로그래머스 Lv.0

[프로그래머스] 문자열 여러 번 뒤집기 (String.valueOf vs toString) - JAVA

와나나나 2023. 7. 13. 12:32
728x90

프로그래머스 _ 코딩 기초 트레이닝 DAY 8 - (5)

출처 - https://school.programmers.co.kr/learn/courses/30/lessons/181913

 

프로그래머스

코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.

programmers.co.kr

 

문제 |  문자열 my_string과 이차원 정수 배열 queries가 매개변수로 주어집니다. queries의 원소는 [s, e] 형태로, my_string의 인덱스 s부터 인덱스 e까지를 뒤집으라는 의미입니다. my_string에 queries의 명령을 순서대로 처리한 후의 문자열을 return 하는 solution 함수를 작성해 주세요.

입력 #1 |my_string = "rermgorpsam" , queries = [[2, 3], [0, 7], [5, 9], [6, 10]]

출력 #1 | "programmers"

 


>> 풀이 << 

원래는 stringbuilder의 replace, substring, reverse 등 메소드를 활용하여 문제를 풀려고 했으나 생각보다 복잡해져서 for문을 활용하는 방식으로 풀이를 변경했다.

 

queries의 범위가 [i,j] 라고 한다면, i와 j, i+1과 j-1... 이렇게 변경하므로  swap 횟수는 (i+j) / 2 번이다! 즉 for문을  (i+j) / 2번 반복하게 하면 된다. 마지막으로는 char형 배열을 String으로 바꾸어주기 위해 String.valueOf()를 사용하였다.


class Solution {
    public String solution(String my_string, int[][] queries) {
        
        char[] arr = my_string.toCharArray();
        char a;
        for (int i = 0 ; i < queries.length ; i++) {
            int spoint = queries[i][0];
            int epoint = queries[i][1];
            
            for (int j = spoint ; j <= (spoint + epoint)/2 ; j++) {
                a = arr[j];
                arr[j] = arr[epoint+spoint-j];
                arr[epoint+spoint-j] = a;
            }
        }
        return String.valueOf(arr);
    }
}

 

그런데!!

String.valueOf()를 arr.toString() 으로 바꿔봤는데 아래와 같이 값이 반환되었다.

음... ASCII 코드인가 ..?

String.valueOf() 와 .toString() 모두 문자열로 반환해주는 메소드라고 알고 있었는데 결과값이 다른 것을 볼 수 있었다. 그래서 이 둘의 차이점을 찾아보았다.

 

차이점을 비교해서는 저 궁금증을 해결할 수 없었지만, 그래도 둘의 차이점을 보면 null에 대한 처리 방식에 차이가 있음을 알 수 있었다.

  • toString() 은 null값을 문자열로 형변환 할 때 에러가 발생한다. (NullPointerException)
  • String.valueOf() 는 null값에 사용하면 문자열 "null" 이 반환된다.

 

그러면 결론적으로 왜 저런 값이 리턴되었나?

toString() 메소드 내부

 

아스키코드가 아니라 구현된대로 객체의 정보가 반환된 거였다..!! 

객체를 출력할 때는 자동으로 toString()을 붙여 출력되며, 객체에 toString을 사용하면 위 사진처럼 객체의 정보가 리턴되는 것이었다! 그래서 toString()을 사용하고 싶으면 오버라이딩을 통해 재정의 해서 사용하면 된다.

이때 protectedpublic으로 설정해야 오버라이딩이 가능하다!

 

내 코드가 저렇게 출력된 이유는 toString()이 배열 내 원소를 스트링화 한 것이 아니라,  배열 자체를 문자열로 변환했기 때문이다.

 

 

사진, 정보 참고 - https://inpa.tistory.com/entry/JAVA-%E2%98%95-toString-%EB%A9%94%EC%84%9C%EB%93%9C-%EC%9E%AC%EC%A0%95%EC%9D%98-%EC%99%84%EB%B2%BD-%EC%9D%B4%ED%95%B4%ED%95%98%EA%B8%B0

 

☕ 자바 toString 오버라이딩 - 완벽 이해하기

toString 메소드 기본적으로 Object 클래스의 toString() 메소드는 해당 인스턴스에 대한 정보를 문자열로 반환한다. 이 메서드는 인스턴스에 대한 정보를 문자열로 제공할 목적으로 정의되어 있는 것

inpa.tistory.com