본문 바로가기
C++/Baekjoon

[BOJ] 2022 SISS 1학기 스터디 - 7주차

by 단월໒꒱ 2022. 6. 19.

#1978 : 소수 찾기 (Class 2 Silver 5)

[문제]

 

 

 

[코드 및 결과]

 

 

#include <iostream>

using namespace std;

int main() {
    int N, num, cnt = 0, result = 0;
    
    cin >> N;
    
    for (int i = 0; i < N; i++) {
        cin >> num;
        
        for (int j = 1; j <= num; j++) {
            if (num % j == 0) cnt++;
            
            if (cnt >= 3) break;
        }
        
        if (cnt == 2) result++;
        
        cnt = 0;
    }
    
    cout << result << "\n";
    
    return 0;
}

 

 

 

 

 

 

[설명]

수를 입력 받으면 그 수들 중에서 소수가 몇 개인지 출력하는 문제이다.

소수는 1과 자기 자신으로만 나누어지는 수이다.

먼저 입력 받을 수의 개수를 입력 받고 그 수 만큼 반복문을 반복하도록 했다.

수 num을 입력 받으면 1부터 num까지 다시 반복문을 도는데, num을 그 수들로 한번씩 나누어주면서 딱 나누어떨어질 경우 cnt를 1씩 증가시키도록 한다. 이때, cnt가 3이 넘어가면 이 num이 소수가 될 일이 없으므로 바로 break를 해서 루프를 나가준다.

위의 과정을 통해 나온 cnt 값이 2인 경우는 1과 자기 자신으로만 나누어진 경우이므로 소수에 해당한다. 그러므로 result 값을 1 증가시킨다.

그렇게 처음 입력 받은 수만큼 반복해서 나온 결과를 출력하여 마무리한다.

 

 

 

#1436 : 영화감독 숌 (Class 2 Silver 5)

[문제]

 

 

 

[코드 및 결과]

 

 

#include <iostream>

using namespace std;

int main() {
    int N, temp, cnt = 0, result = 0;
    
    cin >> N;
    
    while (cnt != N) {
        result++;
        
        temp = result;
        
        while (temp != 0) {
            if (temp % 1000 == 666) {
                cnt++;
                break;
            }
            else temp /= 10;
        }
    }
    cout << result << "\n";
    
    return 0;
}

 

 

 

 

 

 

[설명]

숫자 N을 입력하면 N번재 영화의 제목에 들어간 종말의 수를 구하면 되는 문제이다.

문제에 언급되어 있듯 종말의 수는 어떤 수에 6이 적어도 3개 이상 연속으로 들어가는 수를 말한다.

666, 1666, 2666, 3666 .... 이런 식으로 된다. 

숫자 N을 입력받은 후에 cnt가 N이 될 때까지 반복하는 반복문을 만들어준다.

result 값을 1 증가시킨 뒤 임시 temp 값에 result 값을 저장한다.

그리고 temp가 0이 될 때까지 다시 반복을 하는데, ____666이 되는 경우를 찾으면 cnt 값을 1 증가시키고 루프를 중단한다.

만약에 ___666이 아닌 경우에는 10으로 나눠줘서 일의자리를 없애준다.

마지막으로 그렇게 해서 구한 result 값을 출력해준다.

 

 

 

#1978 : 듣보잡 (자유 Silver 4)

[문제]

 

 

[코드 및 결과]

 

#include <iostream>
#include <vector>
#include <algorithm>

using namespace std;

int main() {
    int N, M, cnt = 0;
    string str;
    vector<string> v, result;
    
    cin >> N >> M;
    
    for (int i = 0; i < N+M; i++) {
        cin >> str;
        v.push_back(str);
    }
    
    sort(v.begin(), v.end());
    
    for (int i = 0; i < N+M-1; i++) {
        if (v[i] == v[i+1]) {
            result.push_back(v[i]);
            cnt++;
        }
    }
    
    cout << cnt << "\n";
    for (int i = 0; i < result.size(); i++) {
        cout << result[i] << "\n";
    }
    
    return 0;
}

 

 

 

 

 

 

[설명]

두 명단이 주어지는데 이 중에서 두 명단에 모두 속해있는 사람의 명단을 출력하면 되는 문제이다.

먼저 하나씩 입력을 받으면서 벡터 v에 넣어준다.

벡터 v를 정렬하면 같은 이름은 연속해서 있는 거니까 먼저 sort로 정렬해준다.

그 후에 v[i]와 v[i+1]이 같으면 cnt 값을 1 증가시켜주고 그 사람의 이름을 result 명단에 push_back 해준다.

이렇게해서 구한 result 벡터에 저장된 값들을 최종적으로 출력해주면 된다.

 

 

 

댓글