상세 컨텐츠

본문 제목

[프로그래밍랩] 6주차 - Quiz

C/문제 풀이

by uzichoi 2025. 4. 14. 20:24

본문

[프로그래밍랩] 6주차 - Quiz

 

1. 확률이 조작된 주사위 2개가 있다. 주사위 2개의 합을 구한다.

  1. 첫 번째 주사위는 1은 나오지 않고 2~6만 나오고 6이 40% 확률로 나온다.
  2. 두 번째 주사위는 1~6이 나오지만 3이 나올 확률이 40%이다.

 그러므로 주사위 2개의 합이 2가 나올 확률은 0이다.

 난수를 이용하여 주사위 2개의 합(2 ~ 12)을 구하고 그 분포를 화면과 같이 Histogram으로 표시하는 프로그램을 작성하시오. 주사위 합은 50,000번 구한다. 화면과 같이 분포는 소수점 2자리, Histogram은 1%당 1개씩 *를 표시하며 소숫점이 존재하면 한 개씩 더 출력한다. (예, 1.89%의 경우 2개의 *가 표시된다.)

(주의사항 : 주사위 2개의 확률이 조작되어야 함.)

<실행화면>

<소스코드>

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

void main()
{
	int r1, r2, dice[13] = { 0 }; // 필요하면 변수 추가
	int n, i, j, hist;
	double perc = 0.0;

	srand((unsigned)time(NULL));	// 난수 초기화

	for (i = 0; i < 50000; i++) {	// 50000 번 동안
		// 첫 번째 주사위: r1
		n = rand() % 100;
		if (n < 40) r1 = 6;			// 6이 나올 확률이 40% 
		else if (n < 55) r1 = 2;	// 나머지(2~5) 각 15% 확률로 매핑
		else if (n < 70) r1 = 3;
		else if (n < 85) r1 = 4;
		else r1 = 5;

		// 두 번째 주사위: r2
		n = rand() % 100;
		if (n < 40) r2 = 3;			// 3이 나올 확률이 40%
		else if (n < 52) r2 = 1;	// 나머지(1,2,4,5,6) 각 12% 확률로 매칭
		else if (n < 64) r2 = 2;
		else if (n < 76) r2 = 4;
		else if (n < 88) r2 = 5;
		else r2 = 6;

		dice[r1 + r2]++;
	}

	// 2~12 값에 대하여 발생 빈도 %와 Histogram을 출력한다.
	for (i = 2; i <= 12; i++) {		
		perc = 100.0 * dice[i] / 50000;
		printf("%2d:%5.2lf%% ", i, perc);

		// *의 수는 소숫점이 있으면 +1개 출력한다.
		for (j = 0; j < perc; j++)		
			printf("*");
		printf("\n");
	}
}

 

 

2. 로또 숫자 발생기

 로또는 1~45 숫자 중에 6개의 번호를 예측하는 것이다. 사용자가 번호를 미리 선택할 있는 로또 발행기 프로그램을 작성한다. 입력으로 로또 매수 T 주어지고 각각의 로또마다 사용자가 미리 선택한 번호를 받는다. 미리 선택하는 번호의 개수 n 주어지어 다음 줄에 사용자가 선택한 n개의 숫자가 주어진다. 출력은 로또 매수 번호와 로또 번호 6개가 크기 순으로 출력된다. 예를 들어 7개의 로또를 출력할 n=0 경우 자동으로 [01] : 18 20 35 41 42 45 식으로 6개의 번호를 난수로 발생하여 출력하고 n=3 8, 38, 17 입력되는 경우 3개만 수동으로 [04] : 08 13 17 18 26 38 식으로 8, 38, 17 포함된 6개의 로또 번호를 출력하여야 한다. 마지막 6, 3 8 13 23 37 43 경우 6개의 모두를 수동으로 선택한 경우이다. 수동 번호 입력은 8 38 17 같이 크기순이 아닐 수 있다.

input.txt

<실행화면>

<소스코드>

// quiz2 로또번호 발생기
#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
#include <windows.h>

void main()
{
	int T, n, l, i, j;		// n: 사용자가 미리 선택한 숫자의 개수, l: 랜덤 넘버
	int lotto[46] = { 0 };	

	scanf("%d", &T);		// 로또 매수
	for (i = 0; i < T; i++) {
		// lotto[]를 0으로 초기화한다.
		for (j = 0; j < 46; j++)
			lotto[j] = 0;
		
		// n개의 수를 입력받고 lotto[]에 미리 1로 설정한다.
		scanf("%d", &n);	
		for (j = 0; j < n; j++) {
			scanf("%d", &l);
			lotto[l] = 1;
		}

		// 추가로 (6-n)개의 난수를 발생하여 lotto[]에 1로 설정한다.
		for (j = 0; j < 6 - n; j++) {
			do {
				l = rand() % 45 + 1;
			} while (lotto[l] == 1);	// l이 이미 뽑힌 수라면 계속 반복한다.
			lotto[l] = 1;
		}

		// 발생된 6개의 수를 크기 순으로 출력한다.
		printf("[%02d] : ", i + 1);
		for (j = 1; j <= 45; j++) {
			if (lotto[j] == 1)
				printf("%02d ", j);
		}
		printf("\n");
	}

	//Sleep(10000);
}

 

 

3. 입력받은 단어를 알파벳 순서로 출력하는 프로그램을 작성하시오.

알파벳은 /소문자 구분없이 처리한다. , Ab aB 같은 것으로 본다. 입력으로 Test set T 첫줄에 주어지고 각각의 test case 에는 단어(길이<=80) 주어진다. (Hint : i = 0 ~ 25 라면 a + i a ~ z 되고 A+i A ~ Z 된다.)

input,txt

<실행화면>

<소스코드>

// quiz3 알파벳 순서 출력
#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
#include <string.h>
#include <windows.h>
void main()
{
	int T, len, i, j;
	char str[81];
	scanf("%d", &T);
	while (T--) {
		scanf("%s", str);	// 단어 입력
		len = strlen(str);	// len 구함

		// 알파벳 순서 출력 
		for (i = 0; i < 26; i++) {		// for i = 0 ~ 25 (a ~ z) 또는 (A ~ Z)
			for (j = 0; j < len ; j++) {		// for j = 0 ~ len-1
				if (str[j] == 'a' + i || str[j] == 'A' + i) {	// (a~z) 또는 (A~Z) 조건에 맞으면 str[j]를 출력
					printf("%c", str[j]);
				}
			}
		}
		printf("\n");
	}

	//Sleep(10000);
}

 

관련글 더보기