본문 바로가기
Baekjoon/단계별로 풀어보기

[단계11] 부르트 포스 (5문제)

by 해적거북 2021. 1. 13.
728x90

 

brute-force

: 무차별 대입

: 모든 경우의 수를 대입한다.

 

www.acmicpc.net/step/22

 

브루트 포스 단계

체스판을 만드는 모든 경우를 시도하여 최적의 방법을 찾는 문제

www.acmicpc.net

 

● [문제번호 2798] 블랙잭

#include <stdio.h>
#include <stdlib.h>

int main()
{
    int N, M;
    scanf("%d %d", &N, &M);
    
    int* num = (int*)malloc(N * sizeof(int));
    
    for(int i = 0; i < N; i++)
        scanf("%d", &num[i]);
    
    int max = 0;
    
    for(int a = 0; a < N; a++)
    {
        for(int b = 0; b < N; b++)
        {
            for(int c = 0; c < N; c++)
            {
                if(a == b || b == c || c == a)
                    continue;
                
                int temp = num[a] + num[b] + num[c];
                if(temp <= M)
                    if(max < temp)
                        max = temp;
            }
        }
    }
    
    printf("%d", max);
    
    free(num);

    return 0;
}

 

● [문제번호 2231] 분해합

#include <stdio.h>

int main()
{
    int N;
    scanf("%d", &N);
    
    for(int i = 1; i <= N; i++)
    {
        // 생성자가 없는 경우
        if(i == N)
        {
            printf("%d", 0);
            break;
        }
        
        // 한자리씩 추출할 변수
        int temp = i;
        // 분해합을 구할 변수
        int total = temp;
        
        // 한자리씩 추출
        while(1)
        {
            if(temp % 10 == 0)
                break;
            
            total += temp % 10;
            
            temp /= 10;
        }
        
        // 생성자를 찾은 경우
        if(total == N)
        {
            printf("%d", i);
            break;
        }
    }
    
    return 0;
}

 

● [문제번호 7568] 덩치

#include <stdio.h>
#include <stdlib.h>

int main()
{
    int N;
    scanf("%d", &N);
    
    int* weight = (int*)malloc(N * sizeof(int));
    int* height = (int*)malloc(N * sizeof(int));
    
    for(int i = 0; i < N; i++)
        scanf("%d %d", &weight[i], &height[i]);
    
    for(int i = 0; i < N; i++)
    {
        int rank = 1;
        for(int j = 0; j < N; j++)
        {
            if(weight[i] < weight[j] && height[i] < height[j])
                rank++;
        }
        printf("%d ", rank);
    }
    
    free(weight);
    free(height);
    
    return 0;
}

 

● [문제번호 1018] 체스판 다시 칠하기

#include <stdio.h>

int main()
{
	int N, M;
    scanf("%d %d", &N, &M);
    
    char chess[50][51];
    
    for(int i = 0; i < N; i++)
    {
        getchar();
        for(int j = 0; j < M; j++)
            scanf("%c", &chess[i][j]);
    }
    
    int min = 64;
    
    for(int i = 0; i < N - 7; i++)
    {
        for(int j = 0; j < M - 7; j++)
        {
            int count = 0;
            char check[2] = {'W', 'B'};
            int flag = 0;
            
            for(int r = i; r < i + 8; r++)
            {
                for(int c = j; c < j + 8; c++)
                {
                    if(check[flag] != chess[r][c])
                        count++;
                    
                    if(flag == 0)
                        flag = 1;
                    else if(flag == 1)
                        flag = 0;
                }
                
                if(flag == 0)
                        flag = 1;
                    else if(flag == 1)
                        flag = 0;
            }
            
            if(min > count)
                min = count;
            
            count = 0;
            flag = 1;
            for(int r = i; r < i + 8; r++)
            {
                for(int c = j; c < j + 8; c++)
                {
                    if(check[flag] != chess[r][c])
                        count++;
                    
                    if(flag == 0)
                        flag = 1;
                    else if(flag == 1)
                        flag = 0;
                }
                
                if(flag == 0)
                        flag = 1;
                    else if(flag == 1)
                        flag = 0;
            }
            
            if(min > count)
                min = count;
        }
    }
    
    printf("%d", min);
    
    return 0;
}

 

● [문제번호 1436] 영화감독 숌

#include <stdio.h>

int six(int n)
{
    int count = 0;
    
    int ten = 10;
    while(1)
    {
        // 666이 연속으로 3개이상 조건
        if((n % ten) == 6)
            count++;
        else
        {
            if(count >= 3)
                break;
            count = 0;
        }
        
        n /= ten;
        
        if(n == 0)
            break;
    }
    
    if(count >= 3)
        return 1;
    else
        return 0;
}

int main()
{
    int N;
    scanf("%d", &N);
    
    if(N == 1)
    {
        printf("%d", 666);
        return 0;
    }
    
    int count = 1;
    int num = 1666;
    
    while(1)
    {
        if(six(num) == 1)
            count++;
        
        if(count == N)
            break;
        
        num++;
    }
    
    printf("%d", num);
    
    return 0;
}
728x90

'Baekjoon > 단계별로 풀어보기' 카테고리의 다른 글

[단계 13] 백트래킹 (8문제)  (0) 2021.01.22
[단계12] 정렬 (9문제)  (0) 2021.01.14
[단계10] 재귀 (4문제)  (0) 2021.01.12
[단계09] 기본 수학2 (11문제)  (0) 2021.01.09
[단계08] 기본 수학1 (9문제)  (0) 2020.12.20
[단계07] 문자열 (10문제)  (0) 2020.12.20
[단계06] 함수 (3문제)  (0) 2020.12.18

댓글