ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • Java 프로그래머스 Lev.0 | 문자열 겹쳐쓰기
    코딩테스트/Lev.0 2024. 1. 7. 15:33

    0부터 n-1까지 부분 문자열 반환 substring() 사용

     

    class Solution {
        public String solution(String my_string, String overwrite_string, int s) {
            String answer = "";
            
            String start = my_string.substring(0,s);
            String middle = overwrite_string;
            String end = my_string.substring(s + overwrite_string.length());
            answer = start + middle + end;
                
            return answer;
        }
    }

     

    String end = my_string.substring(s + overwrite_string.length()); 

    덮어쓸 위치인 s + overwrite_string의 길이만큼 건너 뛴 다음 문자열 부터 ~

    문자열 끝까지 부분 추출해 end에 저장

     

     

    여기서 드는 의문점 !

    음 .. for 루프도 사용할 수 있을 것 같은데 .. ? 

     

     

     

    문자열에서 특정 인덱스의 문자에 접근할 때는 charAt(int index) 메소드를 사용해야 함.

    class Solution {
        public String solution(String my_string, String overwrite_string, int s) {
            StringBuilder answer = new StringBuilder(my_string);
            
            for (int i = 0; i < overwrite_string.length(); i++) {
                if (s + i < my_string.length()) {
                    answer.setCharAt(s+i, overwrite_string.charAt(i));
                }
            }
            return answer.toString();
       
    
        }
    }

    StringBuilder란? 

    자바에서 String객체들은 불변이기 때문에 문자열을 변경할 때마다 (1번 풀이처럼)

    새로운 String 객체가 생성됨 ! 보다 효율적으로 코드를 만들기 위해 

    StringBuilder를 사용해 가변적으로 문자열을 변경하며 조작 가능 ! 

     

    StringBuilder의 메소드 . . . 

    문자열 추가 append(), 삽입 insert(), 삭제 delete(), 변 setCharAt()

     

     StringBuilder answer = new StringBuilder(my_string);

    따라서 StringBuilder를 사용하여 my_string을 가변 문자열로 만듬. 

     for (int i = 0; i < overwrite_string.length(); i++)

    for 루프를 사용해, 문제에서 제시한대로 overwrite_string의 길이만큼 반복 

    if (s + i < my_string.length())

    overwrite_string을 my_string에 덮어쓸 때, my_string의 길이를 초과하면 안됨. 

    s + i 는 처음에 s + 0 부터 루프를 도니까 덮어써야할 위치인 s부터 시작. 

    answer.setCharAt(s + i, overwrite_string.charAt(i));
    1. answer.setCharAt(index, char):
      • StringBuilder의 setCharAt 메소드는 index 위치에 있는 문자를 지정된 char 값으로 변경.
      • index는 문자열 내에서 바꾸고자 하는 문자의 위치를 나타내며, 문자열의 첫 문자는 인덱스 0으로 시작.
    2. overwrite_string.charAt(i):
      • String의 charAt 메소드는 문자열에서 지정된 인덱스 i에 위치한 문자를 반환.
      • 여기서 overwrite_string.charAt(i)는 overwrite_string 문자열의 i번째 문자를 반환.

    따라서, answer.setCharAt(s + i, overwrite_string.charAt(i));는 answer 문자열의 s + i 위치에 있는 문자를 overwrite_string의 i번째 문자로 바꾸는 작업을 수행. my_string의 문자열을 overwrite_string으로 특정 부분을 덮어쓰는데 사용.

     

    return answer.toString();

    Java의 모든 클래스는 Object 클래스를 상속받으며, Object 클래스에 정의된 toString() 메소드를 오버라이드(재정의)할 수 있음. 

    그냥 answer로 반환하면 컴파일 오류남 !  왜?

    Java에서 메소드의 반환 타입은 선언된 타입과 일치 되어야 하고,

    toString() 메소드는 StringBuilder 객체를 String 객체로 변환해줌.

    예를 들어, 메소드의 반환 타입이 String으로 선언되어 있다면 반드시 String 타입의 값을 반환해야 하고

    StringBuilder객체를 직접 반환하려고 하면 타입 불일치로 컴파일 오류남.

     

     

     

     

     

    각각 나눠 잘라 더해 새로운 문자열로 만들기 / for 루프 두가지 방식으로

    이 문제는 다시 풀어보고, 스스로 코드를 적을 수 있을 때까지 

    복습하도록 하자 

     

     

Designed by Tistory.