[프로그래머스] Lv.0 문자열 섞기

김엄지·2024년 3월 15일

알고리즘

목록 보기
13/90

🐤 목표

앞으로 매일 꾸준히 코딩테스트를 진행하면서 단계를 높여가보자.

문제 설명

길이가 같은 두 문자열 str1과 str2가 주어집니다.

두 문자열의 각 문자가 앞에서부터 서로 번갈아가면서 한 번씩 등장하는 문자열을 만들어 return 하는 solution 함수를 완성해 주세요.

제한사항

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

입출력의 예

문제 풀이

class Solution {
    public String solution(String str1, String str2) {
        String answer = "";
        
        for(int i=0; i<str1.length(); i++) {
            answer = answer + str1.charAt(i) + str2.charAt(i);
        }
        return answer;
    }
}
  • 처음에 answer = str1.charAt(i) + str2.charAt(i); 로 적었다가, 왜 답이 안나올까 생각해보니,
  • 매번 answer를 새로 초기화하여 현재 인덱스의 str1 문자와 str2 문자를 합친 문자열로 갱신하니깐,
  • answer를 더해서 매 반복마다 answer의 길이를 늘려야했다 !

다른 방법

answer += 를 이용하고 싶은데,,
str1.charAt(i), str2.charAt(i)는 개별문자이므로, 문자열에 추가하기 위해서 각각을 문자열로 변환해서 연결해야한다.

answer += String.valueOf(str1.charAt(i)) + String.valueOf(str2.charAt(i));

String -> char -> String 생각해보니, 뭔가 비효율적인 풀이 같다...


다른 풀이 1

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

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

        return sb.toString();
    }
}
  • StringBuilder 을 사용하여 문자열 메모리 사용을 최소화하셨다.
  • .split 사용 문자열을 자르고, 배열에 넣어
  • 반복문

위와 같은 분의 다른 풀이 2

class Solution {
    public String solution(String str1, String str2) {
    
    	StringBuilder sb = new StringBuilder();
        
        char[] chars1 = str1.toCharArray();
        char[] chars2 = str2.toCharArray();

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

        return sb.toString();
    }
}
  • StringBuilder 을 사용하여 문자열 메모리 사용을 최소화하셨다.
  • .toCharArray() 사용 문자열(String)을 char형 배열로 바꿔,
    각각의 문자열(str1, str2)을 char[] 문자 배열 형태로 변환
  • 반복문

❗알게된 개념

String과 StringBuilder

String

  • String 클래스의 인스턴스는 불변(immutable)이기 때문에 수정할 때마다 기존 메모리에 복사되는 것이 아니다.
  • 문자열을 수정하면 실제로는 새로운 String 생성되고 이전 문자열은 가비지 컬렉터로 들어간다.
  • 이로 인해 수정 작업이 필요한 경우 메모리에 새로운 문자열을 할당하는 것은 피할 수 없다.

StringBuilder

  • StringBuilder 클래스는 가변성(mutable)을 가지며 내부적으로 버퍼를 사용하여 문자열을 조작한다.
  • 문자열 수정 작업이 필요한 경우 StringBuilder는 기존 버퍼를 재사용하며 필요한 수정 작업을 String 클래스 보다 더 효율적으로 수행할 수 있다.
  • 이로 인해 문자열 수정 작업이 많은 상황에서 StringBuilder를 사용하면 메모리 할당과 복사 작업을 효율적으로 관리할 수 있다.

toCharArray와 toString

toCharArray

  • toCharArray 메서드는 문자열(String)을 char형 배열로 바꿔준다.
    - 반환되는 배열의 길이는 문자열의 길이와 같다.
    - 문자열의 공백 또한 인덱스에 포함한다. 즉, 공백 또한 문자로 취급

toString

  • toString 메서드는 객체가 가지고 있는 정보나 값들을 문자열로 만들어 반환

참고자료

profile
나만의 무언가를 가진 프로그래머가 되자

0개의 댓글