728x90
반응형

덩치 

문제

우리는 사람의 덩치를 키와 몸무게, 이 두 개의 값으로 표현하여 그 등수를 매겨보려고 한다. 어떤 사람의 몸무게가 x kg이고 키가 y cm라면 이 사람의 덩치는 (x, y)로 표시된다. 두 사람 A 와 B의 덩치가 각각 (x, y), (p, q)라고 할 때 x > p 그리고 y > q 이라면 우리는 A의 덩치가 B의 덩치보다 "더 크다"고 말한다. 예를 들어 어떤 A, B 두 사람의 덩치가 각각 (56, 177), (45, 165) 라고 한다면 A의 덩치가 B보다 큰 셈이 된다. 그런데 서로 다른 덩치끼리 크기를 정할 수 없는 경우도 있다. 예를 들어 두 사람 C와 D의 덩치가 각각 (45, 181), (55, 173)이라면 몸무게는 D가 C보다 더 무겁고, 키는 C가 더 크므로, "덩치"로만 볼 때 C와 D는 누구도 상대방보다 더 크다고 말할 수 없다.

N명의 집단에서 각 사람의 덩치 등수는 자신보다 더 "큰 덩치"의 사람의 수로 정해진다. 만일 자신보다 더 큰 덩치의 사람이 k명이라면 그 사람의 덩치 등수는 k+1이 된다. 이렇게 등수를 결정하면 같은 덩치 등수를 가진 사람은 여러 명도 가능하다. 아래는 5명으로 이루어진 집단에서 각 사람의 덩치와 그 등수가 표시된 표이다.

이름(몸무게, 키)덩치 등수
A (55, 185) 2
B (58, 183) 2
C (88, 186) 1
D (60, 175) 2
E (46, 155) 5

위 표에서 C보다 더 큰 덩치의 사람이 없으므로 C는 1등이 된다. 그리고 A, B, D 각각의 덩치보다 큰 사람은 C뿐이므로 이들은 모두 2등이 된다. 그리고 E보다 큰 덩치는 A, B, C, D 이렇게 4명이므로 E의 덩치는 5등이 된다. 위 경우에 3등과 4등은 존재하지 않는다. 여러분은 학생 N명의 몸무게와 키가 담긴 입력을 읽어서 각 사람의 덩치 등수를 계산하여 출력해야 한다.

입력

첫 줄에는 전체 사람의 수 N이 주어진다. 그리고 이어지는 N개의 줄에는 각 사람의 몸무게와 키를 나타내는 양의 정수 x와 y가 하나의 공백을 두고 각각 나타난다.

출력

여러분은 입력에 나열된 사람의 덩치 등수를 구해서 그 순서대로 첫 줄에 출력해야 한다. 단, 각 덩치 등수는 공백문자로 분리되어야 한다.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
#include <stdio.h>
 
int main()
{
    int N;
    scanf("%d",&N);
    int x[50]={0,},y[50]={0,};
    for(int i=0; i<N; i++){
        scanf("%d %d",&x[i],&y[i]);
        
    }
    for(int i=0; i<N; i++){
        int cnt = 0;
        for(int j=0; j<N; j++){
            if(x[i]<x[j]&&y[i]<y[j]) cnt++;
        }
        printf("%d ", cnt+1);
    }
    
 
 
    return 0;
}
cs

배열의 정렬이 필요한줄 알았다. 하지만 순위만 출력하면 되는 문제여서 비교적 간단했던 것 같다

키와 몸무게가 작을수록 순위는 늘어나게 된다. 

그말은 자기보다 덩치가 큰 사람의 수만 세면 자신의 순위를 셀 수 있다는 것이다.

문제에서 예시로 든 B 의 경우 배열 전체에서 자신보다 '덩치'가 큰 사람은 한명밖에 없다. 

그럼 자신의 순위는 2등이 되는 것이다.

 

문제를 본 순간 공동2등은 어떻게 처리하지? 하는 생각이 의미가 없었다.

i 번 인덱스의 사람을 

나머지 사람들과 비교했을 때

자신보다 키도 크고, 몸무게도 높은 x[i]<x[j]&&y[i]<y[j] 

경우 cnt++ 해준다.

 

반응형

'백준 단계별로 풀어보기 > 브루트 포스' 카테고리의 다른 글

백준 2231 분해합  (1) 2022.10.18
백준 2798 블랙잭  (0) 2022.10.18
백준 1436 영화감독 숌  (0) 2022.10.18
728x90
반응형

분해합 

문제

어떤 자연수 N이 있을 때, 그 자연수 N의 분해합은 N과 N을 이루는 각 자리수의 합을 의미한다. 어떤 자연수 M의 분해합이 N인 경우, M을 N의 생성자라 한다. 예를 들어, 245의 분해합은 256(=245+2+4+5)이 된다. 따라서 245는 256의 생성자가 된다. 물론, 어떤 자연수의 경우에는 생성자가 없을 수도 있다. 반대로, 생성자가 여러 개인 자연수도 있을 수 있다.

자연수 N이 주어졌을 때, N의 가장 작은 생성자를 구해내는 프로그램을 작성하시오.

입력

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

출력

첫째 줄에 답을 출력한다. 생성자가 없는 경우에는 0을 출력한다.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
#include <stdio.h>
int wkfltn(int x){
    int result=0;
    for(int i=x; i>0; i/=10){
        result = result+i%10;
    }
    return result+x;
}
 
 
int main()
{
    int n;
    scanf("%d",&n);
    int result = n;
    for(int i=n; i>n-70; i--){
        if(wkfltn(i)==n&&i<n) result = i;
    }
    if(result == n){
         printf("0");
         return 0;
    }
    printf("%d",result);
    
    return 0;
}
cs

자리수 라는 함수를 만들었다.

이 함수는 x를 입력받으면 문제와 조건같이 분해합을 반환한다.

입력받는 N 이 7자리다 보니 70번 연산 안에 결과가 나올 것 같아 n-70 을 사용했다.

 

어떤 i의 분해합이 n과 같고 i 가 n보다 작다면  result 값이 i가 된다.

 

분해합 생성자가 없는 경우 result 안에는 n 이 그대로 남아있을 것이다.

result ==n 이면 0 출력

그렇지 않으면 result 값을 출력한다.

반응형

'백준 단계별로 풀어보기 > 브루트 포스' 카테고리의 다른 글

백준 7568 덩치  (0) 2022.10.20
백준 2798 블랙잭  (0) 2022.10.18
백준 1436 영화감독 숌  (0) 2022.10.18
728x90
반응형

블랙잭 

 

문제

카지노에서 제일 인기 있는 게임 블랙잭의 규칙은 상당히 쉽다. 카드의 합이 21을 넘지 않는 한도 내에서, 카드의 합을 최대한 크게 만드는 게임이다. 블랙잭은 카지노마다 다양한 규정이 있다.

한국 최고의 블랙잭 고수 김정인은 새로운 블랙잭 규칙을 만들어 상근, 창영이와 게임하려고 한다.

김정인 버전의 블랙잭에서 각 카드에는 양의 정수가 쓰여 있다. 그 다음, 딜러는 N장의 카드를 모두 숫자가 보이도록 바닥에 놓는다. 그런 후에 딜러는 숫자 M을 크게 외친다.

이제 플레이어는 제한된 시간 안에 N장의 카드 중에서 3장의 카드를 골라야 한다. 블랙잭 변형 게임이기 때문에, 플레이어가 고른 카드의 합은 M을 넘지 않으면서 M과 최대한 가깝게 만들어야 한다.

N장의 카드에 써져 있는 숫자가 주어졌을 때, M을 넘지 않으면서 M에 최대한 가까운 카드 3장의 합을 구해 출력하시오.

입력

첫째 줄에 카드의 개수 N(3 ≤ N ≤ 100)과 M(10 ≤ M ≤ 300,000)이 주어진다. 둘째 줄에는 카드에 쓰여 있는 수가 주어지며, 이 값은 100,000을 넘지 않는 양의 정수이다.

합이 M을 넘지 않는 카드 3장을 찾을 수 있는 경우만 입력으로 주어진다.

출력

첫째 줄에 M을 넘지 않으면서 M에 최대한 가까운 카드 3장의 합을 출력한다.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
#include <stdio.h>
 
int main()
{
    int n,m;
    scanf("%d %d",&n,&m);
    int array[n];
    for(int i=0; i<n; i++){
        scanf("%d",&array[i]);
    }
    int max=0;
    int sum=m;
    for(int i=0; i<n-2; i++){
        for(int j=i+1; j<n-1; j++){
            for(int k=j+1; k<n; k++){
                sum =array[i]+array[j]+array[k]; 
                
                if (sum <= m && max < sum)
                    max = sum;
                
            }
        }
    }
    printf("%d",max);
 
    return 0;
}
cs

for문이 3개나 들어갔다.

i,j,k 번 인덱스에 들어있는 값들의 합이 입력된 최대값인 m 보단 작아야 하되

그 차이가 최소인 i,j,k 조합을 찾으면 된다.

max 라는 변수에 계산 결과를 넣기 위해서

if(sum<=m && max < sum)  의 조건이면 max = sum; 

 

반응형

'백준 단계별로 풀어보기 > 브루트 포스' 카테고리의 다른 글

백준 7568 덩치  (0) 2022.10.20
백준 2231 분해합  (1) 2022.10.18
백준 1436 영화감독 숌  (0) 2022.10.18
728x90
반응형

영화감독 숌 

문제

666은 종말을 나타내는 숫자라고 한다. 따라서, 많은 블록버스터 영화에서는 666이 들어간 제목을 많이 사용한다. 영화감독 숌은 세상의 종말 이라는 시리즈 영화의 감독이다. 조지 루카스는 스타워즈를 만들 때, 스타워즈 1, 스타워즈 2, 스타워즈 3, 스타워즈 4, 스타워즈 5, 스타워즈 6과 같이 이름을 지었고, 피터 잭슨은 반지의 제왕을 만들 때, 반지의 제왕 1, 반지의 제왕 2, 반지의 제왕 3과 같이 영화 제목을 지었다.

하지만 숌은 자신이 조지 루카스와 피터 잭슨을 뛰어넘는다는 것을 보여주기 위해서 영화 제목을 좀 다르게 만들기로 했다.

종말의 숫자란 어떤 수에 6이 적어도 3개이상 연속으로 들어가는 수를 말한다. 제일 작은 종말의 숫자는 666이고, 그 다음으로 큰 수는 1666, 2666, 3666, .... 과 같다.

따라서, 숌은 첫 번째 영화의 제목은 세상의 종말 666, 두 번째 영화의 제목은 세상의 종말 1666 이렇게 이름을 지을 것이다. 일반화해서 생각하면, N번째 영화의 제목은 세상의 종말 (N번째로 작은 종말의 숫자) 와 같다.

숌이 만든 N번째 영화의 제목에 들어간 숫자를 출력하는 프로그램을 작성하시오. 숌은 이 시리즈를 항상 차례대로 만들고, 다른 영화는 만들지 않는다.

 

입력

첫째 줄에 숫자 N이 주어진다. N은 10,000보다 작거나 같은 자연수이다.

출력

첫째 줄에 N번째 영화의 제목에 들어간 수를 출력한다.

 

 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
#include <stdio.h>
 
int main()
{
    int N;
    scanf("%d",&N);
    int death = 0;
    int count = 0;
    while(N!=count){
        death++;
        int temp = death;
        while(temp>0){
            if(temp%1000==666){
                count++;
                break;
            }
            else temp/=10;
        }
        
        
    }
   
    printf("%d",death);
    
 
    return 0;
}
cs

 

연속으로 666이 들어간다는 것

n= 12345666789 에서 666을 발견하는 방법은?

n의 오른쪽 끝에서부터 왼쪽 끝까지 3자리씩 666인지 확인하는 것이다.

수학 식으로 구현하려면

if(n%1000 == 666) 이 참일때 조건이 성립되는 것이고 

만약 거짓이라면 n=n/10 을 함으로서 다음 자리(오른쪽 끝에서 두번째) 를 확인한다.

 

while(1) 이 쓰여서 break 같은 조건을 잘 써야 하는 듯 하다.

반응형

'백준 단계별로 풀어보기 > 브루트 포스' 카테고리의 다른 글

백준 7568 덩치  (0) 2022.10.20
백준 2231 분해합  (1) 2022.10.18
백준 2798 블랙잭  (0) 2022.10.18

+ Recent posts