SMALL

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

 

1920번: 수 찾기

첫째 줄에 자연수 N(1 ≤ N ≤ 100,000)이 주어진다. 다음 줄에는 N개의 정수 A[1], A[2], …, A[N]이 주어진다. 다음 줄에는 M(1 ≤ M ≤ 100,000)이 주어진다. 다음 줄에는 M개의 수들이 주어지는데, 이 수들

www.acmicpc.net


  • 문제


  • 문제풀이

이진탐색트리를 사용하여 시간초과를 만들지 않는것이 핵심이다.

#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
#include <stdlib.h>
int main()
{
	int a = 0, c = 0, d = 0;
	scanf("%d", &a);
	int* arr1 = (int*)malloc(sizeof(int) * a);
	for (int i = 0; i < a; i++)
	{
		scanf("%d", &arr1[i]);
	}

	int b = 0;
	scanf("%d", &b);
	int* arr2 = (int*)malloc(sizeof(int) * b);


	for (int j = 0; j < b; j++)
	{
		scanf("%d", &arr2[j]);
	}

	for (int k = 0; k < a; k++)
	{
		c = 0;
		for (int z = 0; z < b; z++)
		{
			if (arr1[z] == arr2[k])
			{
				c = 1;
			}

		}
		if (c == 1)
		{
			printf("1\n");
		}
		else
		{
			printf("0\n");
		}
	}
	return 0;
}

처음 이런식으로 접근을 했는데 시간초과가 떴었다. 이분탐색을 통해 시간을 단축해야한다.


  • 코드 1
#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
#include <stdlib.h>
#include <string.h> 
#include <search.h>


int ComparePoint(const void* _elem1, const void* _elem2)
{
    int* elem1 = (int*)_elem1;
    int* elem2 = (int*)_elem2;

    if (*elem1 > *elem2)
        return 1;
    else if (*elem1 < *elem2)
        return -1;
    else
        return 0;
}


int main(void)
{
    int n, m;
    scanf("%d", &n);
    int* arr = (int*)malloc(sizeof(int) * n);

    for (int i = 0; i < n; i++)
    {
        int t;
        scanf("%d", &t);
        arr[i] = t;
    }
    
    scanf("%d", &m);
    int* arr2 = (int*)malloc(sizeof(int) * m);
    
    for (int i = 0; i < m; i++)
    {
        int t;
        scanf("%d", &t);
        arr2[i] = t;
    }

    qsort(arr, n, sizeof(int), ComparePoint);
    for (int i = 0; i < m; i++)
    {
        int* find = (int*)bsearch(&arr2[i],
            arr,
            n,
            sizeof(int),
            (int(*)(const void*, const void*)) ComparePoint);
        if (find != NULL)
        {
            printf("1\n");
        }
        else printf("0\n");
    }
    free(arr);
    free(arr2);
    return 0;
}

 


  • 후기

점점 포인터가 많아진다 어렵다

LIST
SMALL

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

 

4948번: 베르트랑 공준

베르트랑 공준은 임의의 자연수 n에 대하여, n보다 크고, 2n보다 작거나 같은 소수는 적어도 하나 존재한다는 내용을 담고 있다. 이 명제는 조제프 베르트랑이 1845년에 추측했고, 파프누티 체비쇼

www.acmicpc.net


  • 문제


  • 문제풀이

기본적으로 에라토스테네스의 체를 활용하는데 문제에서 N보다 크고 2N보다 작거나 같은 소수의 개수를 구하라고 했다. 처음에 N부터 시작해서 몇번 틀렸었다.

 

 

[알고리즘] 에라토스테네스의 체

에라토스테네스의 체란? 소수를 판별하는 알고리즘. 소수들을 대량으로 빠르게 구할 수 있는 알고리즘이다. 에라토스테네스의 체의 원리 단일 숫자의 소수 여부를 확인하는 방법은 2부터 N까지

yongyongyee.tistory.com


  • 코드 1
#include <stdio.h>
#include <stdlib.h>
#include <string.h>

#include <math.h>
#define _CRT_SECURE_NO_WARNINGS

int a[123456*2+1];
int number = 123456*2+1;
void Sieve() {
	for (int i = 2; i <= number; i++) {
		a[i] = i;
	}
	for (int i = 2; i <= number; i++) {
		if (a[i] == 0) continue; 
		for (int j = 2 * i; j <= number; j += i) {
			a[j] = 0;
		}
	}
}
int main(void)
{
	int input;
	Sieve();
	while (true) {
		int count = 0;
		scanf("%d", &input);
		if (input == 1) {
			printf("%d\n", 1);
		}
		else if (input == 0) {
			break;
		}
		else{
			for (int i = input+1; i <= input*2; i++) {
				if (a[i] != 0) {
					count++;
				}
			}
			printf("%d\n", count);
		}
		
	}

}

 


  • 후기

문제를 잘 읽자

LIST
SMALL

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

 

9020번: 골드바흐의 추측

1보다 큰 자연수 중에서  1과 자기 자신을 제외한 약수가 없는 자연수를 소수라고 한다. 예를 들어, 5는 1과 5를 제외한 약수가 없기 때문에 소수이다. 하지만, 6은 6 = 2 × 3 이기 때문에 소수가 아

www.acmicpc.net


  • 문제


  • 문제풀이

기본적으로 에라토스테네스의 체를 활용하여 소수를 분리해놓고 입력받은 수 중위수부터 2번째까지 소수를 찾아 입력하면 골드바흐 파티션이 나오게 된다.

 

 

[알고리즘] 에라토스테네스의 체

에라토스테네스의 체란? 소수를 판별하는 알고리즘. 소수들을 대량으로 빠르게 구할 수 있는 알고리즘이다. 에라토스테네스의 체의 원리 단일 숫자의 소수 여부를 확인하는 가장 기초적인 방법

yongyongyee.tistory.com


  • 코드 1
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <math.h>
#define _CRT_SECURE_NO_WARNINGS

int a[10001];
int number = 10001;
void Sieve() {

	for (int i = 2; i <= number; i++) {
		a[i] = i;
	}

	for (int i = 2; i <= number; i++) {
		if (a[i] == 0) continue;

		for (int j = 2 * i; j <= number; j += i) {
			a[j] = 0;
		}
	}
	
	
}
int main(void)
{
	int N;
	int input;
	scanf("%d", &N);
	Sieve();
	
	for (int i = 0; i<N; i++) {
		scanf("%d", &input);
		for (int j = input/2; j >= 2; j--) {
			if (a[j]!=0&&a[input-j]!=0) {
				printf("%d %d\n", j,input-j);
				break;
			}
		}
	}

}

  • 후기

C언어가 이번엔 더 쉬웠다

LIST
SMALL

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

 

9020번: 골드바흐의 추측

1보다 큰 자연수 중에서  1과 자기 자신을 제외한 약수가 없는 자연수를 소수라고 한다. 예를 들어, 5는 1과 5를 제외한 약수가 없기 때문에 소수이다. 하지만, 6은 6 = 2 × 3 이기 때문에 소수가 아

www.acmicpc.net


  • 문제


  • 문제풀이

기본적으로 에라토스테네스의 체를 활용하여 소수를 분리해놓고 입력받은 수 중위수부터 2번째까지 소수를 찾아 입력하면 골드바흐 파티션이 나오게 된다.

 

 

[알고리즘] 에라토스테네스의 체

에라토스테네스의 체란? 소수를 판별하는 알고리즘. 소수들을 대량으로 빠르게 구할 수 있는 알고리즘이다. 에라토스테네스의 체의 원리 단일 숫자의 소수 여부를 확인하는 가장 기초적인 방법

yongyongyee.tistory.com


  • 코드 1
using System.IO.Pipes;
using System.Text;

namespace YONGYONG2
{
    internal class Program
    {
        public static int count;
        public static StringBuilder sb = new StringBuilder();

        static void Prime(int num)
        {
            int[] temp = new int[10001];
            for (int i = 2; i <= num; i++)
            {
                temp[i] = i;
            }
            for (int i = 2; i <= num; i++)
            {
                if (temp[i] == 0) continue;
                for (int j = i + i; j <= num; j += i)
                {
                    temp[j] = 0;
                }
            }
            
            
             for(int j=num/2;j>=2;j--)
             {
                 if (temp[j] != 0 && temp[num-j] != 0)
                 {
                     sb.Append(j+" ");
                     sb.Append(num-j+"\n");
                     break;
                 }
             }
        }
        static void Main(string[] args)
        {
            int T=int.Parse(Console.ReadLine());
            for(int i=0; i<T; i++)
            {
                int N=int.Parse(Console.ReadLine());
                
                Prime(N);
            }
           
            Console.WriteLine(sb.ToString());

        }
    }
}

  • 후기

sb.Append에는 함수값이 동시에 들어갈 수 없었다. 그래서 저렇게 나누어 넣었다. 아니면 내가 모르는 뭔가 있을지도...?

LIST

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

[C#]백준 1260번: DFS와 BFS  (0) 2023.03.04
[C#]백준 1920번: 수 찾기  (0) 2023.02.19
[C#]백준 6198번: 옥상 정원 꾸미기  (0) 2023.02.05
[C#]4948번: 베르트랑 공준  (0) 2023.02.04
[C#]백준 1929번: 소수 구하기  (0) 2023.02.04
SMALL

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

 

6198번: 옥상 정원 꾸미기

문제 도시에는 N개의 빌딩이 있다. 빌딩 관리인들은 매우 성실 하기 때문에, 다른 빌딩의 옥상 정원을 벤치마킹 하고 싶어한다. i번째 빌딩의 키가 hi이고, 모든 빌딩은 일렬로 서 있고 오른쪽으

www.acmicpc.net


  • 문제


  • 문제풀이

 

처음에는 스택을 두개를 만들어서 하나는 배열로 만들어 거꾸로 순서를 만들어 뒤에서부터 비교를 하면 좋을 것 같다고 생각했다. 맨뒤의 빌딩부터 비교하면서 만약 자신보다 더 뒤에있는 빌딩이 더 작다면 카운트를 세어주고 그렇지 않다면 for문을 끝내는 방식을 사용하려고 했다. 하지만 시간초과도 아닌 메모리 초과를 받게 되었다. 구조체가 너무 많아지고 수가 커지면 할당되는 메모리가 커져서 그런 것 같다. 이런 방법으로 살려보려다가 다른 방식으로 결국 변경했다.

using System.Text;

namespace YongYong2
{

    internal class Program
    {
        static void Main(string[] args)
        {
            Stack<int> towerlevel = new Stack<int>();
            Stack<int> check = new Stack<int>();
            long N = int.Parse(Console.ReadLine());
            long count = 0;
            int[] checking = new int[N];
            for (int i = 0; i < N; i++)
            {
                check.Push(int.Parse(Console.ReadLine()));
                checking = check.ToArray();
            }
            while (N-- > 0)
            {
                towerlevel.Push(check.Pop());

                if (towerlevel.Count() == 1)
                {
                    continue;
                }
                else
                {
                    for (long j = towerlevel.Count() - 2; j >= 0; j--)
                    {

                        if (towerlevel.Peek() > checking[j])
                        {
                            count++;

                        }
                        else
                        {

                            break;
                        }

                    }

                }
            }

            Console.Write(count);
        }
    }
}

노력의 흔적

틀리면 틀리다고 나오는 걸 보면 답은 맞을지도...?

 

그래서 그냥 싹 갈아엎고 다른 방식으로 접근했다.

스택을 넣어주면서 이전의 빌딩보다 높은 빌딩이 나온다면 스택에서 없애주고 빌딩의 개수를 세어준다.

 

코드 과정

1. 10이 들어가면 while문에 걸리지 않고 스택에 들어가게 된다.

스택: 10

카운트: +0

 

2. 3이 들어가면 역시 while문에 들어가지않고 push된다.

스택: 10 3

카운트: +0+1

 

3. 7이 들어가면 while문에 걸리게 되고 10이 나올때까지 pop을 해주고 push된다.

스택: 10 3 -> 10 7

카운트 +0+1+1

 

4. 4가 들어가면 while에 걸리지 않고 스택에 들어간다.

스택: 10 7 4

카운트+0+1+1+2

 

5. 12가 들어가면 while문에 걸리게 되고 pop을 해주게 된다.

스택: 10 7 4 -> 12

카운트+0+1+1+2+0

 

6. 2가 들어가면 while에 걸리지 않고 스택에 넣어준다.

스택: 12 2

카운트+0+1+1+2+0+1=5


  • 코드 1
using System.Text;

namespace YongYong2
{
    
    internal class Program
    {
        public static Stack<int> stack = new Stack<int>();
        public static long answer = 0;
        public static void Solution(int N)
        {
           
             while (stack.Count() != 0 && stack.Peek() <= N)
             {
                 stack.Pop();
             }
             answer += stack.Count();
             stack.Push(N);
            
        }
        static void Main(string[] args)
        {
            int N = int.Parse(Console.ReadLine());
            for(int i = 0; i < N; i++)
            {
                int input=int.Parse(Console.ReadLine());
                Solution(input);
            }
            Console.WriteLine(answer);
        }
    }
}

  • 후기

항상 어렵게 풀기보다 어려운걸 쉽게 풀려고 노력하는게 가장 중요한 것 같다.

LIST

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

[C#]백준 1920번: 수 찾기  (0) 2023.02.19
[C#]백준 9020번: 골드바흐의 추측  (0) 2023.02.05
[C#]4948번: 베르트랑 공준  (0) 2023.02.04
[C#]백준 1929번: 소수 구하기  (0) 2023.02.04
[C#]백준 1978번: 소수 찾기  (0) 2023.02.04
SMALL

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

 

4948번: 베르트랑 공준

베르트랑 공준은 임의의 자연수 n에 대하여, n보다 크고, 2n보다 작거나 같은 소수는 적어도 하나 존재한다는 내용을 담고 있다. 이 명제는 조제프 베르트랑이 1845년에 추측했고, 파프누티 체비쇼

www.acmicpc.net


  • 문제


  • 문제풀이

기본적으로 에라토스테네스의 체를 활용하는데 문제에서 N보다 크고 2N보다 작거나 같은 소수의 개수를 구하라고 했다. 처음에 N부터 시작해서 몇번 틀렸었다.

 

 

[알고리즘] 에라토스테네스의 체

에라토스테네스의 체란? 소수를 판별하는 알고리즘. 소수들을 대량으로 빠르게 구할 수 있는 알고리즘이다. 에라토스테네스의 체의 원리 단일 숫자의 소수 여부를 확인하는 방법은 2부터 N까지

yongyongyee.tistory.com


  • 코드 1
using System.IO.Pipes;
using System.Text;

namespace ConsoleApp7
{
    internal class Program
    {
        public static int count;
        public static StringBuilder sb = new StringBuilder();

        static void CalcPrime(int N)
        {
            int num = N * 2;
            int[] temp = new int[num + 1];
            for (int i = 2; i <= num; i++)
            {
                temp[i] = i;
            }
            for (int i = 2; i <= num; i++)
            {
                if (temp[i] == 0) continue;
                for (int j = i + i; j <= num; j += i)
                {
                    temp[j] = 0;
                }
            }
            
            for (int i = N+1; i <= num; i++)
            {
                if (temp[i] != 0)
                {
                    count++;
                    //sb.Append(temp[i] + " "); 소수 확인용

                }
            }
            sb.Append(count+"\n");
        }
        static void Main(string[] args)
        {
            while(true)
            {
                int N=int.Parse(Console.ReadLine());
                if (N == 1)
                {
                    sb.Append("1\n");
                }
                else if (N == 0)
                {
                    break;
                }
                else
                {
                    count = 0;
                    CalcPrime(N);
                }
            }
           
            Console.WriteLine(sb.ToString());

        }
    }
}

 


  • 후기

문제를 잘 읽자

LIST

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

[C#]백준 9020번: 골드바흐의 추측  (0) 2023.02.05
[C#]백준 6198번: 옥상 정원 꾸미기  (0) 2023.02.05
[C#]백준 1929번: 소수 구하기  (0) 2023.02.04
[C#]백준 1978번: 소수 찾기  (0) 2023.02.04
[C#]백준 13335번: 트럭  (4) 2023.02.02
SMALL

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

 

1929번: 소수 구하기

첫째 줄에 자연수 M과 N이 빈 칸을 사이에 두고 주어진다. (1 ≤ M ≤ N ≤ 1,000,000) M이상 N이하의 소수가 하나 이상 있는 입력만 주어진다.

www.acmicpc.net


  • 문제


  • 문제풀이

C언어로 먼저 풀 때 단순 반복문으로는 시간이 오래걸림을 알게되어 처음부터 에라토스테네스의 체를 사용하여 문제를 풀었다.

 

 

[알고리즘] 에라토스테네스의 체

에라토스테네스의 체란? 소수를 판별하는 알고리즘. 소수들을 대량으로 빠르게 구할 수 있는 알고리즘이다. 에라토스테네스의 체의 원리 단일 숫자의 소수 여부를 확인하는 방법은 2부터 N까지

yongyongyee.tistory.com


  • 코드 1
using System.IO.Pipes;
using System.Text;

namespace YONGYONG2
{
    internal class Program
    {
        public static StringBuilder sb = new StringBuilder();

        static void Prime(int N,int num)
        {
            int[] temp = new int[num + 1];
            for (int i = 2; i <= num; i++)
            {
                temp[i] = i;
            }
            for (int i = 2; i <= num; i++)
            {
                if (temp[i] == 0) continue;
                for (int j = i + i; j <= num; j += i)
                {
                    temp[j] = 0;
                }
            }
            
            for (int i = N; i <= num; i++)
            {
                if (temp[i] != 0)
                {
                    
                    sb.Append(temp[i] + " ");

                }
            }
        }
        static void Main(string[] args)
        {
            string[] arr = Console.ReadLine().Split();
            int N = int.Parse(arr[0]);
            int M = int.Parse(arr[1]);
           
            Prime(N,M);

            Console.WriteLine(sb.ToString());

        }
    }
}

 


  • 후기

에라토스테네스만 복붙하면 소수문제는 거의 다 풀리는 것 같다.

LIST

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

[C#]백준 6198번: 옥상 정원 꾸미기  (0) 2023.02.05
[C#]4948번: 베르트랑 공준  (0) 2023.02.04
[C#]백준 1978번: 소수 찾기  (0) 2023.02.04
[C#]백준 13335번: 트럭  (4) 2023.02.02
[C#]백준 1874번: 스택 수열  (0) 2023.02.01
SMALL

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

 

1929번: 소수 구하기

첫째 줄에 자연수 M과 N이 빈 칸을 사이에 두고 주어진다. (1 ≤ M ≤ N ≤ 1,000,000) M이상 N이하의 소수가 하나 이상 있는 입력만 주어진다.

www.acmicpc.net


  • 문제


  • 문제풀이

처음에는 소수 찾기 문제처럼 숫자를 입력받아 2부터 자기자신 전 까지 0으로 나누어 떨어지는 값을 제외하고 출력을 해주려고 했다.

 

  • 시간초과 코드
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <iostream>
#define _CRT_SECURE_NO_WARNINGS

int main()
{
    int N;
    int M;
    int count;
    scanf("%d %d", &N, &M);
    for (int i = N; i <= M; i++) {
        if (i == 1) {
            continue;
        }
        count = 0;
        for (int j = 2; j < i; j++) {
            if (i % j == 0) {
                count++;
            }
            
        }
        if (count == 0) {
            printf("%d\n", i);
        }
    }
    
}

그러면 시간 초과가 떠버린다.

 

조건이 1<N,M<1,000,000이라 그런가보다

 

그렇다면 범위 M까지가 아닌 M의 제곱근까지로 한정해서 풀었다. 자연수를 나눌때 몫과 나머지는 제곱근보다 작다는 성질을 이용하는 것이다.

  • 코드 1
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <iostream>
#include <math.h>
#define _CRT_SECURE_NO_WARNINGS

int main()
{
    int N;
    int M;
    int count;
    scanf("%d %d", &N, &M);
    for (int i = N; i <= M; i++) {
        if (i == 1) {
            continue;
        }
        int Ans = sqrt(i) + 1;
        count = 0;
        for (int j = 2; j < Ans; j++) {
            if (i % j == 0) {
                count++;
            }
            
        }
        if (count == 0) {
            printf("%d\n", i);
        }
    }
    
}

얘도 참 오래걸린다

 

 

 

마지막으로는 에라토스테네스의 체를 사용했다. 소수가 아닌 모든 값을 출력해주었다. 그랬더니 시간이 대폭 줄어들었다. 

 

[알고리즘] 에라토스테네스의 체

에라토스테네스의 체란? 소수를 판별하는 알고리즘. 소수들을 대량으로 빠르게 구할 수 있는 알고리즘이다. 에라토스테네스의 체의 원리 단일 숫자의 소수 여부를 확인하는 방법은 2부터 N까지

yongyongyee.tistory.com


  • 코드 1
#include <stdio.h>
#include <stdlib.h>
#include <string.h>

#include <math.h>
#define _CRT_SECURE_NO_WARNINGS

int a[1000001];
int number = 1000001;
void Sieve() {

	for (int i = 2; i <= number; i++) {
		a[i] = i;
	}

	for (int i = 2; i <= number; i++) {
		if (a[i] == 0) continue; 

		for (int j = 2 * i; j <= number; j += i) {
			a[j] = 0;
		}
	}
	
	
}
int main(void)
{
	int count = 0;
	int M,N;
		
	scanf("%d %d", &N,&M);
	int input = 100001;

	Sieve();
	for (int i = N; i <= M; i++) {
		if (a[i] != 0) {
			printf("%d\n", a[i]);
		}
	}

}

  • 후기

에라토스테네스 그는 신인가?

LIST

+ Recent posts