문제설명
문자열 my_string, overwrite_string과 정수 s가 주어집니다.문자열 my_string의 인덱스 s부터 overwriting_string의 길이만큼을 문자열 overwrite_string으로 바꾼 문자열을 return하는 solution함수를 작성해 주세요.
제한사항
- my_string와 overwirte_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" |
입출력 예 #
- 예제 1번의 my_string에서 인덱스 2부터 overwrite_string의 길이만큼에 해당하는 부분은 "11owor1"이고 이를 "lloWorl"로 바꾼 "HelloWorld"를 return합니다.
입출력 예 #2
- 예제 2번의 my_string에서 인덱스 7부터 overwrite_string의 길이만큼에 해당하는 부분은 "29b8UYP"이고 이를 "merS123"로 바꾼 "ProgrammerS123"를 return합니다.
[제출 답안]
class Solution {
public String solution(String my_string, String overwrite_string, int s) {
String[] my_split = my_string.split("");
String[] overwrite_split = overwrite_string.split("");
int myLength = my_string.length();
int overLength = overwrite_string.length();
boolean condition1 = isNumAlphabet(my_string, overwrite_string); //제한사항1
boolean condition2 = isRange1(myLength, overLength); //제한사항2
boolean condition3 = isRange2(myLength, overLength, s); //제한사항3
StringBuffer sb = null;
if(condition1 && condition2 && condition3) {
sb = new StringBuffer();
for (int i = 0, j = s; i < overwrite_split.length; i++, j++) {
my_split[j] = overwrite_split[i];
}
for (String split : my_split) {
sb.append(split);
}
}
return sb.toString();
}
/* 제한사항1 */
public static boolean isNumAlphabet(String my_string, String overwrite_string) {
Boolean my_result = my_string.matches("[a-zA-Z0-9]+");
Boolean overwrite_result = overwrite_string.matches("[a-zA-Z0-9]+");
return my_result || overwrite_result;
}
/* 제한사항2 */
public static boolean isRange1 (int myLength, int overLength) {
return overLength >= 1 && overLength <= myLength && myLength >= overLength && myLength <= 1000;
}
/* 제한사항3*/
public static boolean isRange2 (int myLength, int overLength, int s) {
return s >= 0 && s <= (myLength-overLength);
}
}
[풀이과정]
기본 for문을 사용하였다.
정수형 변수 i는 초기값이 0 이므로 대치할 문자열의 배열의 인덱스로 사용된다.
정수형 변수 j는 초기값이 s 이므로 기본 문자열의 배열의 인덱스로 사용된다.
따라서 기본 for문에 변수 2개를 사용하였으며, 증감 연산식 또한 2개를 사용하였다.
상세히 설명하자면 다음과 같다.
my_string은 변경이 될 원본 문자열이기 때문에 인덱스가 2번 혹은 7번부터 시작해야 하므로 초기값이 s인 j 변수를 사용했다.
overwrite_string은 덮어 씌울 문자열이기 때문에 인덱스가 0번부터 시작해야 하므로 초기값이 .0인 i변수를 사용했다.
반복문 범위 조건은 덮어씌울 길이만큼만 반복해서 변경해야하므로 overwrite_string의 길이인 overLength 변수 미만으로 지정했다.
제한사항에 대한 검증은 static 메소드로 추출하였다.
까다로웠던 부분은 첫번째 제한사항인 숫자와 알파벳으로 이루어졌다는 사항이였다.
해당 제한사항은 String 클래스의 matches() 메소드를 통해 정규표현식 [a-zA-Z0-9]+ 으로 처리하였다.
[다른사람 풀이]
1) String.substring(int idx) , substring(int start, int begin)
1. 대상 문자열에서 index를 기준으로 index를 포함하는 하위 문자열을 반환한다.
2. 대상 문자열에서 start를 기준으로 end까지의 문자열을 반환한다.
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;
}
}
String 문자열 변수 before은 기본 문자열의 첫번째부터 s번째 만큼 잘라내어 저장한다.
befor는 추후 return을 통해 변경할 데이터의 앞에 올 문자열이기 때문에 변경될 인덱스 이전만큼 잘라내는 것이다.
String 문자열 변수 after은 기본 문자열에서 시작 인덱스 값 + 덮어씌울 문자열의 길이를 합한만큼 잘라내어 자장한다.
after는 추후 return을 통해 마지막 문자열 데이터로서 사용되는데, 원본문자열에서 시작인덱스 + 덮어씌울 문자열의 길이만큼 자르면 이후 문자열이 남으므로 위와같이 계산한다.
마지막으로 변경되지않을 before 문자열과 after문자열 사이에 변경할 문자열 변수를 지정하여 문자열을 총합하여 반환한다.
2) String.valueOf(char chr) & 반복문의 변수와 증감식 활용
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);
}
}
내가 작성한 코드와 비교해본다면 거의 유사하다.
split()대신 toCharArray()를 통해 배열로 반환하였고,
반복문에서 s를 대신할 정수형 변수 j 대신 기존 증감연산식에 사용되는 변수 i를 활용함으로써 같은 효과를 나타낸다.
'코딩테스트 - 프로그래머스 > Lv. 0' 카테고리의 다른 글
[12] JAVA 문자 리스트를 문자열로 변환하기 (1) | 2023.11.15 |
---|---|
[11] JAVA 문자열 섞기 (0) | 2023.11.14 |
[9] JAVA 홀짝 구분하기 (0) | 2023.11.14 |
[8] JAVA 문자열 돌리기 (1) | 2023.11.14 |
[7] JAVA 문자열 붙여서 출력하기 (0) | 2023.11.14 |