본문 바로가기
C++/Baekjoon

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

by 단월໒꒱ 2022. 6. 24.

#2839 : 설탕 배달 (Class 2 Silver 4)

[문제]

 

 

 

[코드 및 결과]

 

#include <iostream>

using namespace std;

int main() {
    int N, temp, cnt = 0;
    
    cin >> N;
    
    while (N >= 0) {
        if (N % 5 == 0) {
            temp = N / 5;
            cnt += temp;
            cout << cnt << "\n";
            return 0;
        }
        
        N -= 3;
        cnt++;
    }
    
    cout << -1 << "\n";
    
    return 0;
}

 

 

 

 

 

 

[설명]

설탕의 무게에 따라서 봉지로 나눌 수 있는데 그 봉지의 수가 최소가 되도록 하는 문제이다.

일단 5kg 봉지와 3kg 봉지가 있다고 했는데 최대한 5kg 봉지로 많이 바꿔야 봉지의 개수가 적어진다.

일단 총 설탕의 무게를 입력 받는다.

반복문으로 설탕이 다 없어질 때까지 반복해주는데, 일단 5로 나누었을 때 딱 나누어떨어지지 않으면 3을 빼고 cnt 값을 1 증가시켰다.

그렇게 반복을 하다가 만약 5로 딱 나누어떨어질 경우에는 temp에 그 몫을 저장하고 이게 5kg 봉지의 총 개수가 될 테니까 cnt에 더해주었다.

그리고 5로 딱 나누어떨어졌을 경우, 더 필요한 절차가 없으므로 바로 cnt 값을 출력하도록 했다.

만약에 어떻게 해도 안 나누어질 경우에는 문제 조건에 따라 루프를 벗어나서 -1을 출력하도록 했다.

 

 

 

#7568 : 덩치 (Class 2 Silver 5)

[문제]

 

 

 

 

[코드 및 결과]

 

#include <iostream>
#include <vector>

using namespace std;

int main() {
    int N, rank;
    vector<pair<int, int>> v;
    
    cin >> N;
    
    for (int i = 0; i < N; i++) {
        int weight, height;
        cin >> weight >> height;
        v.push_back({weight, height});
    }
    
    for (int i = 0; i < N; i++) {
        rank = 1;
        for (int j = 0; j < N; j++) {
            if ((v[i].first < v[j].first) && (v[i].second < v[j].second))
                rank++;
        }
        cout << rank << " ";
    }
    
    cout << "\n";
    
    return 0;
}

 

 

 

 

 

 

[설명]

사람들의 키와 몸무게를 입력 받으면 이를 토대로 덩치 순위를 매기면 되는 문제이다.

일단 몸무게와 키 둘 다 커야지만 덩치가 크다고 할 수 있고, 어느 한쪽이라도 작은 경우에는 자신보다 더 큰 덩치의 사람 수가 등수가 된다.

일단 키와 몸무게는 pair를 이용하여 쌍으로 입력 받아 벡터 v에 저장해주었다.

처음 기본 rank는 1로 설정한 뒤에 반복문을 도는데, 위에서 언급한 것처럼 키와 몸무게 모두 커야지만 등수가 높아지도록 한다. 

그러니까, 코드를 기준으로 보면 i와 j를 비교해서 j의 키와 몸무게가 모두 더 클 경우에 i의 rank를 1 증가시켜서 한 등수씩 낮추는 식으로 돌아가도록 했다. (아닌 경우에는 그대로 유지)

마무리로 위의 과정을 통해 사람들의 최종적인 등수를 출력한다.

 

 

 

#21921 : 블로그 (자유 Silver 3)

[문제]

 

 

 

 

[코드 및 결과]

 

#include <iostream>
#include <vector>

using namespace std;

int main() {
    int N, X, sum = 0;
    int visit[250000];
    
    cin >> N >> X;
    
    for (int i = 0; i < X; i++) {
        cin >> visit[i];
        sum += visit[i];
    }
    
    int cnt = 1;
    int result = sum;
    
    for (int i = X; i < N; i++) {
        cin >> visit[i];
        sum += visit[i] - visit[i-X];
        if (sum >= result) {
            if (sum == result) {
                cnt++;
            }
            else {
                result = sum;
                cnt = 1;
            }
        }
    }
    
    if (result == 0)
        cout << "SAD" << "\n";
    else
        cout << result << "\n" << cnt << "\n";
    
    return 0;
}

 

 

 

 

 

 

[설명]

블로그를 시작한 일수와 연속적인 날짜가 주어지고 방문자 수가 주어지면 연속적인 날짜에 한해서 가장 방문자 수가 많았던 기간의 방문자 수와, 그 수가 여러개 있을 경우 그 기간들의 개수를 출력하는 문제이다.

먼저 입력받은 X (연속적인 날짜)만큼 방문자수를 입력받고 sum에 하나씩 더해준다.

이게 첫번째 기간의 sum이라고 친 뒤에 다시 반복문으로 남은 기간들의 sum을 구해주도록 한다.

i가 X일 때부터 N보다 작을 때까지 다시 방문자 수를 입력 받고, sum에 visit[i]는 더해주는 대신 지난 기간의 첫 날 방문자 수에 해당하는 visit[i-X]를 빼준다.

이렇게 반복문을 돌면서 sum과 지난 기간들의 max값을 비교해주며 cnt 값을 설정해주면 된다.

결과적으로 나온 result값을 토대로 이게 0일 경우에는 SAD를, 아닌 경우에는 result 값과 cnt 값을 같이 출력해주면 된다.

 

 

 

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

[BOJ] #1302. 베스트셀러  (0) 2022.08.07
[BOJ] #1065. 한수  (0) 2022.07.31
[BOJ] 2022 SISS 1학기 스터디 - 7주차  (0) 2022.06.19
[BOJ] 2022 SISS 1학기 스터디 - 6주차  (0) 2022.05.20
[BOJ] 2022 SISS 1학기 스터디 - 5주차  (0) 2022.05.20

댓글