SMALL

https://www.acmicpc.net/problem/10773

 

10773번: 제로

첫 번째 줄에 정수 K가 주어진다. (1 ≤ K ≤ 100,000) 이후 K개의 줄에 정수가 1개씩 주어진다. 정수는 0에서 1,000,000 사이의 값을 가지며, 정수가 "0" 일 경우에는 가장 최근에 쓴 수를 지우고, 아닐 경

www.acmicpc.net


  • 문제


  • 문제풀이

첫번째 줄에서 N을 받아 N개만큼 숫자를 받아 Stack에 집어 넣는다. 0이라면 Pop 0이 아니라면 Push를 한뒤 스택에 남은 숫자들을 더해준다. 숫자를 더할때에는 foreach를 통해 더해주거나 Stack.Sum()을 출력해주면 된다.

 


  • 코드 1
namespace YongYong2
{
    internal class Program
    {
        static void Main(string[] args)
        {
            Stack<int> stack = new();
            int temp = 0;
            int N=int.Parse(Console.ReadLine()); 
            for(int i = 0; i < N; i++)
            {
                int num=int.Parse(Console.ReadLine());
                if(num==0)
                {
                    stack.Pop();
                }
                else
                {
                    stack.Push(num);
                }                
            }
            foreach(int item in stack)
            {
                temp += item;
            }
            Console.WriteLine(temp);
            //Console.WriteLine(stack.Sum()); 이것도 사용가능
        }
    }
}

  • 후기

어쩌다보니 Stack.Sum()을 알게 되었다.

LIST

'백준 > C#' 카테고리의 다른 글

[C#]백준 2164번: 카드2  (0) 2023.01.28
[C#]백준 9012번: 괄호  (0) 2023.01.14
[C#]백준 2775번: 부녀회장이 될테야  (0) 2023.01.05
[C#]백준 10828번: 스택  (0) 2023.01.05
[C#]5597번: 과제 안 내신 분..?  (0) 2023.01.05
SMALL

https://www.acmicpc.net/problem/2775

 

2775번: 부녀회장이 될테야

첫 번째 줄에 Test case의 수 T가 주어진다. 그리고 각각의 케이스마다 입력으로 첫 번째 줄에 정수 k, 두 번째 줄에 정수 n이 주어진다

www.acmicpc.net


  • 문제


  • 문제풀이

첫째 줄 T를 받아 몇번을 반복할지 결정한다 그 이후 각각 k와 n을 받아준다. k와n을 2중 for문을 통해 배열을 생성해준 아래층 집과 같은 층 왼쪽 집의 수를 더하면 그 집의 수가 나오게 된다.


  • 코드 1
namespace YONGYONG2
{
    internal class Program
    {
        static void Main(string[] args)
        {
            int T=int.Parse(Console.ReadLine());
            int k;
            int n;

            for (int i = 0; i < T; i++)
            {
                k = int.Parse(Console.ReadLine());
                n = int.Parse(Console.ReadLine());
                int[,] roomnum = new int[k + 1, n + 1];
                roomnum[k, n] = 0;


                for(int j=1;j<k+1;j++) roomnum[j, 1] = 1;
                for(int j=1;j<n+1;j++) roomnum[0, j] = j;
                for(int j = 1; j < k + 1; j++)
                {
                    for(int b=2; b < n + 1; b++)
                    {
                        roomnum[j,b] = roomnum[j, b - 1] + roomnum[j-1,b];
                    }
                }                
                Console.WriteLine(roomnum[k, n]);
            }
        }
    }
}

  • 후기

손으로 그려가면서 풀면 조금 더 이해가 쉬운 것 같다.

LIST

'백준 > C#' 카테고리의 다른 글

[C#]백준 9012번: 괄호  (0) 2023.01.14
[C#]백준 10773번: 제로  (0) 2023.01.05
[C#]백준 10828번: 스택  (0) 2023.01.05
[C#]5597번: 과제 안 내신 분..?  (0) 2023.01.05
[C#]1110번: 더하기 사이클  (0) 2023.01.05
SMALL

https://www.acmicpc.net/problem/10828

 

10828번: 스택

첫째 줄에 주어지는 명령의 수 N (1 ≤ N ≤ 10,000)이 주어진다. 둘째 줄부터 N개의 줄에는 명령이 하나씩 주어진다. 주어지는 정수는 1보다 크거나 같고, 100,000보다 작거나 같다. 문제에 나와있지

www.acmicpc.net


  • 문제


  • 문제풀이

첫번째 줄에서 N을 받아 N번동안 입력값을 받아 문자에 따른 숫자만 출력하면 될 줄 알았다.

namespace BaekJoon
{
    internal class Program
    {

        static void Main(string[] args)
        {
            Stack<int> stack = new Stack<int>();
            int N=int.Parse(Console.ReadLine());
            for(int i = 0; i < N; i++)
            {
                string[] input = Console.ReadLine().Split();
                if (input[0]=="push")
                {
                    stack.Push(int.Parse(input[1]));
                }
                else if (input[0] == "pop")
                {
                    if(stack.Count==0)
                    {
                        Console.WriteLine("-1");
                    }
                    else
                    {
                        Console.WriteLine(stack.Pop());
                    }
                }
                else if (input[0] == "size")
                {
                    Console.WriteLine(stack.Count());
                }
                else if (input[0] == "empty")
                {
                    if(stack.Count()==0)
                    {
                        Console.WriteLine("1");
                    }
                    else
                    {
                        Console.WriteLine("0");
                    }
                }
                else
                {
                    if (stack.Count() == 0)
                    {
                        Console.WriteLine("-1");
                    }
                    else
                    {
                        Console.WriteLine(stack.Peek());
                    }
                }
                
            }
        }
    }
}

이렇게 입력을 하게 된다면 시간 초과가 뜨게 된다.

Console.WriteLine은 시간이 많이 걸리는 작업이기 때문에 여러번 호출하면 시간이 오래 걸리게 되고, 시간이 초과가 된다.

Console.WriteLine을 최소화하기 위해서는 StringBuilder을 사용한다.

 

StringBuilder

  • String
    • 변경할 수 없는 형식
    • 변경을 하면 변경된 문자열을 위한 새로운 String을 만들어 냄
    • 반복적으로 계속 String을 변경하면 성능 저하가 일어난다.
  • StringBuilder
    • 변경 가능한 문자열 Class
    • Indexof()StartsWith()같은 검색 메서드가 부족해 필요하다면 다시 String으로 변환해 사용해야 한다.
    • 메서드
      • .Append
      • .AppendLine
      • .Insert
      • .Replace
      • .Length
      • .ToString()

선언 방식은 다른 자료구조 처럼 StringBuilder 이름 = new StringBuilder();을 통해 선언한다. String은 값타입이 아닌 참조변수이며 문자열을 조합 할 때마다 새로운 클래스가 생성되고 이전의 데이터들은 수집되기 때문에 부하가 발생하지만 StringBuilder은 새로운 변수를 사용하지 않고 결합할 수 있게 된다.

따라서 이 코드는 StringBuilder을 사용하여 출력을 하면 정상적으로 올바르게 나오게 된다.


  • 코드 1
namespace YONGYONG2
{
    internal class Program
    {

        static void Main(string[] args)
        {

            Stack<int> stack = new Stack<int>();
            StringBuilder sb = new StringBuilder();
            int N=int.Parse(Console.ReadLine()); 
            for(int i = 0; i < N; i++)
            {
                string[] input = Console.ReadLine().Split();
                if (input[0]=="push")
                {
                    stack.Push(int.Parse(input[1]));
                }
                else if (input[0] == "pop")
                {
                    if(stack.Count==0)
                    {
                        sb.AppendLine("-1");
                    }
                    else
                    {
                        sb.Append(stack.Pop()+"\n");
                    }
                }
                else if (input[0] == "size")
                {
                    sb.Append(stack.Count()+"\n");
                }
                else if (input[0] == "empty")
                {
                    if(stack.Count()==0)
                    {
                        sb.AppendLine("1");
                    }
                    else
                    {
                        sb.AppendLine("0");
                    }
                }
                else
                {
                    if (stack.Count() == 0)
                    {
                        sb.AppendLine("-1");
                    }
                    else
                    {
                        sb.Append(stack.Peek()+"\n");
                    }
                }
                
            }
            Console.WriteLine(sb.ToString());
        }
    }
}

  • 후기

시간 초과가 떠서 당황했는데 StringBuilder에 대해 알게 되었다.

 

LIST

'백준 > C#' 카테고리의 다른 글

[C#]백준 10773번: 제로  (0) 2023.01.05
[C#]백준 2775번: 부녀회장이 될테야  (0) 2023.01.05
[C#]5597번: 과제 안 내신 분..?  (0) 2023.01.05
[C#]1110번: 더하기 사이클  (0) 2023.01.05
[C#]백준 2442번: 별 찍기 - 5  (0) 2023.01.05
SMALL

https://www.acmicpc.net/problem/5597

 

5597번: 과제 안 내신 분..?

X대학 M교수님은 프로그래밍 수업을 맡고 있다. 교실엔 학생이 30명이 있는데, 학생 명부엔 각 학생별로 1번부터 30번까지 출석번호가 붙어 있다. 교수님이 내준 특별과제를 28명이 제출했는데,

www.acmicpc.net

 

 


  • 문제


  • 문제풀이

배열을 생성한 후 각 배열에 1부터 30까지 넣어준다. 그 이후 입력된 값을 받으면서 입력받은 값이 1부터 30까지 있다면 0으로 바꾸어준다. 이후에는 배열에서 0이 아닌값을 출력해준다.

 


  • 코드 1
namespace BaekJoon
{
    internal class Program
    {
        static void Main(string[] args)
        {
            int[] student = new int[30];       
            for(int i=0;i<30;i++)
            {
                student[i] = i+1;
            }     
            for(int i = 0; i < 28; i++)
            {            
                int N=int.Parse(Console.ReadLine());
                for (int j = 1; j <= 30; j++)
                {
                    if (j == N)
                    {
                        student[j - 1] = 0;
                    }
                }
            }
            for(int i=0;i<student.Length;i++)
            {
                if (student[i]!=0) Console.WriteLine(student[i]);
            }
        }
    }
}

 


  • 후기

배열을 만들어 입력값과 비교한다

LIST

'백준 > C#' 카테고리의 다른 글

[C#]백준 10773번: 제로  (0) 2023.01.05
[C#]백준 2775번: 부녀회장이 될테야  (0) 2023.01.05
[C#]백준 10828번: 스택  (0) 2023.01.05
[C#]1110번: 더하기 사이클  (0) 2023.01.05
[C#]백준 2442번: 별 찍기 - 5  (0) 2023.01.05
SMALL

https://www.acmicpc.net/problem/1110

 

1110번: 더하기 사이클

0보다 크거나 같고, 99보다 작거나 같은 정수가 주어질 때 다음과 같은 연산을 할 수 있다. 먼저 주어진 수가 10보다 작다면 앞에 0을 붙여 두 자리 수로 만들고, 각 자리의 숫자를 더한다. 그 다음,

www.acmicpc.net


  • 문제

  • 문제풀이

a, b, c, d를 만들어준다. a는 첫번째 수의 십의자리, b는 첫번째 수의 일의자리, c는 첫번째 숫자의 십의자리와 일의자리를 더해 나온수로 두번째 수의 일의자리이며, d는 두번째 나올 수이다. sum에 처음의 수를 입력해주고 만들어진 d와 sum에 할당된 숫자가 같아질때까지 반복을 돌린뒤 반복의 횟수를 출력한다.

 


  • 코드 1
#include <iostream>
#include <stdio.h>
using namespace std;
int main() {
    int a,b,c,d;
    int N;
    int count=0;
    int sum;
    scanf("%d",&N);
    sum=N;
    while(1){
        a=N/10;
        b=N%10;
        c=(a+b)%10;
        d=b*10+c;
        N=d;
        count++;
        if(d==sum)break;
    }
    printf("%d",count);
}

  • 후기

반복문을 사용하여 규칙을 찾을 수 있다

LIST

'백준 > C언어' 카테고리의 다른 글

[C언어]백준 2525: 오븐시계  (0) 2023.01.05
[C언어]백준 1193번: 분수찾기  (0) 2023.01.05
[C언어]2445번: 지능형 기차  (0) 2023.01.05
[C언어]백준 2490: 윷놀이  (0) 2023.01.05
[C언어]백준 2442번: 별 찍기 - 5  (0) 2023.01.05
SMALL

https://www.acmicpc.net/problem/1110

 

1110번: 더하기 사이클

0보다 크거나 같고, 99보다 작거나 같은 정수가 주어질 때 다음과 같은 연산을 할 수 있다. 먼저 주어진 수가 10보다 작다면 앞에 0을 붙여 두 자리 수로 만들고, 각 자리의 숫자를 더한다. 그 다음,

www.acmicpc.net


  • 문제

  • 문제풀이

a, b, c, d를 만들어준다. a는 첫번째 수의 십의자리, b는 첫번째 수의 일의자리, c는 첫번째 숫자의 십의자리와 일의자리를 더해 나온수로 두번째 수의 일의자리이며, d는 두번째 나올 수이다. sum에 처음의 수를 입력해주고 만들어진 d와 sum에 할당된 숫자가 같아질때까지 반복을 돌린뒤 반복의 횟수를 출력한다.

 


  • 코드 1
namespace BaekJoon
{
    internal class Program
    {
        public static int N;
        public static int Count;
        public static void Solution()
        {
            Count= 0;
            int sum = N; //더했을 때 처음 수 할당
            while (true)
            {
                int a = N / 10; 
                int b = N % 10; 
                int c = (a + b) % 10; 
                int d = b * 10 + c; //두번째 나올 수
                N = d; //N에 다시 할당
                Count++; //횟수 체크
                if (d == sum) break; //다시 처음 수가 나온다면 그만
            }
            Console.WriteLine(Count);
        }

        static void Main(string[] args)
        {
            N = int.Parse(Console.ReadLine());

            Solution();
        }
    }
}

  • 후기

C#을 공부하기위해 클래스를 생성하여 풀어보았다.

LIST

'백준 > C#' 카테고리의 다른 글

[C#]백준 10773번: 제로  (0) 2023.01.05
[C#]백준 2775번: 부녀회장이 될테야  (0) 2023.01.05
[C#]백준 10828번: 스택  (0) 2023.01.05
[C#]5597번: 과제 안 내신 분..?  (0) 2023.01.05
[C#]백준 2442번: 별 찍기 - 5  (0) 2023.01.05
SMALL

https://www.acmicpc.net/problem/2455

 


  • 문제


  • 문제풀이

4번의 반복동안 기차에 사람이 타고 내린 사람의 수를 count안에 넣어 출력한다.


  • 코드 1
#include<stdio.h>
int main()
{
	int a,b;
	int sum=0;
	int total=0;
	for(int i=0;i<4;i++){
	    scanf("%d %d",&a,&b);
	    sum+=(b-a);
	    if (total<=sum){
	        total=sum;
	    }
	}
	printf("%d",total);
}

  • 후기

for문과 if문을 활용하기에 좋은 문제같다.

LIST
SMALL

https://www.acmicpc.net/problem/2490

 

2490번: 윷놀이

우리나라 고유의 윷놀이는 네 개의 윷짝을 던져서 배(0)와 등(1)이 나오는 숫자를 세어 도, 개, 걸, 윷, 모를 결정한다. 네 개 윷짝을 던져서 나온 각 윷짝의 배 혹은 등 정보가 주어질 때 도(배 한

www.acmicpc.net


  • 문제


  • 문제풀이

for문을 돌려 입력을 차례대로 받고 1의 개수를 확인하여 A, B, C, D, E에 맞게 출력한다.


#include <iostream>
#include <stdio.h>
using namespace std;

int main() {
    int a,b,c,d;
    for(int i=0;i<3;i++){
        int count=0;
        for (int j=0;j<4;j++){
        scanf("%d",&a);
        if(a==0) count++;
        }
        if(count==4) printf("D\n");
        if(count==3) printf("C\n");
        if(count==2) printf("B\n");
        if(count==1) printf("A\n");
        if(count==0) printf("E\n");
    }
}

  • 후기

조건문과 반복문을 연습하기 좋다.

LIST

+ Recent posts