프로그래머스

프로그래머스(substring , toCharArray , valueOf) - 코딩 기초 트레이닝 - 문자열 겹쳐쓰기

새우는 맛있새우 2024. 8. 25. 17:32

이번에도 대가리 깨지는 문제였다.

이딴게 어떻게 기초인가요;

 

https://school.programmers.co.kr/learn/courses/30/lessons/181943

 

프로그래머스

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

programmers.co.kr

문제

 

문자열 my_string, overwrite_string과 정수 s가 주어집니다. 문자열 my_string의 인덱스 s부터 overwrite_string의 길이만큼을 문자열 overwrite_string으로 바꾼 문자열을 return 하는 solution 함수를 작성해 주세요.

 

내 풀이

class Solution {
    public String solution(String my_string, String overwrite_string, int s) {

        String answer = my_string.substring(0,s) + overwrite_string;

        if(my_string.length()>overwrite_string.length()){

            answer += my_string.substring(s+overwrite_string.length());
        }
        return answer;
    }
}

 

이 문제의 중요성은 substring함수를 쓸 수 있냐 없냐이다. 모르는 상태에서 풀어보려고 했는데 도저히 안되겠어서,,, 생각한 풀이가 있었는데 매우 유사한 풀이가 존재했지만 이 또한 내가 모르는 부분이 투성이들이었어서.... 추가로 정리하겠다.

 

substring(시작점, 끝점)

이런 식인데

아주 끝장나는 함수이다.

시작점부터 끝점까지 문자열을 딱 빼온다.

예를 들어, 안녕하세용.substring(0,3)   이라면, 결과는 안녕하 가 되는것이다. 그리고 안녕하세용.substring(3) 라면, 결과는 세용 !

               0 1 2 3 4 5 

커서가 이렇게 사이사이에 있는것으로 이해하기!

 

 

내가 쓴 코드는 바꿔야 하는 부분 이전까지의 my_string + 바꿔야하는부분 이라고 해놓고 진행했다.

하지만 이 이후에 만약 my_string의 길이가 바꿔야하는 overwrite보다 길다면 그 이후의 부분이 삭제가 될 것이다.

따라서 my_string의 길이가 바꿔야하는 overwrite보다 긴 경우에는 

 바꿔야하는 부분+overwrite.length   이후에 커서를 놓고 my_string을 출력해줘야 할 것이다.

새로운 문자열 answer 을 선언해줘서 그 안에다가 저장해주는 센스도 까먹지 말자.

이제 멋있는 풀이를 해석해보자.

 


class Solution {
    public String solution(String my_string, String overwrite_string, int s) {
        String before = my_string.substring(0, s);
        String after = my_string.substring(s + overwrite_string.length());
        return before + overwrite_string + after;
    }
}

 

 

진짜 개지린다.

이 사람들은 이걸 단번에 개 깔끔하게 생각해냈겠지.

나도 열심히 할거다.

보면은 내 코드랑 별반 다를거 없어보이지만 아주 깔끔.

substring으로 앞부분 띄어내고, 바꿔야하는곳+overwrite.length 이후로 또 띄어내놓는다.

그러고선 그 사이에다가 그냥 삽입할 부분 삽입하면 끝.

어렵게 가지말고 쉽게쉽게. 간단간단하게 하면 된다.

 


class Solution {
    public String solution(String my_string, String overwrite_string, int s) {
        char[] my_chars = my_string.toCharArray();
        char[] overwrite_chars = overwrite_string.toCharArray();
        for (int i=0; i<overwrite_chars.length; i++) {
            my_chars[s + i] = overwrite_chars[i];
        }
        return String.valueOf(my_chars);
    }
}

 

이 풀이가 내가 처음에 말했던 내가 맨 처음 생각한 풀이..

하지만 내 문제점은 string을 배열처리를 하지 않았다는 것이고

이에 대한 함수 toCharArray 라는게 있다는것을 깨닫게 되었다.

String 문자열을 char형 배열로 바꿔서 반환해주는 메서드이다.

"안녕티비" 라는 문자열이 있으면

arr[0] = '안'

arr[1] = '녕'

arr[2] = '티'

arr[3] = '비'

위 값처럼 char 배열을 반환해준다.

 

char[]로 배열을 만들어주고

거기다가 대입.

for문을 써서 overwrite.length 만큼 반복.

my_chars 에서 바꿔야하는부분부터부터 순차적으로 바꿔준다 -> overwrite를 (i=0) 부터 순차적으로 넣어준다.

String.vlaueOf ()함수는 괄호 안에 있는것을 무조건 그냥 string으로 변환해주는 함수이다.

정리하자면 String -> toCharArray로 배열 -> String.vlaueOf()로 다시 String

이 순서로 코드 진행.

지리는 코드다.

 


이렇게 해서 별 거 아닌 문제였지만 그래도 몇시간에 걸쳐 해결했다....

복습도 꾸준히 할게요

하나가 보내준 개쩌는 substring을 쓰지않고 해결한 코드

 

 

강하나양의 엄청난 실력.... 감탄합니다 오늘도