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
728x90
반응형

참외밭

문제

시골에 있는 태양이의 삼촌 댁에는 커다란 참외밭이 있다. 문득 태양이는 이 밭에서 자라는 참외가 도대체 몇 개나 되는지 궁금해졌다. 어떻게 알아낼 수 있는지 골똘히 생각하다가 드디어 좋은 아이디어가 떠올랐다. 유레카! 1m2의 넓이에 자라는 참외 개수를 헤아린 다음, 참외밭의 넓이를 구하면 비례식을 이용하여 참외의 총개수를 구할 수 있다.

1m2의 넓이에 자라는 참외의 개수는 헤아렸고, 이제 참외밭의 넓이만 구하면 된다. 참외밭은 ㄱ-자 모양이거나 ㄱ-자를 90도, 180도, 270도 회전한 모양(┏, ┗, ┛ 모양)의 육각형이다. 다행히도 밭의 경계(육각형의 변)는 모두 동서 방향이거나 남북 방향이었다. 밭의 한 모퉁이에서 출발하여 밭의 둘레를 돌면서 밭경계 길이를 모두 측정하였다.

예를 들어 참외밭이 위 그림과 같은 모양이라고 하자. 그림에서 오른쪽은 동쪽, 왼쪽은 서쪽, 아래쪽은 남쪽, 위쪽은 북쪽이다. 이 그림의 왼쪽위 꼭짓점에서 출발하여, 반시계방향으로 남쪽으로 30m, 동쪽으로 60m, 남쪽으로 20m, 동쪽으로 100m, 북쪽으로 50m, 서쪽으로 160m 이동하면 다시 출발점으로 되돌아가게 된다.

위 그림의 참외밭  면적은 6800m2이다. 만약 1m2의 넓이에 자라는 참외의 개수가 7이라면, 이 밭에서 자라는 참외의 개수는 47600으로 계산된다.

1m2의 넓이에 자라는 참외의 개수와, 참외밭을 이루는 육각형의 임의의 한 꼭짓점에서 출발하여 반시계방향으로 둘레를 돌면서 지나는 변의 방향과 길이가 순서대로 주어진다. 이 참외밭에서 자라는 참외의 수를 구하는 프로그램을 작성하시오.

입력

첫 번째 줄에 1m2의 넓이에 자라는 참외의 개수를 나타내는 양의 정수 K (1 ≤ K ≤ 20)가 주어진다. 참외밭을 나타내는 육각형의 임의의 한 꼭짓점에서 출발하여 반시계방향으로 둘레를 돌면서 지나는 변의 방향과 길이 (1 이상 500 이하의 정수) 가 둘째 줄부터 일곱 번째 줄까지 한 줄에 하나씩 순서대로 주어진다. 변의 방향에서 동쪽은 1, 서쪽은 2, 남쪽은 3, 북쪽은 4로 나타낸다.

출력

첫째 줄에 입력으로 주어진 밭에서 자라는 참외의 수를 출력한다.

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
 
#include <stdio.h>
 
int main()
{
    int N;
    scanf("%d",&N);
    int trash[6], length[6],big=0,small=0,k=0;
    for(int i=0;i<6; i++){
        scanf("%d %d",&trash[i],&length[i]);
    }
    for(int i=0; i<6; i++){
        if(big<length[i]*length[(i+1)%6]){
            big=length[i]*length[(i+1)%6];
            k=i;
        }
        
        
    }
    small=length[(k+3)%6]*length[(k+4)%6];
    big=big-small;
    printf("%d",big*N);
    return 0;
}
 
cs

처음엔 방향이 중요한 줄 알았다.

방향 배열을 만들어서 구현하려고 했지만 문제 조건에서는 필요 없어 보였다.

밭의 경계가 모두 x,y축에 평행한 6각형 모양이기 때문이다.

다음과 같은 모양일 수 밖에 없는데, 이런 ㄱ 자 모양에서는 '가로의 최대값 후 3번째 길이는 작은 직사각형의 세로 길이' 이다.

가장 긴 가로길이가 i 번째에 나왔으면, 작은 직사각형의 세로 길이는 (i+3)%6 번째에 나오게 된다.

 

그리고 작은 직사각형의 가로길이는 작은 직사각형의 세로 길이 바로 다음 나올 수 밖에 없다.

따라서 작은 직사각형의 가로길이는 (i+3+1)%6 번째에 나오게 된다.

 

결국 입력 받은 6개의 길이 중 가장 큰 가로 세로 값을 찾아 큰 직사각형의 넓이를 구한 후

위와 같이 작은 직사각형의 넓이를 빼주면 된다.

반응형

'백준 단계별로 풀어보기 > 기하 1' 카테고리의 다른 글

백준 1004 어린 왕자  (1) 2022.10.31
백준 4153 직각삼각형  (0) 2022.10.10
백준 3009 네 번째 점  (0) 2022.10.10
백준 1085 직사각형에서 탈출  (0) 2022.10.10
728x90
반응형

소트인사이드

문제

배열을 정렬하는 것은 쉽다. 수가 주어지면, 그 수의 각 자리수를 내림차순으로 정렬해보자.

입력

 

첫째 줄에 정렬하려고 하는 수 N이 주어진다. N은 1,000,000,000보다 작거나 같은 자연수이다.

출력

첫째 줄에 자리수를 내림차순으로 정렬한 수를 출력한다.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
#include <stdio.h>
#include <string.h>
int main()
{
    char N[100000]={'0',};
    scanf("%s",N);
    int size = strlen(N);
    for(int i=0; i<size-1; i++){
        for(int j=0; j<size-1-i; j++){
            if(N[j]<N[j+1]){
                char temp = N[j];
                N[j] = N[j+1];
                N[j+1= temp;
            }
        }
    }
    printf("%s",N);
 
    return 0;
}
 
cs

자리수 개수가 많지 않으므로 bubble 정렬을 사용하였다.

 

반응형

'백준 단계별로 풀어보기 > 정렬' 카테고리의 다른 글

C언어 qsort  (0) 2022.11.05
백준 11650 좌표 정렬하기(실패)  (0) 2022.10.22
백준 25305 커트라인  (1) 2022.10.11
백준 2751 수 정렬하기 2  (0) 2022.10.10
백준 2750 수 정렬하기  (0) 2022.09.18
728x90
반응형

커트라인 

 

문제

2022 연세대학교 미래캠퍼스 슬기로운 코딩생활에 N명의 학생들이 응시했다.

이들 중 점수가 가장 높은 k명은 상을 받을 것이다. 이 때, 상을 받는 커트라인이 몇 점인지 구하라.

커트라인이란 상을 받는 사람들 중 점수가 가장 가장 낮은 사람의 점수를 말한다.

입력

첫째 줄에는 응시자의 수 N과 상을 받는 사람의 수 k가 공백을 사이에 두고 주어진다.

둘째 줄에는 각 학생의 점수 x가 공백을 사이에 두고 주어진다.

출력

상을 받는 커트라인을 출력하라.

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
28
#include <stdio.h>
 
int main()
{
    int N, k;
    scanf("%d %d",&N,&k);
    int array[N];
    for(int i=0; i<N; i++){
        scanf("%d",&array[i]);
    }
    
    //버블 정렬
    for(int i=0; i<N-1; i++){
        for(int j=0; j<N-1-i; j++){
            if(array[j]<array[j+1]){
                int temp = array[j];
                array[j] = array[j+1];
                array[j+1]=temp;
            }
        }
    }
    
    printf("%d ",array[k-1]);
    
 
    return 0;
}
 
cs

N의 범위가 크지 않기 때문에 bubble sort 를 사용했다.

내림차순으로 정렬한 후 k-1번 째에 있는 원소를 출력하면 커트라인을 구할 수 있다.

반응형

'백준 단계별로 풀어보기 > 정렬' 카테고리의 다른 글

C언어 qsort  (0) 2022.11.05
백준 11650 좌표 정렬하기(실패)  (0) 2022.10.22
백준 1427 소트인사이드  (1) 2022.10.11
백준 2751 수 정렬하기 2  (0) 2022.10.10
백준 2750 수 정렬하기  (0) 2022.09.18

+ Recent posts