백준 2581: 소수

C++/Baekjoon 2023. 1. 29. 20:31

문제

자연수 M과 N이 주어질 때 M이상 N이하의 자연수 중 소수인 것을 모두 골라 이들 소수의 합과 최솟값을 찾는 프로그램을 작성하시오.

예를 들어 M=60, N=100인 경우 60이상 100이하의 자연수 중 소수는 61, 67, 71, 73, 79, 83, 89, 97 총 8개가 있으므로, 이들 소수의 합은 620이고, 최솟값은 61이 된다.


입력

입력의 첫째 줄에 M이, 둘째 줄에 N이 주어진다.

M과 N은 10,000이하의 자연수이며, M은 N보다 작거나 같다.


출력

M이상 N이하의 자연수 중 소수인 것을 모두 찾아 첫째 줄에 그 합을, 둘째 줄에 그 중 최솟값을 출력한다.

단, M이상 N이하의 자연수 중 소수가 없을 경우는 첫째 줄에 -1을 출력한다.


코드

#include <iostream>
#include <cmath>

using namespace std;

static bool IsPrimeNumber(int _number)
{
    // :: 예외처리
	if (_number == 1) return false;
	if (_number == 2) return true;
	
    // :: 2부터 sqrt(_number)까지 나누어 떨어지는 수가 있는지 확인한다.
    int i;
    for (i = 2; i <= sqrt(_number); i++) if (_number % i == 0) return false;

    // :: 소수인 경우
    return true;
}
int main()
{   
    // :: 문제
    // :: 자연수 M과 N이 주어질 때 M이상 N이하의 자연수 중 소수인 것을 모두 골라 이들 소수의 합과 최솟값을 찾는 프로그램을 작성하시오.
    // :: 예를 들어 M=60, N=100인 경우 60이상 100이하의 자연수 중 소수는 61, 67, 71, 73, 79, 83, 89, 97 총 8개가 있으므로, 

    // :: 입력
    // :: 입력의 첫째 줄에 M이, 둘째 줄에 N이 주어진다.
    // :: M과 N은 10,000이하의 자연수이며, M은 N보다 작거나 같다.

    // :: 출력
    // :: M이상 N이하의 자연수 중 소수인 것을 모두 찾아 첫째 줄에 그 합을, 둘째 줄에 그 중 최솟값을 출력한다. 
    // :: 단, M이상 N이하의 자연수 중 소수가 없을 경우는 첫째 줄에 -1을 출력한다.

    // :: 1. M과 N을 입력받는다.
    int M, N;
    cin >> M >> N;

    // :: 2. 소수인지 판별해서 합과 최소값을 구한다.
    int primeNumberMin = -1;
    int primeNumberSum = 0;
    for (int i = M; i <= N; i++)
    {
        if (IsPrimeNumber(i))
        {
            if (primeNumberMin == -1) primeNumberMin = i;
            primeNumberSum += i;
        }
    }

    // :: 3. 예외를 출력한다.
    if(primeNumberMin == -1) {
        cout << primeNumberMin << endl;
        return 0;
    }

    // :: 4. 합과 최소값을 출력한다.
    cout << primeNumberSum << endl;
    cout << primeNumberMin << endl;

    return 0;
}

참고

'C++ > Baekjoon' 카테고리의 다른 글

백준 1978: 소수 찾기  (0) 2023.01.28
백준 11653: 소인수분해  (0) 2023.01.26
백준 1929: 소수 구하기  (0) 2023.01.24
백준 5597: 과제 안 내신 분..?  (0) 2022.12.23
백준 10807: 개수 세기  (0) 2022.12.17
블로그 이미지

RIsN

,

문제

주어진 수 N개 중에서 소수가 몇 개인지 찾아서 출력하는 프로그램을 작성하시오.


입력

첫 줄에 수의 개수 N이 주어진다. N은 100이하이다. 다음으로 N개의 수가 주어지는데 수는 1,000 이하의 자연수이다.


출력

주어진 수들 중 소수의 개수를 출력한다.


코드

#include <iostream>
#include <cmath>

using namespace std;

static int IsPrimeNumber(int _number)
{
    // :: 예외처리
	if (_number == 1) return 0;
	if (_number == 2) return 1;
	
    // :: 2부터 sqrt(_number)까지 나누어 떨어지는 수가 있는지 확인한다.
    int i;
    for (i = 2; i <= sqrt(_number); i++) if (_number % i == 0) return 0;

    // :: 소수인 경우
    return 1;
}
int main()
{   
    // :: 문제
    // :: 주어진 수 N개 중에서 소수가 몇 개인지 찾아서 출력하는 프로그램을 작성하시오.
    // :: 첫 줄에 수의 개수 N이 주어진다. N은 100이하이다. 다음으로 N개의 수가 주어지는데 수는 1,000 이하의 자연수이다.
    // :: 주어진 수들 중 소수의 개수를 출력한다.

    // :: 1. N개의 수를 입력받는다.
    int N;
    cin >> N;

    // :: 2. 소수인지 판별한다.
    int primeNumberCount = 0;
    for (int i = 0; i < N; i++)
    {
        int num;
        cin >> num;
        primeNumberCount += IsPrimeNumber(num);
    }

    // :: 3. 소수의 개수를 출력한다.
    cout << primeNumberCount << endl;

    return 0;
}

참고

'C++ > Baekjoon' 카테고리의 다른 글

백준 2581: 소수  (0) 2023.01.29
백준 11653: 소인수분해  (0) 2023.01.26
백준 1929: 소수 구하기  (0) 2023.01.24
백준 5597: 과제 안 내신 분..?  (0) 2022.12.23
백준 10807: 개수 세기  (0) 2022.12.17
블로그 이미지

RIsN

,

문제

정수 N이 주어졌을 때, 소인수분해하는 프로그램을 작성하시오.


입력

첫째 줄에 정수 N (1 ≤ N ≤ 10,000,000)이 주어진다.


출력

N의 소인수분해 결과를 한 줄에 하나씩 오름차순으로 출력한다. N이 1인 경우 아무것도 출력하지 않는다.


코드

#include <iostream>

using namespace std;

int main()
{   
    // :: 정수 N이 주어졌을 때, 소인수분해하는 프로그램을 작성하시오.

    // :: Input
    int number;
    cin >> number;

    // :: Exception
    if(number == 1) return 0;

    // :: Progress
    string result = "";
    for (int i = 2; i <= number; i++)
    {
        while (number % i == 0)
        {
            result += to_string(i) + "\n";
            number /= i;
        }
    }

    // :: Output
    cout << result;
    return 0;
}

참고

'C++ > Baekjoon' 카테고리의 다른 글

백준 2581: 소수  (0) 2023.01.29
백준 1978: 소수 찾기  (0) 2023.01.28
백준 1929: 소수 구하기  (0) 2023.01.24
백준 5597: 과제 안 내신 분..?  (0) 2022.12.23
백준 10807: 개수 세기  (0) 2022.12.17
블로그 이미지

RIsN

,

문제

M이상 N이하의 소수를 모두 출력하는 프로그램을 작성하시오.


입력

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


출력

한 줄에 하나씩, 증가하는 순서대로 소수를 출력한다.


코드

#include <iostream>
#include <cmath>

using namespace std;

int main()
{   
    // :: Input
    int start, end;
    cin >> start >> end;

    // :: Array
    bool* isNotPrime = new bool[end + 1];
    isNotPrime[0] = true;
    isNotPrime[1] = true;

    // :: Process
    string result = "";
    // :: 소수인지 판별 할 자연수의 제곱근을 기준으로 그 숫자의 약수들의 곱셈은 대칭적으로 곱셈이 일어나게 됩니다. 
    // :: 따라서 소수인지 판별할때는 그 자연수의 제곱근 이하의 수까지만 검사를 하면 됩니다.
    // :: 출처: https://velog.io/@tmpks5/Algorithm-소수를-판별하는-방법-제곱근-나누기
    for (int i = 1; i <= sqrt(end); i++)
    {
        // :: Skip if not prime
        if(isNotPrime[i] == true) continue;
        
        // :: Mark as not prime
        for (int j = i * 2; j <= end; j += i)
        {
            isNotPrime[j] = true;
        }
    }
    
    // :: Output
    for (int i = start; i <= end; i++){
        if (isNotPrime[i] == false){
            result += to_string(i) + "\n";
        }
    }
    cout << result;
    return 0;
}

참고

'C++ > Baekjoon' 카테고리의 다른 글

백준 1978: 소수 찾기  (0) 2023.01.28
백준 11653: 소인수분해  (0) 2023.01.26
백준 5597: 과제 안 내신 분..?  (0) 2022.12.23
백준 10807: 개수 세기  (0) 2022.12.17
백준 2839: 설탕 배달  (0) 2022.12.14
블로그 이미지

RIsN

,

문제

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

교수님이 내준 특별과제를 28명이 제출했는데, 그 중에서 제출 안 한 학생 2명의 출석번호를 구하는 프로그램을 작성하시오.


입력

입력은 총 28줄로 각 제출자(학생)의 출석번호 n(1 ≤ n ≤ 30)가 한 줄에 하나씩 주어진다. 출석번호에 중복은 없다.


출력

출력은 2줄이다. 1번째 줄엔 제출하지 않은 학생의 출석번호 중 가장 작은 것을 출력하고, 2번째 줄에선 그 다음 출석번호를 출력한다.


코드

#include <iostream>
#include <map>

using namespace std;

int main() {
    // >> Contain
    map<int, bool> dictionary; // : 키, 밸류 격납 변수 제작
    for(int index = 1; index <= 30; index++) {
        dictionary.insert(pair<int, bool>(index, false));
    }

    // >> Input
    for(int index = 0; index < 28; index ++) {
        // >> Process
        int input;
        cin >> input;
        dictionary.erase(input); // : 키를 통해 밸류를 삭제
    }

    // >> Output
    for(pair<int, bool> ele:dictionary){
		cout << ele.first << endl;
	}
}

참고

'C++ > Baekjoon' 카테고리의 다른 글

백준 11653: 소인수분해  (0) 2023.01.26
백준 1929: 소수 구하기  (0) 2023.01.24
백준 10807: 개수 세기  (0) 2022.12.17
백준 2839: 설탕 배달  (0) 2022.12.14
백준 2869: 달팽이는 올라가고 싶다  (0) 2022.12.06
블로그 이미지

RIsN

,

문제

총 N개의 정수가 주어졌을 때, 정수 v가 몇 개인지 구하는 프로그램을 작성하시오.


입력

첫째 줄에 정수의 개수 N(1 ≤ N ≤ 100)이 주어진다. 둘째 줄에는 정수가 공백으로 구분되어져있다. 셋째 줄에는 찾으려고 하는 정수 v가 주어진다. 입력으로 주어지는 정수와 v는 -100보다 크거나 같으며, 100보다 작거나 같다.


출력

첫째 줄에 입력으로 주어진 N개의 정수 중에 v가 몇 개인지 출력한다.


코드

#include <iostream>
#include <map>

using namespace std;

int main() {
    // >> Input
    int count = 0;
    cin >> count;

    // >> Process
    map<int, int> dictionary; // : 키, 밸류 격납 변수 제작
    for(int index = 0; index < count; index++) {
        // :: 키 입력
        int key = 0;
        cin >> key;

        // : 키가 존재하지 않을 때
        if(dictionary.find(key) == dictionary.end()) {
            dictionary[key] = 1;
        } 
        // :: 키가 존재할 때
        else {
            dictionary[key]++;
        }
    }
    // :: 찾아야 하는 숫자 입력
    int number;
    cin >> number;

    // >> Output
    // :: 찾아야 하는 숫자가 격납 변수에 없을 때
    if(dictionary.find(number) == dictionary.end()) {
        cout << "0" << endl;
    } 
    // ::: 찾아야 하는 숫자가 격납 변수에 있을 때
    else {
        cout << dictionary[number] << endl;
    }
}

참고

'C++ > Baekjoon' 카테고리의 다른 글

백준 1929: 소수 구하기  (0) 2023.01.24
백준 5597: 과제 안 내신 분..?  (0) 2022.12.23
백준 2839: 설탕 배달  (0) 2022.12.14
백준 2869: 달팽이는 올라가고 싶다  (0) 2022.12.06
백준 10250: ACM 호텔  (0) 2022.12.05
블로그 이미지

RIsN

,

문제

상근이는 요즘 설탕공장에서 설탕을 배달하고 있다. 상근이는 지금 사탕가게에 설탕을 정확하게 N킬로그램을 배달해야 한다. 설탕공장에서 만드는 설탕은 봉지에 담겨져 있다. 봉지는 3킬로그램 봉지와 5킬로그램 봉지가 있다.

상근이는 귀찮기 때문에, 최대한 적은 봉지를 들고 가려고 한다. 예를 들어, 18킬로그램 설탕을 배달해야 할 때, 3킬로그램 봉지 6개를 가져가도 되지만, 5킬로그램 3개와 3킬로그램 1개를 배달하면, 더 적은 개수의 봉지를 배달할 수 있다.

상근이가 설탕을 정확하게 N킬로그램 배달해야 할 때, 봉지 몇 개를 가져가면 되는지 그 수를 구하는 프로그램을 작성하시오.


입력

첫째 줄에 N이 주어진다. (3 ≤ N ≤ 5000)


출력

상근이가 배달하는 봉지의 최소 개수를 출력한다. 만약, 정확하게 N킬로그램을 만들 수 없다면 -1을 출력한다.


코드

#include <iostream>

using namespace std;

int main() {
    // :: Input
    int kg;
    cin >> kg;

    // :: Process
    int count = 0;
    while (kg > 0) {
        // :: 5kg로 나누어 떨어지면 나누고 종료
        if (kg % 5 == 0) {
            count += kg / 5;
            kg = 0;
        }
        // :: 3kg씩 빼면서 5kg로 나누어 떨어지는지 확인 
        else {
            kg -= 3;
            count++;
        }
    }

    // :: Output
    // :: kg가 음수일 경우 -1 출력
    if (kg < 0) {
        cout << -1 << endl;
    }
    // :: kg가 0일 경우 count 출력 
    else {
        cout << count << endl;
    }
}

참고

 
 

'C++ > Baekjoon' 카테고리의 다른 글

백준 5597: 과제 안 내신 분..?  (0) 2022.12.23
백준 10807: 개수 세기  (0) 2022.12.17
백준 2869: 달팽이는 올라가고 싶다  (0) 2022.12.06
백준 10250: ACM 호텔  (0) 2022.12.05
백준 2755: 부녀회장이 될테야  (0) 2022.11.28
블로그 이미지

RIsN

,

문제

땅 위에 달팽이가 있다. 이 달팽이는 높이가 V미터인 나무 막대를 올라갈 것이다.

달팽이는 낮에 A미터 올라갈 수 있다. 하지만, 밤에 잠을 자는 동안 B미터 미끄러진다. 또, 정상에 올라간 후에는 미끄러지지 않는다.

달팽이가 나무 막대를 모두 올라가려면, 며칠이 걸리는지 구하는 프로그램을 작성하시오.


입력

첫째 줄에 세 정수 A, B, V가 공백으로 구분되어서 주어진다. (1 ≤ B < A ≤ V ≤ 1,000,000,000)


출력

첫째 줄에 달팽이가 나무 막대를 모두 올라가는데 며칠이 걸리는지 출력한다.


코드

#include <iostream>

using namespace std;

int main() {
    // :: Input
    int climb, slide, height;
    cin >> climb >> slide >> height;

    // :: Process
    height -= slide; // :: 떨어지지 않는 만큼 빼준다.
    int days = height / (climb - slide); // :: 날짜 계산
    if (height % (climb - slide) != 0) { // :: 나머지가 있으면 하루 더 더해준다.
        days += 1;
    }

    // :: Output
    cout << days << endl;

    return 0;
}

참고

 
 

'C++ > Baekjoon' 카테고리의 다른 글

백준 10807: 개수 세기  (0) 2022.12.17
백준 2839: 설탕 배달  (0) 2022.12.14
백준 10250: ACM 호텔  (0) 2022.12.05
백준 2755: 부녀회장이 될테야  (0) 2022.11.28
백준 10757: 큰 수 A+B  (0) 2022.11.20
블로그 이미지

RIsN

,

문제

ACM 호텔 매니저 지우는 손님이 도착하는 대로 빈 방을 배정하고 있다. 고객 설문조사에 따르면 손님들은 호텔 정문으로부터 걸어서 가장 짧은 거리에 있는 방을 선호한다고 한다. 여러분은 지우를 도와 줄 프로그램을 작성하고자 한다. 즉 설문조사 결과 대로 호텔 정문으로부터 걷는 거리가 가장 짧도록 방을 배정하는 프로그램을 작성하고자 한다.

문제를 단순화하기 위해서 호텔은 직사각형 모양이라고 가정하자. 각 층에 W 개의 방이 있는 H 층 건물이라고 가정하자 (1 ≤ H, W ≤ 99). 그리고 엘리베이터는 가장 왼쪽에 있다고 가정하자(그림 1 참고). 이런 형태의 호텔을 H × W 형태 호텔이라고 부른다. 호텔 정문은 일층 엘리베이터 바로 앞에 있는데, 정문에서 엘리베이터까지의 거리는 무시한다. 또 모든 인접한 두 방 사이의 거리는 같은 거리(거리 1)라고 가정하고 호텔의 정면 쪽에만 방이 있다고 가정한다.

그림 1. H = 6 이고 W = 12 인 H × W 호텔을 간략하게 나타낸 그림

방 번호는 YXX 나 YYXX 형태인데 여기서 Y 나 YY 는 층 수를 나타내고 XX 는 엘리베이터에서부터 세었을 때의 번호를 나타낸다. 즉, 그림 1 에서 빗금으로 표시한 방은 305 호가 된다.

손님은 엘리베이터를 타고 이동하는 거리는 신경 쓰지 않는다. 다만 걷는 거리가 같을 때에는 아래층의 방을 더 선호한다. 예를 들면 102 호 방보다는 301 호 방을 더 선호하는데, 102 호는 거리 2 만큼 걸어야 하지만 301 호는 거리 1 만큼만 걸으면 되기 때문이다. 같은 이유로 102 호보다 2101 호를 더 선호한다.

여러분이 작성할 프로그램은 초기에 모든 방이 비어있다고 가정하에 이 정책에 따라 N 번째로 도착한 손님에게 배정될 방 번호를 계산하는 프로그램이다. 첫 번째 손님은 101 호, 두 번째 손님은 201 호 등과 같이 배정한다. 그림 1 의 경우를 예로 들면, H = 6이므로 10 번째 손님은 402 호에 배정해야 한다.


입력

프로그램은 표준 입력에서 입력 데이터를 받는다. 프로그램의 입력은 T 개의 테스트 데이터로 이루어져 있는데 T 는 입력의 맨 첫 줄에 주어진다. 각 테스트 데이터는 한 행으로서 H, W, N, 세 정수를 포함하고 있으며 각각 호텔의 층 수, 각 층의 방 수, 몇 번째 손님인지를 나타낸다(1 ≤ H, W ≤ 99, 1 ≤ N ≤ H × W). 


출력

프로그램은 표준 출력에 출력한다. 각 테스트 데이터마다 정확히 한 행을 출력하는데, 내용은 N 번째 손님에게 배정되어야 하는 방 번호를 출력한다.


코드

#include <iostream>

using namespace std;

int main()
{
    // :: Input
    int caseCount;
    cin >> caseCount;

    // :: Process
    string result = "";
    for (int index = 0; index < caseCount; index++) {
        // :: Input
        int floorCount, roomCount, guestCount;
        cin >> floorCount >> roomCount >> guestCount;

        // :: Get Room Number
        // >> 손님의 수를 층의 수로 나눈 나머지가 방 번호
        // >> 어차피 방 번호는 층에 의해 결정되므로, 층의 수로 나눈 나머지가 방 번호
        int roomNumber = guestCount % floorCount;
        // :: Get Floor Number
        // >> 손님의 수를 층의 수로 나눈 몫이 층 번호
        // >> 층 번호는 1부터 시작하므로, 몫에 1을 더해줌, 다만 방 번호가 0이면 층 번호는 1 감소하고 방 번호는 층의 수로 변경
        int floorNumber = guestCount / floorCount + 1;
        if (roomNumber == 0) {
            roomNumber = floorCount;
            floorNumber--;
        }
        // >> 이거 AI가 다 품, 아마 어딘가에 이런 식으로 연결되어 있는 게 있는 듯
        // >> roomCount 안 써도 된다는 게 신기함

        // :: Add Result
        result = result + to_string(roomNumber * 100 + floorNumber) + "\n";
    }

    // :: Output
    cout << result << endl;

    return 0;
}

참고

 
 
 

'C++ > Baekjoon' 카테고리의 다른 글

백준 2839: 설탕 배달  (0) 2022.12.14
백준 2869: 달팽이는 올라가고 싶다  (0) 2022.12.06
백준 2755: 부녀회장이 될테야  (0) 2022.11.28
백준 10757: 큰 수 A+B  (0) 2022.11.20
백준 2292: 벌집  (0) 2022.10.20
블로그 이미지

RIsN

,

문제

평소 반상회에 참석하는 것을 좋아하는 주희는 이번 기회에 부녀회장이 되고 싶어 각 층의 사람들을 불러 모아 반상회를 주최하려고 한다.

이 아파트에 거주를 하려면 조건이 있는데, “a층의 b호에 살려면 자신의 아래(a-1)층의 1호부터 b호까지 사람들의 수의 합만큼 사람들을 데려와 살아야 한다” 는 계약 조항을 꼭 지키고 들어와야 한다.

아파트에 비어있는 집은 없고 모든 거주민들이 이 계약 조건을 지키고 왔다고 가정했을 때, 주어지는 양의 정수 k와 n에 대해 k층에 n호에는 몇 명이 살고 있는지 출력하라. 단, 아파트에는 0층부터 있고 각층에는 1호부터 있으며, 0층의 i호에는 i명이 산다.


입력

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


출력

각각의 Test case에 대해서 해당 집에 거주민 수를 출력하라.


코드

#include <iostream>
#include <map>

using namespace std;

int main()
{
    // :: Input Test Case Number
    int testCaseNo = -1;
    cin >> testCaseNo;
    
    // :: Calculate
    map<pair<int, int>, int> roomPopulation;
    string result = "";
    for(int index = 0; index < testCaseNo; index++) {
        
        // :: Container
        int floorNo = -1;
        int roomNo = -1;
        
        // :: Input Floor Number and Room Number
        cin >> floorNo >> roomNo;
        
        // :: Calculate
        for(int floorIndex = 0; floorIndex <= floorNo; floorIndex++) {
            int sumUnderPopulation = 0;
            for(int roomIndex = 1; roomIndex <= roomNo; roomIndex++) {
                // :: Next: Don't calculate again
                if(floorIndex != 0 && roomPopulation[{floorIndex, roomIndex}] != 0) {
                    sumUnderPopulation += roomPopulation[{floorIndex - 1, roomIndex}];
                    continue;
                }
                
                // :: if 0
                if(floorIndex == 0) roomPopulation[{floorIndex, roomIndex}] = roomIndex;
                // :: Else
                else {
                    sumUnderPopulation += roomPopulation[{floorIndex - 1, roomIndex}];
                    roomPopulation[{floorIndex, roomIndex}] = sumUnderPopulation;
                }
            }
        }
        // :: Contain result
        result += to_string(roomPopulation[{floorNo, roomNo}]) + "\n";
    }
    
    // :: Output
    cout << result;

    return 0;
}

참고

 
 

 

'C++ > Baekjoon' 카테고리의 다른 글

백준 2869: 달팽이는 올라가고 싶다  (0) 2022.12.06
백준 10250: ACM 호텔  (0) 2022.12.05
백준 10757: 큰 수 A+B  (0) 2022.11.20
백준 2292: 벌집  (0) 2022.10.20
백준 1712: 손익분기점  (0) 2022.10.19
블로그 이미지

RIsN

,