[BOJ] 브루트 포스 1

Wonjun·2022년 5월 22일
0

BOJ

목록 보기
3/16
post-thumbnail

📝2798번: 블랙잭

N개의 숫자를 입력 받아서 M에 가까운 3개의 숫자 합을 출력하는 문제
1차원 배열을 동적할당해서 N개의 숫자를 num 배열에 할당
삼중 for문으로 가능한 세 숫자의 합을 모두 건든다
세 숫자의 합이 M보다 작거나 같으면서 result보다 클 때까지 반복하면
결국 M에 가까운 세 숫자의 합을 찾을 수 있다
result에 찾은 세 숫자의 합을 할당하고 출력하면 끝

💻소스코드

#include <iostream>
using namespace std;

int main(void)
{
    int N, M;   // N: 카드의 개수, M: 근접해야 되는 값
    cin >> N >> M;
    int *num = new int [N];
    int result = 0;
    for (int i = 0; i < N; i++)
        cin >> num[i];
    for (int i = 0; i < N; i++){
        for (int j = i + 1; j < N; j++){
            for (int k = j + 1; k < N; k++){
                if (num[i] + num[j] + num[k] <= M && num[i] + num[j] + num[k] > result)
                    result = num[i] + num[j] + num[k];
            }
        }
    }
    cout << result << "\n";
    delete [] num;
    return 0;
}

📝2231번: 분해합

자연수 N의 가장 작은 생성자를 구하는 문제
256(245 + 2 + 4 + 5)에서 245는 256의 생성자다
i는 1부터 N까지 반복 result = i; partition = i;
partition의 각 자리수를 더해서 result에 할당
result==N이면 i가 생성자라는 의미이므로 i 출력
이 때 가장 작은 생성자를 출력하라 했으니 하나만 출력하고 return 0;
반복문에서 출력을 안하면 생성자가 없었다는 의미니까 0을 출력하고 끝

💻소스코드

#include <iostream>
using namespace std;

int main(void)
{
    int N;
    int result = 0;
    int partition;
    cin >> N;
    for(int i = 1; i < N; i++){
        result = i;
        partition = i;
        while (partition){  // partition 각 자리수를 더함
            result += partition % 10;   
            partition /= 10;
        }
        if (result == N){
            cout << i;
            return 0;   // 가장 작은 생성자만 출력하고 프로그램 종료
        }
    }
    cout << "0\n";  // 생성자가 없을 시 0 출력
    return 0;
}

📝7568번: 덩치

덩치 순위를 구하는 문제
몸무게와 키 모두 커야 덩치가 크다고 한다
둘 중 하나만 크거나 작으면 덩치를 비교할 수 없다
몸무게와 키를 입력받아서 2차원 배열에 넣어두고
각 요소의 키와 몸무게를 일일이 비교한다
비교 대상보다 덩치가 큰 요소를 발견하면 덩치 순위++
덩치 순위를 출력해주면 끝

💻소스코드

#include <iostream>
using namespace std;

int main(void) {
    int N;  // 2 <= N <= 50
    int arr[50][2];     // ([0]: 몸무게, [1]: 키)를 저장할 배열
    int rank[50];
    fill_n(rank, 50, 1);    // 덩치 등수를 나타내기 위해 1로 초기화
    cin >> N;
    for (int i = 0; i < N; i++)
        cin >> arr[i][0] >> arr[i][1];
    for (int i = 0; i < N; i++){    // 브루트 포스, 전부 비교
        for (int j = 0; j < N; j++){
            if (arr[i][0] < arr[j][0] && arr[i][1] < arr[j][1])
                rank[i]++;
        }
        cout << rank[i] << " ";
    }
    return 0;
}  
profile
성장 = 학습 + 적용 + 회고

0개의 댓글