[프로그래머스/C#/Lv. 0] 문자열 겹쳐쓰기

2024. 7. 10. 10:39공부

코딩테스트 준비를 위해 프로그래머스의 문제를 매일 5문제씩 풀어보려 한다.

확실히 알고리즘 문제를 푸는 것이 해당 언어에 대해 깊게 알기 좋은 것 같다.

 

날마다 5문제씩 제공된다.

 

오늘 헤멨던 문제는 Lv.0의 '문자열 겹쳐쓰기'

 

[문제 설명]

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

 

[제한사항]

  • my_string와 overwrite_string은 숫자와 알파벳으로 이루어져 있습니다.
  • 1 ≤ overwrite_string의 길이 ≤ my_string의 길이 ≤ 1,000
  • 0 ≤ s ≤ my_string의 길이 - overwrite_string의 길이

[입출력 예]

my_string overwrite_string s result
"He11oWor1d" "lloWorl" 2 "HelloWorld"
"Program29b8UYP" "merS123" 7 "ProgrammerS123"

 

[나의 풀이]

using System;

public class Solution {
    public string solution(string my_string, string overwrite_string, int s) {
        string answer = "";
        for(int i = 0; i < overwrite_string.Length+s; i++) {
            if(i < s) {
                answer += my_string[i];
            } else if (i > overwrite_string.Length+s) {
                answer += my_string[i+s];
            }
            else {
                answer += overwrite_string[i-s];
            }
        }
        return answer;
    }
}

주어진 문자열에서 조건에 맞는 순서의 문자를 하나씩 추가해주는 방식을 생각해봤지만 오류가 난다.

오류 내용에서 알 수 있는건

  1. 중간의 문자열을 바꾸는 경우 출력되는 문자열의 길이가 부족하다.

  2. 마지막 글자를 포함한 문자열을 바꾸는 경우 올바르게 출력된다.

때문에 else if 부분을 여러 차례 수정해봤지만 문제를 해결하지는 못했다...

 

        for(int i = 0; i < my_string.Length; i++) {
            if(i < s) {
                answer += my_string[i];
            } else if (i >= overwrite_string.Length+s) {
                answer += my_string[overwrite_string.Length+s];
            }
            else {
                answer += overwrite_string[i-s];
            }
        }

for문을 수정해주었다.

먼저 출력될 길이는 처음 입력된 my_string의 길이와 같기 때문에 반복횟수를 my_string.Length로 설정해주었다.

다음으로 overwrite_string으로 대체를 완료 한 뒤 채워야 할 길이가 남아있다면 my_string의 다음 인덱스부터 다시 채워주기 위해 else if 부분을 고쳐주었다.

결과는 통과!

가 아니었다...

어떤 케이스에서 왜 실패가 나는지 모르겠다... 최대한 C#에서 제공하는 함수를 사용하지 않으려 했지만 어쩔수 없지

이 방식이 왜 나쁜지, 무엇이 잘못되었는지는 나중에 분석해보고 지금은 C#에서 제공하는 문자열을 자르는 함수 

Substring()을 사용해보자.

 

using System;

public class Solution {
    public string solution(string my_string, string overwrite_string, int s) {
        string answer = "";
        string foreString = my_string.Substring(0, s);
        string learString = my_string.Substring(overwrite_string.Length + s);
        
        answer = foreString + overwrite_string + learString;
        
        return answer;
    }
}

기존의 문자열 my_string에서 overwrite_string이 들어갈 부분의 앞과 뒤를 자른 다음 answer에서 overwrite_string과 합쳐주었다.

 

다른 사람의 풀이를 둘러보며 StringBuilder를 사용하는 경우도 많은것을 확인했다.

StringBuilder가 무엇인지 공부해보고 기회가 된다면 블로그에도 남겨봐야겠다.

 

오랜만에 알고리즘 문제를 풀며 느낀 점은 한가지 문제도 다양한 방법으로 풀이할 수 있다는게 참 재미있는 것 같다는 것이다. 어떤 난이도의 코딩테스트라도 자신있게 해결할 수 있도록 꾸준히 이어나가길 바란다!