📌 문제 정보
- 문제 이름 : 코딩 기초 테스트 - 문자열 섞기
- 문제 링크: 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'CODING TEST > programmers' 카테고리의 다른 글
| Day3 - 문자 리스트를 문자열로 변환하기 (0) | 2025.07.10 |
|---|---|
| Day3 - 두 수의 연산값 비교하기 (0) | 2025.07.10 |
| Day2 - 문자열 겹쳐쓰기 (0) | 2025.07.09 |
| Day2 - 문자열 돌리기 (0) | 2025.07.09 |
| Day1 - 특수문자 출력하기 (0) | 2025.07.08 |
