코딩테스트 - 프로그래머스/Lv. 0

[10] JAVA 문자열 겹쳐쓰기

유혁스쿨 2023. 11. 14. 16:28
728x90
반응형

문제설명

문자열 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를 활용함으로써 같은 효과를 나타낸다.

728x90
반응형