문제 설명
문자열 my_string이 매개변수로 주어집니다. my_string을 거꾸로 뒤집은 문자열을 return하도록 solution 함수를 완성해주세요.
제한사항
1 ≤ my_string의 길이 ≤ 1,000
입출력 예
my_string | return |
"jaron" | "noraj" |
"bread" | "daerb" |
입출력 예 #1 : my_string이 "jaron"이므로 거꾸로 뒤집은 "noraj"를 return합니다.
입출력 예 #2 : my_string이 "bread"이므로 거꾸로 뒤집은 "daerb"를 return합니다.
나의 풀이
class Solution {
public String solution(String my_string) {
if(!(1 <= my_string.length() && my_string.length() <= 1000)) throw new IllegalArgumentException("문자열 길이가 제한사항을 벗어났습니다.");
String answer = "";
for (int i = my_string.length()-1; i >= 0; i--) {
answer += my_string.charAt(i);
}
return answer;
}
}
Java에서 문자열은 이뮤터블(Immutable) 객체이다. 이뮤터블 객체는 값을 변경할 수 없는 객체를 의미한다.
String s = "abc";
System.out.println(System.identityHashCode(s)); // 1808253012
s += "def"; // ➊
System.out.println(System.identityHashCode(s)); // 589431969
System.out.println(s); // abcdef
System.identityHashCode( ) 메서드는 객체를 특정할 수 있는 식별값을 반환한다. String s의 abc에 def를 이어 붙였을뿐인데 identityHashCode( ) 메서드의 출력값이 달라졌다. 이는 “abc”값만 가지고 있던 s와 “abcdef”값을 가지고 있는 s가 서로 다른 객체임을 의미한다. 즉, String 객체의 값을 변경하는 작업은 새로운 String 객체를 만들고 값을 복사하는 작업이 수행됨을 의미한다. 따라서 ➊ s += “def”를 수행할 때 내부에서는 다음 연산이 수행된다.
1.새로운 String s 객체를 생성
2.s가 가진 “abc”값을 하나씩 복사
3.“abc” 뒤에 “def” 저장
그 결과 ➊ s += “def” 코드 한 줄에서 총 6번의 내부 연산(“abc”값 3개 복사, “def”값 3개 저장)이 수행된다. 즉 상당히 오랜 시간이 걸린다.
이러한 문제를 해결하기 위해 나온 것이 StringBuilder 클래스와 StringBuffer 클래스이다. StringBuilder 클래스와 StringBuffer 클래스는 뮤터블하므로 값을 변경할 때 시간 복잡도 관점에서 훨씬 더 효율적이다.
따라서 String의 값을 변경하는 연산이 많을 때는 효율이 높은 StringBuilder 클래스나 StringBuffer 클래스를 사용해야 한다. 두 클래스의 차이는 멀티스레드 환경에서 Thread-Safe 여부로 나뉜다. 하지만 대부분의 코딩 테스트에서는 다수의 스레드를 생성할 필요가 없다. 결론은 Thread-Safe가 없는 StringBuilder 클래스가 속도 측면에서 미세하지만 더 빠르므로 StringBuilder를 사용하면된다.
다른 풀이
참고자료
'👨💻 Coding Test' 카테고리의 다른 글
[Programmers/Java/Lv.0] 25.짝수 홀수 개수 (0) | 2024.09.25 |
---|---|
[Programmers/Java/Lv.0] 24.직각삼각형 출력하기 (0) | 2024.09.25 |
[Programmers/Java/Lv.0] 22.배열 뒤집기 (0) | 2024.09.21 |
[Programmers/Java/Lv.0] 21.나이 출력 (0) | 2024.09.21 |
[Programmers/Java/Lv.0] 20.아이스 아메리카노 (0) | 2024.09.21 |