알고리즘 공부⛏️

💡(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()을 사용

 

⬇️ 어떻게 동작하는지?

  1. StringBuilder 내부:
    • StringBuilder는 문자열을 저장할 때 내부적으로 **char[] 배열**에 데이터를 저장
    문자열 조작(append, insert 등)을 할 때, 이 배열을 가변적으로 확장/수정한다.
  2. 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()을 오버라이딩해 활용

결론

  1. toString()모든 클래스의 기본 메소드로, Object 클래스에서 제공
  2. StringBuilder의 경우, 이를 오버라이드하여 저장된 문자열을 반환하도록 동작
  3. 실무에서는 클래스 정보를 가독성 있게 표현하기 위해 종종 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 "";
	}

}