컴공생의 발자취

StringBuilder에 대해 본문

💡 코테

StringBuilder에 대해

MNY 2024. 4. 3. 22:45
728x90
반응형
💡 오늘의 학습 키워드

- StringBuilder
    * .append(String str)
    * .insert(int offset, String str)
    * .replace(int index1, int index2, String str)

 

StringBuilder

  • .append(String str) : 문자열 추가하기
StringBuilder sb = new StringBuilder();
sb.append("abc");
sb.append("def");

System.out.println(sb);

// result : abcdef

 

  • .insert(int offset, String str) : offset 위치에 문자열 추가하기
StringBuilder sb = new StringBuilder("abc");
sb.insert(2, "00");

System.out.println(sb);

// result : ab00c

 

  • .replace(int index1, int index2, String str) : 첫 번째와 두 번째 파라미터로 받은 숫자 인덱스에 위치한 문자열 대체하기

* 인덱스는 0부터 시작하며 아래의 예시는 인덱스 [2]번인 "l"과 [4-1]번인 "l"을 "yoy"로 대체하는 것이다.

StringBuilder sb = new StringBuilder("hello");
sb.replace(2, 4, "yoy");
System.out.println(sb);

// result : heyoyo
 

 

오늘의 회고

문제1  : [행렬의 덧셈]

  • 어떤 문제가 있었고, 나는 어떤 시도를 했는지

2개의 2차원 배열이 주어지는데, 같은 2차원 배열로 각 요소의 합을 리턴해주는 문제이다. 

리턴할 배열에 입력받은 각 배열의 요소를 2중 반복문을 통해 더해줬다.

생각보다 너무 쉽게 끝나서 당황했고, 이 기세로 미들러 문제도 풀이했다.

 

  • 어떻게 해결했는지
// 입력 : 행과 열의 크기가 같은 2개의 2차원 배열

// row = 가로 column = 세로의 길이 구하기
// answer의 배열 크기 지정 및 초기화

/* 2중 반복문 이용하기
for (column)
    for (row) 
        answer = arr1 + arr2
*/

// result : 입력받은 2차원 배열 2개의 값을 더한 것

class Solution {
    public int[][] solution(int[][] arr1, int[][] arr2) {
        int column = arr1.length;
        int row = arr1[0].length;
        int[][] answer = new int[column][row];
        
        for (int i = 0; i < column; i++) {
            for (int j = 0; j < row; j++)
                answer[i][j] = arr1[i][j] + arr2[i][j];
        }
        
        return answer;
    }
}

 

문제2  : [기사단원의 무기]

  • 어떤 문제가 있었고, 나는 어떤 시도를 했는지

기사단원 n명을 입력받는데, 1~n까지의 기사가 각 숫자의 약수만큼 공격력을 가지는 무기를 선택할 수 있다.

각 기사단원의 무기는 공격력1 = 철 1kg이며, 대장장이가 주문해야 하는 철의 총합을 구하는 문제이다.

단, 기사단원이 m(문제에서는 limit)초과의 무기를 선택할 경우, l(문제에서는 power)의 공격력을 가지는 무기를 선택할 수 있다.

 

한마디로 각 기사단원의 공격력 총합을 구하는데, 특정 공격력 초과(문제에서 limit)이면 정해진 공격력을 가지는 무기(문제에서 power)로 선택해서 총합을 구해야 한다.

 

우선 기사단원의 수(1~.number)까지의 약수를 배열로 구하고

구한 약수를 전부 더하는데, 특정 공격력 이상일 경우(limit보다 클 경우)는 정해진 공격력을 가지는 무기(power)의 공격력? 철?을 더해줬다.

 

  • 어떻게 해결했는지
// 입력 : 기사단원의 수(number), 공격력의 제한수치(limit), 제한 수치 초과시 사용할 무기의 공격력(power)
// 변수 : 기사단원이 사용할 무기의 공격력(약수)를 담을 배열(measure)

/* 기사단원의 수(1~number)까지의 약수 구하기
1~number까지 반복문 돌기 = i
    약수 개수 구할 변수 선언 및 초기화(measureNum)
    1~i/2까지 반복문 돌기 =j
        i%j == 0일 경우, 약수 개수++
    약수 개수++ -> 마지막 자기 자신 포함
    기사단원의 약수(measure[i-1]) = 약수 개수
*/

// 기사단원의 수만큼 반복문 돌기
    // 만약 제한 수치 초과시, answer += power
    // 아닐 경우, answer += 기사단원의 약수(measure[i])

// result : 무기를 모두 만둘기 위해 필요한 철의 무게(공격력 1 = 철 1kg)

import java.util.Arrays;

class Solution {
    public int solution(int number, int limit, int power) {
        int answer = 0;
        int[] measure = new int[number];
        
        for (int i = 1; i <= number; i++) {
            int measureNum = 0;
            for (int j = 1; j <= i/2; j++) {
                if (i%j == 0)
                    measureNum++;
            }
            measureNum++;
            measure[i - 1] = measureNum;
        }
        
        for (int i = 0; i < number; i++) {
            if (measure[i] > limit)
                answer += power;
            else 
                answer += measure[i];
        }
        
        return answer;
    }
}

 

  • 무엇을 새롭게 알았는지

어제의 문제를 풀이하면서 String += "a" 이런 식은 비효율적이고 StringBuilder을 사용하라는 피드백을 받고 이에 대해 알아봤다. 비효율적인 이유는 문자열은 한 번 생성되면 바꿀 수 없기 때문이다.

정확하게는 하나의 문자열을 다른 문자열과 연결하면 새 문자열이 생성되고 이전 문자열은 가비지 컬렉터로 들어가기 때문이라고 한다. 실로 놀랍다.... 😮!!

방금 말한 것도 조금 정리해서 이 글에 적어야 되는데.. 

오늘 할 일 오늘만 내일로 좀 미뤄본다..

 

내일 학습할 것은 무엇인지

  • 빅분기 자격증 공부!!!
  • 클럽99 코딩테스트
728x90
반응형