[백준 #2438] java 문자열 입출력 씹.뜯.맛🦑 3탄 : (출력) StringBuilder, 근데 이제 java11 String클래스를 곁들인

개발하는 튀튀·2025년 1월 16일
post-thumbnail

문제가 참 카와이하다
나도 별 보러가고 싶어


아무튼 이중 for문 문제입니다


import java.io.*;

public class Main {
    public static void main(String[] args) throws Exception {
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        int n = Integer.parseInt(br.readLine());

        for (int i = 1; i <= n; i++) {
            for (int j = 1; j <= i; j++) {
                System.out.print("*");
            }
            System.out.println();
        }
    }
}

라고 생각하고, 이것이 제일 먼저 내놓은 답변이었다

그런데...
print() 로 이중for문 돌리는 게 너무 조잡하다는(??) 생각이 들었다
(시간도 124ms로 뭔가 못마땅함. 이중for문 너무 느림.)


그래서 어김없이 여러분들의 코드를 호로록쨥 하러 갔습니다 ~ 야호 !!




💗 StringBuilder

import java.io.*;

public class Main {
    public static void main(String[] args) throws Exception {
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        int n = Integer.parseInt(br.readLine());

        StringBuilder sb = new StringBuilder(); // <- 얘다 !!!!!!!
        for(int i = 1; i <= n; i++) {
            for(int j = 1; j <= i; j++) {
                sb.append("*");
            }
            sb.append("\n");
        }
        System.out.println(sb);
    }
}

StringBuilder() !!!!!
이 친구 참 좋다.
시간도 확 줄고 메모리도 확 줄었다.

출력 카테고리에 완전히 넣기는 좀 애매하지만,
출력 이전에 전처리로 해주면 성능이 확 좋아진다


쉽게 말해서 String을 맘대로 주무를 수 있는 함수다

String은 새로 대입하는게 아니고선 부분 수정이 안되는 아이라서...
알고 있다가 정말 편하게 다용도로 써먹을 수 있다






StringBuilder문자열(String) 연산을 효율적으로 처리하기 위해 사용하는 클래스야.
자바에서 String불변(immutable)이라서 문자열을 수정할 때마다 새로운 객체를 생성하지만,
StringBuilder가변(mutable) 객체로 동작해서 문자열을 직접 수정할 수 있어 성능이 훨씬 좋음. 🚀


String vs StringBuilder 비교

🔥 특징StringStringBuilder
불변성(Immutable)✅ 변경 불가 (새 객체 생성)❌ 변경 가능 (메모리 재사용)
연산 속도느림 (새로운 객체 생성)빠름 (기존 객체 수정)
메모리 효율비효율적 (많은 객체 생성)효율적 (하나의 객체 사용)
쓰레드 안전(Thread Safe)String은 안전StringBuilder는 안전하지 않음
멀티스레드 환경가능StringBuffer를 대신 사용

StringBuilder 기본 사용법

📌 1️⃣ StringBuilder 생성 방법

StringBuilder sb = new StringBuilder(); // 빈 문자열 생성
StringBuilder sb2 = new StringBuilder("Hello"); // 초기값 설정

📌 2️⃣ 문자열 추가 (append())

StringBuilder sb = new StringBuilder("Hello");
sb.append(" World");
System.out.println(sb); // 출력: Hello World

📌 3️⃣ 문자열 삽입 (insert())

StringBuilder sb = new StringBuilder("Hello");
sb.insert(5, " Java"); // 5번째 위치에 " Java" 삽입
System.out.println(sb); // 출력: Hello Java

📌 4️⃣ 문자열 변경 (setCharAt())

StringBuilder sb = new StringBuilder("Hello");
sb.setCharAt(0, 'Y'); // 첫 번째 문자 'H'를 'Y'로 변경
System.out.println(sb); // 출력: Yello

📌 5️⃣ 문자열 삭제 (delete() / deleteCharAt())

StringBuilder sb = new StringBuilder("Hello World");
sb.delete(5, 11); // " World" 삭제
System.out.println(sb); // 출력: Hello

📌 6️⃣ 문자열 반전 (reverse())

StringBuilder sb = new StringBuilder("Hello");
sb.reverse();
System.out.println(sb); // 출력: olleH

📌 7️⃣ 문자열 길이 (length()) & 용량 (capacity())

StringBuilder sb = new StringBuilder("Hello");
System.out.println(sb.length()); // 문자열 길이: 5
System.out.println(sb.capacity()); // 기본 용량: 16 + 문자열 길이

성능 비교: String vs StringBuilder

🔥 String 연산 (비효율적)

public class Main {
    public static void main(String[] args) {
        String str = "";
        for (int i = 0; i < 10000; i++) {
            str += i; // 새로운 문자열 객체 생성 (비효율적)
        }
        System.out.println(str.length());
    }
}
  • 매번 새로운 문자열 객체가 생성됨 → 메모리 낭비, 속도 느림

🚀 StringBuilder 연산 (효율적)

public class Main {
    public static void main(String[] args) {
        StringBuilder sb = new StringBuilder();
        for (int i = 0; i < 10000; i++) {
            sb.append(i); // 기존 객체 수정 (빠름)
        }
        System.out.println(sb.length());
    }
}
  • 기존 객체를 수정하므로 메모리 사용량이 적고 속도가 훨씬 빠름.

멀티스레드 환경에서 StringBuffer 사용

  • StringBuilder쓰레드 안전하지 않음.
  • 멀티스레드 환경에서는 StringBuffer를 사용해야 함.
StringBuffer sb = new StringBuffer("Hello");
sb.append(" World");
System.out.println(sb); // Hello World
  • StringBufferStringBuilder와 기능이 거의 동일하지만, synchronized(동기화) 처리가 되어 있어 멀티스레드 환경에서 안전함.




...

그렇다고 한다.

근데 이 코드를 인텔리제이에 치니까,
얘가 코드를 여기서도 살짝 더 수정해보지 않겠냐는 거다

궁금해서 수정해봤다



💗 String클래스의 repeat()

import java.io.*;

public class Main {
    public static void main(String[] args) throws Exception {
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        int n = Integer.parseInt(br.readLine());

        StringBuilder sb = new StringBuilder();
        for(int i = 1; i <= n; i++) {
            sb.append("*".repeat(Math.max(0, i))); <- 얘다 !!!!!!!
            sb.append("\n");
        }
        System.out.println(sb);
    }
}

그랬더니 이중 for문이 사라졌다


근데 java8에 돌리니 컴파일에러가 떴다...가 설마해서 11로 돌리니 돌아갔다

다음은 여기에 대한 지피티의 설명

java11부터 가능하니 참고하도록 하자 !!


코드가 짧고 간결하고 이중for문이 사라져서 빠르다

최고 !

profile
행복, 사랑, 건강, 개발, 하세요 !

0개의 댓글