코딩
컴퓨터과학 공부법
Pink
2021. 12. 2. 10:41
1. 쉬운 책부터 차분히 독파하기
<코딩이 무엇이고, 왜 코딩을 배워야 할까>


<컴퓨터과학을 가볍게 훑고 싶을 때>


<프로그래밍의 기초를 다지고 싶을 때>


2. 인터넷 서핑으로 호기심 채우기
일단 무엇보다도 CPU 에서 나눗셈 연산은 무지하게 느립니다. 기본적으로 덧셈과 뺄셈 연산이 보통 1주기 안에 되고 곱셈도 살짝 느린 3 ~ 4주기 안에 수행됩니다. 그런데 (32비트) 정수 나눗셈의 경우 20 ~ 26주기가 걸리죠. 이 시간 동안 곱셈을 무려 5번이나 더 할 수 있습니다.
물론 예외는 있습니다. 2 의 거듭제곱으로 나누는 연산은 CPU 가 굉장히 빨리 수행할 수 있습니다. 예를 들어서 2^5으로 나눈다는 것은 사실상 오른쪽으로 쉬프트 5번 하는 것과 마찬가지 이기 때문입니다. 그리고 CPU 내부에서 쉬프트 연산과 같은 간단한 비트 연산들은 모두 1주기 안에 수행됩니다. 엄청나게 빠르죠!
따라서 컴파일러는 되도록이면 나눗셈을 곱셈으로 바꿀 수 있으면 바꾸고, 불가피하게 나눗셈을 하게 된다면 되도록 2의 거듭제곱으로 나눗셈을 시도합니다.
<틱택토 게임>
//틱택토 게임의 소스코드 (C 언어, 94줄)
#include <stdio.h>
#include <stdbool.h>
bool isFinish(char board[][3]);
int main(void)
{
int x, y;
char board[3][3];
//보드 초기화 (3 X 3)
for (x = 0; x < 3; x++)
for (y = 0; y < 3; y++)
board[x][y] = '.';
x = y = 0;
//보드 출력
for (int i = 0; i < 3; i++)
printf("%c %c %c\n", board[i][0], board[i][1], board[i][2]);
printf("\n\n");
//보드가 9칸이므로 최대 9턴
for (int k = 0; k < 9; k++) {
INPUT:
printf("행과 열을 입력: ");
scanf("%d %d", &x, &y);
if ((x > 0 && x < 4) && (y > 0 && y < 4))
printf("보드 출력");
//보드를 벗어날 시 재입력
else goto INPUT;
//턴 교대
if (k % 2 == 0)
board[x - 1][y - 1] = 'X';
else
board[x - 1][y - 1] = 'O';
printf("\n\n");
//보드 출력
for (int i = 0; i < 3; i++)
printf("%c %c %c\n", board[i][0], board[i][1], board[i][2]);
printf("\n\n");
if (isFinish(board)) {
if (k % 2 == 0)
printf("X의 승리\n\n");
else
printf("O의 승리\n\n");
return 0;
}
}
//보드가 꽉 차면 무승부
printf("무승부\n\n");
return 0;
}
//승리 조건 검사
bool isFinish(char board[][3])
{
//가로 세 칸
for (int r = 0; r < 3; r++)
//빈칸인 경우 제외
if (board[r][0] != '.')
if (board[r][0] == board[r][1] && board[r][1] == board[r][2])
//승리 조건 충족
return true;
//세로 세 칸
for (int c = 0; c < 3; c++)
if (board[0][c] != '.')
if (board[0][c] == board[1][c] && board[1][c] == board[2][c])
return true;
//우하향 대각선
if (board[0][0] != '.')
if (board[0][0] == board[1][1] && board[1][1] == board[2][2])
return true;
//우상향 대각선
if (board[0][2] != '.')
if (board[0][2] == board[1][1] && board[1][1] == board[2][0])
return true;
//승리 조건 미충족
return false;
}