CODING TEST/programmers

Day3 - 문자열 섞기

iamyuunzo 2025. 7. 10. 08:18

📌 문제 정보

- 문제 이름 : 코딩 기초 테스트 - 문자열 섞기

- 문제 링크: https://school.programmers.co.kr/learn/courses/30/lessons/181942

 

 

📌 문제 요약

핵심 조건: 두 문자열의 각 문자가 앞에서부터 서로 번갈아가면서 한 번씩 등장하는 문자열을 만들어 return (ex. aa bb -> abab)

- 제한: 1 ≤ str1의 길이 = str2의 길이 ≤ 10 (str1, str2 = 알파벳 소문자)

 

 

📌 내 풀이 및 코드

class Solution {
    public String solution(String str1, String str2) {
        StringBuilder sb = new StringBuilder();

        for (int i=0; i<str1.length(); i++) {
            sb.append(str1.charAt(i));
            sb.append(str2.charAt(i));
        }

        String answer = sb.toString();
        return answer;
    }
}

- 반복문을 써야한다는 것까지는 알았는데 번갈아가면서 붙이는 문법 모르겠어서 힌트 보고 함. 

 

 

📌 다른 사람들 풀이

// 1
for (int i = 0; i < str1.length(); i++) {
     answer += str1.charAt(i);
     answer += str2.charAt(i);
}


// 2
char[] chars1 = str1.toCharArray();
char[] chars2 = str2.toCharArray();

StringBuilder sb = new StringBuilder();

for (int i = 0; i < chars1.length; i++) {
     sb.append(chars1[i]).append(chars2[i]);
}

return sb.toString();


// 3
for (int i = 0; i < str1.length(); i++) {
     answer += String.valueOf(str1.charAt(i));
     answer += String.valueOf(str2.charAt(i));
}

<-- 다른 풀이 요약 -->

- 1 : String(answer)에 + 연산으로 덧붙임. (최대 길이가 10이면 상관없지만, 일반 코테에서 길이가 커지면 성능이 저하될 수 있음.)

- 2 : StringBuilder 사용 -> + 대신 append로 붙임. (char[]로 변환해서 인덱싱 -> charAt()보다 조금 빠름 but, 굳이 안 바꿔도 됨.)

- 3 : 1번 방식과 동일한데 char을 String.valueof로 바꿈 (굳이 필요없음. +가 자동으로 문자열 변환하기 때문에)

항목 1 2 3 내 코드
방법 String answer += StringBuilder.append() String answer += StringBuilder.append()
반복문에서 덧붙임 + 연산 → 새 String 객체 계속 생성 append → 내부 버퍼 사용 + 연산 → 새 String 객체 계속 생성 append → 내부 버퍼 사용
문자를 꺼내는 방법 charAt() toCharArray() → 배열 인덱싱 charAt() + String.valueOf() charAt()
불필요 요소 없음 char[]는 없어도 됨 String.valueOf()는 사실 불필요 없음
남은 문자 처리 필요 없음 (길이 같음) 필요 없음 (길이 같음) 필요 없음 (길이 같음) 필요 없음 (길이 같음)
반환 처리 누적한 answer 반환 sb.toString() 반환 누적한 answer 반환 sb.toString() 반환
성능 가장 느림 (짧으면 문제 없음) 빠름 가장 느림 (짧으면 문제 없음) 빠름
가독성 가장 간단 조금 더 코드 길어짐 String.valueOf 때문에 살짝 불필요 깔끔하고 표준적
코딩테스트 추천도 ❌ (짧으면 OK) ❌ (짧으면 OK) ✅✅✅



 

📌 새로 배운 문법

<-- 이번 문제에서 새로 배운 Java 문법 정리 -->

** StringBuilder **

- 자바에서 문자열은 불변(immutable)이라서 String에 +연산으로 문자를 계속 붙이면 문자열 객체를 만들게 됨.

- 계속 새로운 객체를 만들면 옛날 것이 버려지면서 메모리 낭비 및 속도 저하 문제가 발생함. (문자열이 클 때 차이가 큼)

   => 이 문제를 StringBuilder로 해결할 수 있음!

 

- StringBuilder란? 내부에서 가변 버퍼(char[])을 사용해서, 문자를 계속 덧붙여도 기존 메모리 재사용 -> 빠른 속도, 메모리 낭비X

- 반복문으로 문자열을 누적할 때는 무조건 StringBuilder 쓰기.

// 기본 표준 패턴
StringBuilder sb = new StringBuilder();

for (int i = 0; i < n; i++) {
    sb.append(...);
}

return sb.toString();


// 예시
StringBuilder sb = new StringBuilder(); // 1️⃣ 빈 StringBuilder 생성

sb.append("H"); // 2️⃣ 문자/문자열 붙이기
sb.append("i");
sb.append("!");

String result = sb.toString(); // 3️⃣ 최종 String으로 변환
System.out.println(result); // 출력: Hi!

 

[StringBuilder에서 자주 쓰는 메서드]

- 코테에서는 대부분 append()만 써도 충분함.

append() 문자, 문자열, 숫자 등을 버퍼에 이어붙임
toString() 최종적으로 StringBuilder의 내용을 String으로 변환
insert() 특정 위치에 삽입
delete() 특정 범위를 삭제
reverse() 문자열 뒤집기

 

[흔하게 하는 실수 포인트]

1. + 연산 써버리기 => append() 따로따로 써야 함!

2. toString() 안 쓰고 반환 => return sb.toString();

// 1
sb.append(str1.charAt(i) + str2.charAt(i));  // => char끼리 덧셈되면 숫자 됨! (유니코드 덧셈)

sb.append(str1.charAt(i));   // 이 방식이 정답 (따로 쓰기)
sb.append(str2.charAt(i));


// 2
return sb;					// X (타입이 StringBuilder라 오류남.)
return sb.toString();		// O