본문 바로가기
정리/C

[C] 백준 #1085, #1267, #1284

by 멘멘 2023. 9. 17.

#1085

문제 설명

다음은 임의의 점 위에서 사각형의 경계선(모서리)까지 가는 최단거리를 구하는 문제이다.

아래 그림과 같이 x,y,w,h 값이 주어진다.

 

풀이 과정

참고이미지 (직접 그림.......)

한점에서 모서리까지 갈 수 있는 최단거리의 경우는 x, y, w-x, h-y 총 4가지 경우이다.

이 중 가장 짧은 거리가 최단거리라고 할 수 있다. 따라서 최솟값을 구해야한다.

나의 경우 배열에 값을 넣어 이중반복문을 돌려서 최솟값을 구했다.

#include <stdio.h>

int main(){
    int x,y,w,h;
    scanf("%d %d %d %d",&x, &y, &w, &h);
    //순서대로 입력받기
    
	int num[4]; //num 배열을 생성하여 각 거리값 계산
	num[0] = x;
	num[1] = y;
	num[2] = w-x;
	num[3] = h-y;
	
    //for 루프문을 통한 거리 오름차순
	for(int i = 0; i < 3; i++){
		for(int j = i+1; j< 4; j++){
			if(num[i] >= num[j]){
				int tmp = num[i];
				num[i] = num[j];
				num[j] = tmp;
			}
		}
	}

	//가장 작은 값인 num[0]값 출력
	printf("%d\n", num[0]);
    
    return 0;
}

 

 

#1267

문제 설명

영식 요금제는 30초마다 10원, 민식 요금제는 60초마다 15원이 청구될 때 어떤 요금제가 더 이득인지 구하는 문제이다.

통화횟수와 시간을 입력받으면 둘 중 어느 요금제가 더 이득인지 구하는 문제다.

 

풀이 과정

0~29초, 30~59초 ... 와 같이 30초 단위로 10원씩 늘어나므로 시간을 30초로 나누어 10원을 곱해준다(0초도 요금에 포함이므로 10을 더해준 상태에서 시작한다)

위와 마찬가지로 민식 요금제는 60초 단위로 나누어 15원을 곱해준다.

이를 계산하면 적절한 요금제가 출력된다.

#include <stdio.h>

int main(){
    
    int N = 0; //통화횟수
    int time = 0, Ypay = 0, Mpay = 0;
    scanf("%d",&N);
    //요금제별 통화시간에 따른 계산
    for(int i =0; i<N; i++){
        scanf("%d",&time);
        Ypay += 10 + time / 30 * 10;
        Mpay += 15 + time / 60 * 15;
    }
    //출력
    if(Ypay < Mpay){
        printf("Y %d",Ypay);
    }else if(Mpay < Ypay){
        printf("M %d",Mpay);
    }else if(Ypay == Mpay){
        printf("Y M %d",Ypay);
    }
    
    return 0;
}

 

#1284

문제 설명

호수판을 만들때 각 호수판은 숫자마다 가지는 규격이 있는데,

  1. 각 숫자 사이에는 1cm의 여백이 들어가야한다.
  2. 1은 2cm의 너비를 차지해야한다. 0은 4cm의 너비를 차지해야한다. 나머지 숫자는 모두 3cm의 너비를 차지한다.
  3. 호수판의 경계와 숫자 사이에는 1cm의 여백이 들어가야한다.

고객에게 전달할 호수판 규격을 구하는 문제이다.

 

풀이 과정

입력받은 수의 1자리씩 숫자를 확인해야하므로 while문을 통해 n자리수의 숫자를 10으로 나누면서 맨 뒷자리 숫자마다 계산을 진행했다. 1의 자리를 확인하고 규격값을 계산하면 이를 버리고 입력받은 수를 10으로 나누는 행위를 반복하여 한 숫자마다의 규격을 계산할 수 있었다. 그리고 0을 입력받을 때까지 이 반복을 계속한다. 

#include <stdio.h>

int main(){
    
    int n = 1; 
    int cnt = 0;
    int total = 0;
    scanf("%d",&n);
    while(n){ // 0 받을때까지 반복
        cnt = n%10; 
        total += 1;
        while(n){ //n을 10으로 나누면서 나머지값을 통해 뒷자리 1개씩 계산
            if(cnt==1){
               total += 2; 
            }else if(cnt==0){
               total += 4;
            }else{
               total += 3;
            }
			total += 1; //해당 숫자에 맞는 여백 계산
			n/=10;
            cnt = n%10;
        }
        printf("%d\n",total); //결과
		total = 0; //다음 반복을 위한 초기화
        scanf("%d",&n);
    }
    
    return 0;
}

'정리 > C' 카테고리의 다른 글

[C] 백준 #2010, #2441, #2442  (0) 2023.10.01
[C] 백준 #1547, #1598, #1703  (0) 2023.09.19
[c] 백준 10870  (0) 2023.08.27
[c] 코딩도장 파일입출력 문제  (0) 2023.08.27
[c] 파일 입출력  (0) 2023.08.27

댓글