728x90
반응형

큰 수 A+B 

 
시간 제한메모리 제한제출정답맞힌 사람정답 비율

문제

두 정수 A와 B를 입력받은 다음, A+B를 출력하는 프로그램을 작성하시오.

입력

첫째 줄에 A와 B가 주어진다. (0 < A,B < 1010000)

출력

첫째 줄에 A+B를 출력한다.

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
29
30
31
32
33
34
35
36
37
38
39
40
#include <stdio.h>
#include <string.h>
 
void reverse(char* array){
    int size = strlen(array);
    for(int i=0; i<size/2; i++){
        char temp = array[i];
        array[i] = array[size-i-1];
        array[size-i-1]=temp;
        
    }
    
}
 
 
int main()
{
    char a[10001]=0 },b[10001= {0};
    char result[10002={0};
    int len;
    scanf("%s %s",a,b);
    //printf("%s %s\n\n",a,b);
    reverse(a); reverse(b);
    //printf("%s %s",a,b);
    len = (strlen(a)>strlen(b) ? strlen(a):strlen(b));
    //printf("%d",len);
    int carry = 0;
    for(int i=0; i<len; i++){
        int sum = a[i]-'0'+b[i]-'0'+carry;
        if(sum<0) sum=sum+'0';
        if(sum>9) carry = 1;
        else carry=0;
        result[i] = sum%10 + '0';
    }
    if(carry==1) result[len] ='1';
    reverse(result);
    printf("%s",result);
    
    return 0;
}
cs

결국은 문자열을 입력받고 뒤집어 주는 과정이 필요한 것 같다.

reverse() 함수를 만드는게 만들지 않고 자리수 맞춰 계산하는 것 보다 훨씬 간단하다

 

뒤집은 다음 긴문자열 길이를 기준으로 0 index 부터 더해나가면 된다

char 형이므로 '0'을 더하고 빼면서 정수 연산을 할 수 있도록 했다.

반응형
728x90
반응형

설탕 배달 

문제

상근이는 요즘 설탕공장에서 설탕을 배달하고 있다. 상근이는 지금 사탕가게에 설탕을 정확하게 N킬로그램을 배달해야 한다. 설탕공장에서 만드는 설탕은 봉지에 담겨져 있다. 봉지는 3킬로그램 봉지와 5킬로그램 봉지가 있다.

상근이는 귀찮기 때문에, 최대한 적은 봉지를 들고 가려고 한다. 예를 들어, 18킬로그램 설탕을 배달해야 할 때, 3킬로그램 봉지 6개를 가져가도 되지만, 5킬로그램 3개와 3킬로그램 1개를 배달하면, 더 적은 개수의 봉지를 배달할 수 있다.

상근이가 설탕을 정확하게 N킬로그램 배달해야 할 때, 봉지 몇 개를 가져가면 되는지 그 수를 구하는 프로그램을 작성하시오.

입력

첫째 줄에 N이 주어진다. (3 ≤ N ≤ 5000)

출력

상근이가 배달하는 봉지의 최소 개수를 출력한다. 만약, 정확하게 N킬로그램을 만들 수 없다면 -1을 출력한다.

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 a,b;
    int sum=0;
    for(a=0; a<=(N/3); a++){
        for(b=N/5; b>=0; b--){
            if(a*3+b*5==N){
                if(sum==0){
                    sum = a+b;
                    printf("%d",sum);
                    return 0;
                    
                }
            }
            
        }
    }
    if(sum==0){
        printf("-1");
    }
    
    return 0;
}
cs

봉지의 최소 개수만 구하면된다.

최소개수는 5kg 짜리가 많을 때 일 것이다.

3kg 짜리를 a 5kg 짜리를 b 라고 할 때

b는 최대 N/5개 있을 수 있고, a는 최소 0개 부터 있을 수 있으므로

for문을 다음과 같이 작성하였다.

만약 a*3+b*5가 N과 같다면 ,

그리고 최초로 발견된 a,b 쌍이라면 

sum=0일 때 발견되었을 것이므로, 바로 출력한다.

반복문이 끝날때까지 sum 값이 0이라면 조건을 만족하는 a,b쌍이 없던 것이므로

-1을 출력한다.

반응형
728x90
반응형

ACM 호텔 

문제

ACM 호텔 매니저 지우는 손님이 도착하는 대로 빈 방을 배정하고 있다. 고객 설문조사에 따르면 손님들은 호텔 정문으로부터 걸어서 가장 짧은 거리에 있는 방을 선호한다고 한다. 여러분은 지우를 도와 줄 프로그램을 작성하고자 한다. 즉 설문조사 결과 대로 호텔 정문으로부터 걷는 거리가 가장 짧도록 방을 배정하는 프로그램을 작성하고자 한다.

문제를 단순화하기 위해서 호텔은 직사각형 모양이라고 가정하자. 각 층에 W 개의 방이 있는 H 층 건물이라고 가정하자 (1 ≤ H, W ≤ 99). 그리고 엘리베이터는 가장 왼쪽에 있다고 가정하자(그림 1 참고). 이런 형태의 호텔을 H × W 형태 호텔이라고 부른다. 호텔 정문은 일층 엘리베이터 바로 앞에 있는데, 정문에서 엘리베이터까지의 거리는 무시한다. 또 모든 인접한 두 방 사이의 거리는 같은 거리(거리 1)라고 가정하고 호텔의 정면 쪽에만 방이 있다고 가정한다.

그림 1. H = 6 이고 W = 12 인 H × W 호텔을 간략하게 나타낸 그림

방 번호는 YXX 나 YYXX 형태인데 여기서 Y 나 YY 는 층 수를 나타내고 XX 는 엘리베이터에서부터 세었을 때의 번호를 나타낸다. 즉, 그림 1 에서 빗금으로 표시한 방은 305 호가 된다.

손님은 엘리베이터를 타고 이동하는 거리는 신경 쓰지 않는다. 다만 걷는 거리가 같을 때에는 아래층의 방을 더 선호한다. 예를 들면 102 호 방보다는 301 호 방을 더 선호하는데, 102 호는 거리 2 만큼 걸어야 하지만 301 호는 거리 1 만큼만 걸으면 되기 때문이다. 같은 이유로 102 호보다 2101 호를 더 선호한다.

여러분이 작성할 프로그램은 초기에 모든 방이 비어있다고 가정하에 이 정책에 따라 N 번째로 도착한 손님에게 배정될 방 번호를 계산하는 프로그램이다. 첫 번째 손님은 101 호, 두 번째 손님은 201 호 등과 같이 배정한다. 그림 1 의 경우를 예로 들면, H = 6이므로 10 번째 손님은 402 호에 배정해야 한다.

입력

프로그램은 표준 입력에서 입력 데이터를 받는다. 프로그램의 입력은 T 개의 테스트 데이터로 이루어져 있는데 T 는 입력의 맨 첫 줄에 주어진다. 각 테스트 데이터는 한 행으로서 H, W, N, 세 정수를 포함하고 있으며 각각 호텔의 층 수, 각 층의 방 수, 몇 번째 손님인지를 나타낸다(1 ≤ H, W ≤ 99, 1 ≤ N ≤ H × W). 

출력

프로그램은 표준 출력에 출력한다. 각 테스트 데이터마다 정확히 한 행을 출력하는데, 내용은 N 번째 손님에게 배정되어야 하는 방 번호를 출력한다.

 

 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
#include <stdio.h>
 
 
int main()
{
    int T,H,W,N;
    scanf("%d",&T);
    for(int i=0; i<T; i++){
        scanf("%d %d %d",&H,&W,&N);
        int fl = N%H;
        int bang = N/H;
        if(fl>0
            bang++;
        else{
            fl = H;
        }
        printf("%d\n",fl*100+bang);
    }
    return 0;
}
 
cs

 

fl : 층

bang : 호수

층을 구하기 위해서 사람 수를 H 로 나눈 나머지가 필요하다.

규칙에 의하면 일단 엘레베이터와 가장 가까운 순으로 채워나가기 때문에

각 층의 1호실 먼저 채울 것이므로, H의 배수만큼 채우고 남은 나머지 사람들이

1층 , 2층 ... N%H 층을 차지 할 것이라 생각 할 수 있다.

 

 

 

방 호수는 N/H 몫을 통해 알 수 있다. 

6층짜리 건물에 10명이 오면,  1호실은 일단 가득차고(몫 1)

2호실에 사람들이 들어가게 될 것이다.

마찬가지로 8층짜리 건물에 100명이 오면

1~12호실 까진 가득 차고,

13호실에 나머지 4명이 층별로 들어가게 될 것이다.

그럼 bang = N/H + 1 이라 생각할 수 있다.

 

그런데 만약 N%H 가 0이라면?

0층에 사람이 사는건 규칙에 없었다.

따라서 N%H가 0인 경우, 나머지가 없는 것, 즉 꼭대기 층까지 사람이 꽉 찼다는걸 의미하므로

fl = H , bang = N/H 로 변경한다.

 

 

 

반응형
728x90
반응형

부녀회장이 될테야 성공

 

문제

평소 반상회에 참석하는 것을 좋아하는 주희는 이번 기회에 부녀회장이 되고 싶어 각 층의 사람들을 불러 모아 반상회를 주최하려고 한다.

이 아파트에 거주를 하려면 조건이 있는데, “a층의 b호에 살려면 자신의 아래(a-1)층의 1호부터 b호까지 사람들의 수의 합만큼 사람들을 데려와 살아야 한다” 는 계약 조항을 꼭 지키고 들어와야 한다.

아파트에 비어있는 집은 없고 모든 거주민들이 이 계약 조건을 지키고 왔다고 가정했을 때, 주어지는 양의 정수 k와 n에 대해 k층에 n호에는 몇 명이 살고 있는지 출력하라. 단, 아파트에는 0층부터 있고 각층에는 1호부터 있으며, 0층의 i호에는 i명이 산다.

입력

첫 번째 줄에 Test case의 수 T가 주어진다. 그리고 각각의 케이스마다 입력으로 첫 번째 줄에 정수 k, 두 번째 줄에 정수 n이 주어진다

출력

각각의 Test case에 대해서 해당 집에 거주민 수를 출력하라.

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 T;
    scanf("%d",&T);
    int apt[15][15= {0,};
    for(int i=0; i<15; i++){
        apt[0][i] = i;
    }
    for(int i=1; i<15; i++){
        for(int j=1; j<15; j++){
            apt[i][j]=apt[i-1][j] + apt[i][j-1];
        }
    }
    
    for(int i=0; i<T; i++){
        int k,n;
        scanf("%d\n%d",&k,&n);
        printf("%d\n",apt[k][n]);
        
    }
 
    return 0;
}
 
cs

0층은 i 호에 i 명이 산다.

1층부터 14층의 1호부터 14호에 대해서는

모든 방에 규칙이 성립한다는 가정하에

같은층 옆방 + 아래층 같은호수 방 만큼의 사람이 살아야 한다.

3층 1호 1 3층 2호 5 3층 3호 15  ... ...
2층 1호 1 2층 2호 4  2층 3호10 ... ...
1층 1호 1 1층 2호 3 1층 3호 6  ... ...

apt[i][j]= apt[i][j-1] + apt[i-1][j]

i층 j호에 사는 사람은 같은층 옆방(i, j-1) + 아래층 같은 호수(i-1, j) 와 같다.

 

처음 규칙을 생각했을 때

층마다 시그마를 하나씩 더해주면 되는 문제라고 생각했다.

그런데 시그마를 하나씩 붙여주는 걸 어떻게 해야할지 모르겠다.

반응형

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

백준 10757 큰 수 A+B  (0) 2022.10.23
백준 2839 설탕 배달  (1) 2022.10.07
백준 10250 ACM 호텔  (1) 2022.10.05
백준 1193 분수찾기  (0) 2022.10.04
백준 2869 달팽이는 올라가고 싶다  (0) 2022.09.20

+ Recent posts