알고리즘 공부⛏️
💡(Java)수 조작하기 2
十月
2025. 1. 21. 00:44
- 문제 설명
- 제한사항
2 ≤ numLog의 길이 ≤ 100,000
-100,000 ≤ numLog[0] ≤ 100,000
1 ≤ i ≤ numLog의 길이인 모든 i에 대해 |numLog[i] - numLog[i - 1]|의 값은 1 또는 10입니다.
- 입출력 예
- 입출력 예 설명
입출력 예 #1
result인 "wsdawsdassw"를 따라 numLog[0]에서부터 시작해 조작을 하면 numLog의 값과 순서대로 일치합니다. 따라서 "wsdawsdassw"를 return 합니다.
🤔 연속된 숫자의 차이에 따라 특정 문자열로 변환
class Solution {
public String solution(int[] numLog) {
StringBuilder answer = new StringBuilder();
for(int i = 1; i < numLog.length; i++){
int result = numLog[i] - numLog[i-1];
if(result == 1){
answer.append("w");
} else if(result == -1){
answer.append("s");
} else if(result == 10){
answer.append("d");
} else{
answer.append("a");
}
}
return answer.toString();
}
}
- StringBuilder로 answer을 선언하고 .append()로 문자열 추가
- 마지막에 toString() 으로 문자열 변환해 return
🐢 왜 StringBuilder가 더 유리할까?
- answer이 String일 경우 += "w"; 와 같은 방식을 통해
내부적으로 새 문자열 객체를 계속 생성하게 된다. - StringBuilder는 내부적으로 배열을 사용해 메모리를 재활용!
- 크기가 커지는 경우, 메모리 재할당을 효율적으로 처리하는데 최적화
(특히, 제한 사항인 numLog.length = 100,000 근처에서는 확연한 차이)
🌀 toString()
public String toString() {
return new String(value, 0, count);
}
// value : StringBuilder 내부에서 문자열을 저장하는 배열
// count : 현재 저장된 문자열의 길이
- StringBuilder 클래스는 Object 클래스의 toString() 메서드를 오버라이딩
▷ 내부에 저장된 문자열을 반환토록 구현함
StringBuilder sb = new StringBuilder();
sb.append("Hello, ");
sb.append("World!");
String result = sb.toString(); // String으로 변환
System.out.println(result); // 출력: Hello, World!
- StringBuilder 클래스는 문자열을 가변적으로 다루는 클래스이지만,
해당 문제처럼 반환 타입이 String이어야 할 경우에는 toString()을 사용
⬇️ 어떻게 동작하는지?
- StringBuilder 내부:
• StringBuilder는 문자열을 저장할 때 내부적으로 **char[] 배열**에 데이터를 저장
• 문자열 조작(append, insert 등)을 할 때, 이 배열을 가변적으로 확장/수정한다. - toString() 메소드:
• 내부의 char[] 배열 데이터를 String 객체로 변환하여 반환합니다.
• String은 불변 객체이기 때문에, toString()을 호출하면 새로운 String 객체가 생성됩니다.
⭐ 커스텀 클래스에서의 toString() 오버라이딩
class Person {
String name;
int age;
Person(String name, int age) {
this.name = name;
this.age = age;
}
@Override
public String toString() {
return "Person{name='" + name + "', age=" + age + "}";
}
}
Person p = new Person("Alice", 25);
System.out.println(p.toString());
// 출력: Person{name='Alice', age=25}
- 많이 보던 방식.. 이 또한 goString()을 오버라이딩해 활용
결론
- toString()은 모든 클래스의 기본 메소드로, Object 클래스에서 제공
- StringBuilder의 경우, 이를 오버라이드하여 저장된 문자열을 반환하도록 동작
- 실무에서는 클래스 정보를 가독성 있게 표현하기 위해 종종 toString()을 오버라이드하여 사용
🤔 또 다른 풀이
class Solution {
public String solution(int[] numLog) {
String answer = "";
for(int i = 0; i < numLog.length - 1; i++) {
answer += convert(numLog[i + 1] - numLog[i]);
}
return answer;
}
public String convert(int num) {
switch (num){
case 1: return "w";
case -1: return "s";
case 10: return "d";
case -10: return "a";
}
return "";
}
}