윤성우의 열혈 C 프로그래밍 - 도전! 프로그래밍 3

Yumin Jung·2023년 9월 20일
0

도전 1 (o)

#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>

int main(void) {
	int arr[4][4] = { { 1,2,3,4},{5,6,7,8},{9,10,11,12},{13,14,15,16} };
	int arr2[4][4];

	int i = 0, j = 0, result;

	for (i = 0; i < 4; i++) {
		for (j = 0; j < 4; j++) {
			result = arr[i][j];
			
			if (i == j)
				arr2[i][3 - j] = result;
			else
				arr2[j][3 - i] = result;
		}
	}
	for (i = 0; i < 4; i++) {
		for (j = 0; j < 4; j++)
			printf("%d ", arr2[i][j]);
		printf("\n");
	}
}

2차원 배열 하나만 선언하여 그 안에서 돌리는 방식을 처음에는 택했지만, 내 지식 선에서는 배열을 하나 더 만드는 것이 최선의 효율이라고 생각하였다.
예를 들어, arr[0][0]인 1을 arr[0][3]에 배치시켜야 하는데 그렇게 된다면 기존의 arr[0][3]에 있던 사라지게 된다. 이것을 임시적인 데이터에 저장해야한다. 새로운 2차원배열을 선언하여 거기에 차곡차곡 작성하는 것이 효율적이라고 판단하였다.

도전 2 (x) 관계성 문제.(노가다, 다시 풀기)

관계성은 찾은 것 같았지만 그에 앞서 사용자로부터 받은 숫자 n을 n * n 배열로 출력하는 것에 대하여 실패하였다. 가로 세로에 변수 n을 대입하였는데 변수는 배열을 만들 수가 없었다.
많은 시도에도 불구하고 모르겠어서 결국, 배열 선언하는 부분만 답을 보기로 하였다.

보는 중.........

다행스럽게도, 내가 틀리진 않았다. 답지에서는 세로 가로 각각 50인 배열을 생성하였고, 그 안에서 노는 방식을 선택한 것 같았다.

도전 3 (x)

#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
#include<stdlib.h>

int main(void) {
	int i;
	printf("난수 범위 : 0부터 %d까지\n", 99);
	for (i = 0; i < 5; i++)
		printf("난수 출력: %d\n", ((rand()%99)+2));
	return 0;
}

rand() 함수의 최대 범위는 32767임을 상수 RAND_MAX의 출력값으로 알 수 있었다. 그리고 99까지의 범위로 난수를 얻기 위해서는 힌트에 나와있는대로 %연산자를 이용하여 32767에 99를 나누어 그것의 나머지인 97에 +2를 하여 출력을 했다.

나의 풀이는 오답이었다. 아예 접근 방식이 틀렸다.

만약에 난수가 99였을때 이것을 99로 나눴을때는 나머지가 0이 된다. 98이었을때는 이것을 99로 나눴을때 나머지가 98이 된다.
그 말 즉, 범위는 0에서 98까지 밖에 되지 않는다는 의미이다. 내가 했던 방식대로 난수에 99를 나눈 나머지에 +2를 한다면 0또는 1의 값은 나오지 않을것이다. (범위 : 2~101)

#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
#include<stdlib.h>

int main(void) {
	int i;
	printf("난수 범위 : 0부터 %d까지\n", 99);
	for (i = 0; i < 5; i++)
		printf("난수 출력: %d\n", rand()%100);
	return 0;
}

도전 4 (o)

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

int dicespin(int);

int main(void) {
	int sel;

	printf("두개의 주사위를 던졌을때의 결과를 랜덤하게 보여드릴게요!! \n\n 던질려면 1을 입력하세요 : ");
	scanf_s("%d", &sel);
	dicespin(sel);
}

int dicespin(int a) {
	if (a == 1) {
		srand((int)time(NULL));
		printf("주사위 1의 결과: %d\n\n", rand() % 6 + 1);
		printf("주사위 2의 결과: %d\n\n", rand() % 6 + 1);

		return main() ;
	}
	else
	{
		printf("\n\n\n\n-----------------------잘못 입력하였습니다-----------------------\n\n\n");
		return main();
	}
}

srand((int)time(NULL));
초 당 새로운 씨앗을 심는 srand 함수와 time 함수를 조합하였다. 씨드 값이 무엇이냐에 따라서 rand 함수가 반환하는 난수의 형태가 달리지기 때문이다.

도전 5

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

int RCP (int, int);
int main(void) {
	int num, com;
	printf("\n\n\n\n바위는 1, 가위는 2, 보는 3\n\n\n");
	scanf_s("%d", &num);
	srand((int)time(NULL));
	com = rand() % 3 + 1;
	RCP(num, com);
}

int RCP(int n, int c) {
	static int win=0, same=0;
	if (n == 1) {
		if (c == 2) {
			printf("당신은 바위 선택, 컴퓨터는 가위 선택, 이겼습니다!");
			win++;
			return main();
		}
		else if (c == 1) {
			printf("당신은 바위 선택, 컴퓨터는 바위 선택, 비겼습니다!");
			same++;
			return main();
		}
		else {
			printf("당신은 바위 선택, 컴퓨터는 보 선택, 당신이 졌습니다!\n\n");
			printf("게임의 결과 : %d승, %d무", win, same);
			return 0;
		}
	}
	else if (n == 2) {
		if (c == 3) {
			printf("당신은 가위 선택, 컴퓨터는 보 선택, 이겼습니다!");
			win++;
			return main();
		}
		else if (c == 2) {
			printf("당신은 가위 선택, 컴퓨터는 가위 선택, 비겼습니다!");
			same++;
			return main();
		}
		else {
			printf("당신은 가위 선택, 컴퓨터는 바위 선택, 당신이 졌습니다!\n\n");
			printf("게임의 결과 : %d승, %d무", win, same);
			return 0;
		}
	}
	else {
		if (c == 1) {
			printf("당신은 보 선택, 컴퓨터는 바위 선택, 이겼습니다!");
			win++;
			return main();
		}
		else if (c == 3) {
			printf("당신은 보 선택, 컴퓨터는 보 선택, 비겼습니다!");
			same++;
			return main();
		}
		else {
			printf("당신은 보 선택, 컴퓨터는 가위 선택, 당신이 졌습니다!\n\n");
			printf("게임의 결과 : %d승, %d무", win, same);
			return 0;
		}
	}
}

srand와 time함수를 이용한 난수 생성에는 지장이 없었다. 다만, 코드가 누가봐도 노가다(?)식으로 짠게 보인다. static 변수를 이용해 게임의 결과에 누적시켰고, 작동은 잘 된다.

책에서 노가다를 시키지는 않을것이라고, 내 코드의 센스가 많이 부족했다고 굳게 믿은 나는 좀 더 간결하고 깔끔한 코드를 작성해보기로 했다.

profile
문과를 정말로 존중해

0개의 댓글