[백준] 2581번 : 소수/ C언어

Boknami·2022년 1월 20일
1

백준문제풀이

목록 보기
6/45

📑문제

N, M을 입력 받고 N~M사이 소수 중 최솟값과 소수들의 합을 구하라


👀 핵심 포인트

1. 소수를 어떻게 찾을 것인가? 👉 % == 0
->이전 1978번과 똑같은 방법으로 나눗셈 진행 후 나머지가 0임을 이용과 반복문 사용을 통해 소수를 찾았다.이번엔 큰 틀은 N~M까지 반복문을 돌고 그 안에서 소수를 찾는 반복문을 한 번 더 사용하였다.
만약 나누어지는 숫자가 2라면 (Judge == 2)이면 소수인 것을 발견하게된다!

for (int i = N; i <= M; i++)
	{
		Judge = 0;
		//<------소수 찾기 알고리즘------>
		for (int j = 1; j <= i ; j++)
		{
			if ((i % j) == 0)
			{
				//printf("%d : 나눠짐 발견! %d\n", i, j);
				Judge = Judge + 1;
			}
		}
        

2. 최솟값을 어떻게 찾을 것인가? 👉 변수 이용
최솟값을 어떻게 찾을건지에 대해서 조금 고민을 하였다. 배열 같은 공간에 모든 소수들을 모아두고 첫 번째 저장되는 인덱스를 사용할까 하는 생각도 들었는데, 어떻게든 간단한 방법으로 할 수 있을 것 같아 고민하던 도중에 변수를 이용해서 첫 번째로 찾는 소수를 킵해두기로 하였다.
소수를 찾게 되면 Count라는 변수를 ++해주게 되는데 이 Count가 1이 되는 순간 최솟값을 저장해주는 것으로 코드를 작성하였다.

if (Judge == 2)
{
	Count++;
	//printf("%d : 소수 발견!\n", i);
	
	Sum = Sum + i;
    
    //<-----최솟값 미리 저장----->
	if (Count == 1)
		Smallest = i;
}

🤦‍♀️틀린 이유🤦‍♂️

  1. 반복문 안에 있는 조건문에 i,j, 변수 등을 잘못 적어서 흐름이 정상적으로 작동하지 않았다.

  2. 문제에서 요구하는 건 Sum값이 먼저 나오고 최솟값이 나와야 하는데 나는 최솟값을 먼저 출력하고 Sum을 출력해서 정답 처리가 안되었다..


😮 느낀 점

이전 문제도 소수였기에 크게 어려운 문제는 아니었으나 문제에서 요구하는 정보가 무엇인지 정확하게 보고 문제를 풀어됨을 느꼈다. 사실 너무 당연한 이야기이긴하다..😓


🧾 전체 코드

#define _CRT_SECURE_NO_WARNINGS 
#include<stdio.h>
#include<stdlib.h>
#include<string.h>

int main()
{
	int N;
	int M;
	int Smallest = 0;
	int Sum = 0;

	int Judge = 0;
	int Count = 0;

	scanf("%d", &N);
	scanf("%d", &M);

	// N ~ M 까지 반복문 돌자
	for (int i = N; i <= M; i++)
	{
		Judge = 0;
		//소수 찾기 알고리즘
		for (int j = 1; j <= i ; j++)
		{
			if ((i % j) == 0)
			{
				//printf("%d : 나눠짐 발견! %d\n", i, j);
				Judge = Judge + 1;
			}
		}

		if (Judge == 2)
		{
			Count++;
			//printf("%d : 소수 발견!\n", i);
			//소수를 찾음
			Sum = Sum + i;

			if (Count == 1)
			{
				Smallest = i;
			}
		}

		Judge = 0;
	}

	if (Count == 0)
	{
		printf("-1");
	}
	else
	{
		printf("%d\n", Sum);
		printf("%d\n", Smallest);
		
	}
	
}

0개의 댓글