- 개인 공부용 포스트. 초짜이므로 정확하지 않을 수 있음. 지적 환영
[백준 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 |