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

[11] JAVA 문자열 섞기

유혁스쿨 2023. 11. 14. 17:35
728x90
반응형

문제설명

길이가 같은 두 문자열 str1과 str2가 주어집니다.두 문자열의 각 문자가 앞에서부터 서로 번갈아가면서 한 번씩 등장하는 문자열을 만들어 return하는 solution함수를 완성해 주세요.

 

제한사항

  • 1 <= str1의 길이 = str2의 길이 <= 10
    • str1과 str2는 알파벳 소문자로 이루어진 문자열입니다.

입/출력 예

str1 str2 result
"aaaaa" "bbbbb" "ababababab"

[제출 답안]

class Solution {
	public String solution(String str1, String str2) {
    	boolean isLower = str1.matches("^[a-z]+") && str2.matches("^[a-z]+");
        String Buffer sb = new StringBuffer();
        if(((str1.length() == str2.length()) && str2.length() <= 10) && isLawer) {
        	char[] sumCharArr = new Char[str1.length() + str2.length()];
            for(int i = 0; i < str1.toCharArray().length; i++) {
            	sumCharArr[i*2] = str1.toCharArray()[i];
                sumCharArr[i*2+1] = str2.toCharArray()[i];
            }
            for(char props: sumCharArr) {
            	sb.append(String.valueOf(props));
            }
            return sb.toString();
        }
    }
}

[풀이과정] 

전달받은 str1과 str2를 기준으로 배열을 생성해야한다.

배열을 선언할 때, 배열의 길이를 선언해야 했는데, 해당 길이는 두 String문자열 길이의 합이 되어야 하므로

두 문자열의 길이를 합한 값을 배열 선언시 길이의 초기값으로 지정하였다.

 

다음으로 반복문을 통해 인덱스에 해당하는 값을 추출하여 char배열 인덱스에 순차적으로 저장했다.

반복문 범위 조건은 str1, str2 길이가 동일하기 때문에 첫번째 문자열의 길이보다 작게 지정하였다.

이후 char 배열에 순차적으로 두 문자열의 index요소를 저장처리하였는데, 이때 char배열의 index는 반복문이 한번 돌때마다 예를들어0,1 - 2,3 - 4,5 - 6,7 - 8,9와 같이 한번에 두 요소를 순차적으로 저장하도록 하였기 때문에

첫번째 문자열을 저장할 배열 인덱스는 i*2, 두번째 문자열을 저장할 배열 인덱스는 i*2+1로 지정하였다.

첫번째 문자열은 0, 2, 4, 6, 8로 0부터 시작하는 짝수이고, 두번째 문자열은 1, 3, 5, 7, 9로 1부터 시작하는 홀수인 규칙을 도출할 수 있다.

이후 다시 반복문으로 앞서 loop를 통해 저장완료된 char배열로 부터 향상된 for문을 이용하여 char 요소 하나씩 StringBuffer에 append() 했다.

char요소를 String으로 변환해야 하기 때문에 String.valueOf()를 사용하였다.


[다른 풀이]

1) String.charAt(int idx)

 

class Solution {
	public String solution(String str1, String str2) {
    	String answer = "";
        for(int i =- 0; i < str1.length(); i++) {
        	answer += str1.charAt(i);
            answer += str2.charAt(i);
        }
        return answer;
    }
}

 

이 예제에서의 의문은 char타입의 값을 합하게 되면 정수가 되는거 아닐까? 생각했지만,

String타입의 변수 answer은 선언시 공백으로 초기화했기 때문에, 누적합으로 연산할 경우 문자열로 변환된다.

리팩토링을 생각한다면 반복문으로 여러번의 연산이 발생하기 때문에 String의 불변성을 고려했을 때 StringBuffer를 사용하는게 효율적일거 같다고 생각해봤다.

 

2) 

String[] str1arr = str1.split("");
String[] str2arr = str2.split("");
for(int i = 0; i < str1arr.length; i++) {
	answer += str1arr[i] + str2arr[i];
}
return answer;

 

3)

char[] str1CharArr = str1.toCharArray();
char[] str2CharArr = str2.toCharArray();
StringBuffer sb = new StringBuffer();
for(int i = 0; i < str1CharArr.length; i++) {
	sb.append(str1CharArr[i]).append(str2CharArr[i]);
}
return sb.toString();

 

728x90
반응형