본문 바로가기
게임 개발/공부

C# 문자/문자열 연결 및 추가(백준 2438번)

by 휘익 2024. 8. 28.

- 개인 공부용 포스트. 초짜이므로 정확하지 않을 수 있음. 지적 환영

 

 

[백준 2438번 별 찍기-1 문제]

 

입력받은 N만큼 N줄의 *을 출력하면 되는 문제다.

각 줄은 1번째 줄은 1개의 *, 2번째 줄은 2개의 *, N번째 줄은 N개의 *이 찍힌다.

 

(예시)

<입력>
5

<출력>
*
**
***
****
*****

 

내 코드는 이거

using System;

class test{
    static void Main(){
        int N = int.Parse(Console.ReadLine());
        int M = 1;
        for(int i=1; i<=N; i++){
            for(int j=0; j<M; j++){
                Console.Write("*");
            }
            M += 1;
            if(i<N){
                Console.Write("\n");
            }
        }
    }
}

 

잘 돌아가고, 나쁘진 않지만 복잡하다.

더 간단한 방법이 있을 것 같아 다른 사람들의 코드를 보았다.

 

그중 눈에 띄는 것이 Append()문자열에 "*"을 직접 더하는 방식이었다.

Append()는 뭐고, 숫자도 아닌 문자가 s += "*" 식의 더하기가 가능하다니?

GPT에게 도움을 요청했다...

 

 

Append()

 

GPT가 짜준 코드

using System;
using System.Text;

class test{
    static void Main(){
        int N = int.Parse(Console.ReadLine());
        var sb = new StringBuilder();
        for(int i=1; i<=N; i++){
            sb.Append('*');
            Console.WriteLine(sb.ToString());
        }
    }
}

 

sb.Append('*')를 이용해 sb라는 객체에 *을 추가하고 있다.

이로써 아무것도 없던 sb 객체에 *이 하나씩 붙고, 그것을 String 타입으로 변경해 출력하는 방식이다.

즉, Append()는 문자열 끝에 () 안의 문자열을 추가하는 매서드이다.

 

Append() 매서드는 C#에서 제공하는 기본 클래스인 'StringBuilder'의 매서드이다.

따라서 Append()를 사용하려면 StringBulider를 불러오는 것이 필수적이다.

그리고 StringBuilder 클래스는 System.Text 네임스페이스에 속해 있으므로, 사용을 위해

using System.Text;

 

혹은

System.Text.StringBuilder sb = new System.Text.StringBuilder();
var sb = new System.Text.StringBuilder();

 

등을 적어줘야 한다.

 

참고로 Append() 매서드가 속한 StringBuilder 클래스는 가변 타입이므로,

불변 타입인 string 타입 변수는 StringBuilder로 초기화할 수 없으며, Append() 매서드도 이용 불가하다.

 

즉, 아래와 같은 코드는 오류가 난다.

string sb = new System.Text.StringBuilder("Hello");
sb.Append = "World";
Console.WriteLine(sb);

 

string 타입으로 출력하고 싶다면, sb를 출력할 때 string 타입으로 변환하면 된다.

 

아래는 GPT가 Append() 매서드를 이용해 짜준 다른 예시 코드이다.

using System;
using System.Text;

class Program {
    static void Main() {
        string A = "Hello";
        string B = "World";

        var sb = new StringBuilder();
        sb.Append(A);
        sb.Append(" ");  // 공백 추가
        sb.Append(B);

        string result = sb.ToString();

        // 결과 출력
        Console.WriteLine(result);  // 출력: Hello World
    }
}

 

 

s += "*"

 

s += "*"를 이용하는 방법은 간단하다.

 

GPT가 짜준 코드

using System;

class Program {
    static void Main() {
        string s = "";
        for (int i = 0; i < 5; i++) {
            s += "*";
            Console.WriteLine(s);
        }
    }
}

 

하지만 문제는 string 타입은 위에서 기술한 듯이 불변 타입이기 때문에,

s += "*"를 할 때마다 s라는 문자열이 새로 생성된다.이렇게 되면 많은 메모리 할당이 발생할 수 있어 비추라고 한다.

 

 

new string('*', i)

 

이 방식은 GPT가 짜준 다른 방식이다.

using System;

class test{
    static void Main(){
        int N = int.Parse(Console.ReadLine());
        for(int i=1; i<=N; i++){
            Console.WriteLine(new string('*', i));
        }
    }
}

 

반복할 때마다, *이 i만큼 찍힌 string이 새롭게 생성되어 출력된다.

이것도 문자열이 새로 생성되는 방식이라 메모리 효율이 떨어질 것 같다.

 

참고로 ''과 ""는 다르므로 잘 구분하자. ''는 문자이고, ""는 문자열이다.

'게임 개발 > 공부' 카테고리의 다른 글

유니티 Canvas  (0) 2024.08.21
비주얼스튜디오&유니티 CS8032 경고 오류  (0) 2024.07.06