2024. 7. 10. 10:39ㆍ공부
코딩테스트 준비를 위해 프로그래머스의 문제를 매일 5문제씩 풀어보려 한다.
확실히 알고리즘 문제를 푸는 것이 해당 언어에 대해 깊게 알기 좋은 것 같다.
오늘 헤멨던 문제는 Lv.0의 '문자열 겹쳐쓰기'
[문제 설명]
문자열 my_string, overwrite_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가 무엇인지 공부해보고 기회가 된다면 블로그에도 남겨봐야겠다.
오랜만에 알고리즘 문제를 풀며 느낀 점은 한가지 문제도 다양한 방법으로 풀이할 수 있다는게 참 재미있는 것 같다는 것이다. 어떤 난이도의 코딩테스트라도 자신있게 해결할 수 있도록 꾸준히 이어나가길 바란다!
'공부' 카테고리의 다른 글
[프로그래머스/C#/Lv. 0] 두 수의 연산값 비교하기 (0) | 2024.07.11 |
---|---|
[프로그래머스/C#/Lv. 0] 더 크게 합치기 (0) | 2024.07.11 |
Unity UI: Ripple Effect (0) | 2024.05.21 |
[디자인 패턴]01. 디자인 패턴의 기초 MVC 패턴을 알아보자 (0) | 2024.04.01 |
[특강] 강력한 TIL 작성하는 법 (0) | 2023.09.12 |