U E D R , A S I H C RSS

새싹교실/2020/이찌반/정동원

Difference between r1.23 and the current

@@ -1,5 +1,222 @@
[[TableOfContents]]

== 묵찌빠 게임 ==
{{{
#include <stdio.h>
#include <stdlib.h>
#include <math.h>
#include <time.h>
#include <conio.h>
#include <windows.h>
 
enum{
rock = 1,
scissor = 2,
paper = 3,
win = 1,
lose = 2,
draw = 3,
};
 
int determine_rsp();
int determine_winner(int player, int CPU);
void announce_winner(int player, int CPU, int Result);
 
int main() {
srand((unsigned int)time(NULL));
while (1) {
int player_point = 0;
int CPU_point = 0;
//게임 진행
while (player_point != 2 && CPU_point != 2) {
system("cls");
//전판 이긴사람
printf("공격권 : ");
if (player_point == 1) {
printf("당신\n");
}
else if (CPU_point == 1) {
printf("상대\n");
}
else {
printf("없음\n");
}
//가위바위보
int cpu_rsp = rand() % 3 + 1;
int player_rsp = 0;
int result = 0;
 
printf("가위, 바위, 보 세가지 중 무엇을 낼까?\n");
printf("(가위: s, 바위: r, 보: p)\n");
player_rsp = determine_rsp();
result = determine_winner(player_rsp, cpu_rsp);
announce_winner(player_rsp, cpu_rsp, result);
 
//공격권
switch (result) {
case win:
player_point++;
CPU_point = 0;
break;
case lose:
player_point = 0;
CPU_point++;
break;
}
}
//게임 최종 결과
system("cls");
printf("최종 승자! : ");
if (player_point == 2) {
printf("당신\n");
}
if (CPU_point == 2) {
printf("상대\n");
}
Sleep(3000);
// 게임 진행 여부 묻기
// 계속하기 : C 멈추기 : Q 기록보기 : R
printf("계속 하시겠습니까?\n");
printf("계속하기 : c 멈추기 : q 기록보기 : r\n");
while (1) {
char choice = _getch();
switch (choice) {
case 'c':
printf("게임을 계속 진행합니다.\n");
Sleep(1000);
break;
case 'q':
printf("잠시후 게임을 종료합니다.\n");
Sleep(1000);
exit(0);
break;
case 'r':
printf("미구현!\n");
Sleep(1000);
printf("계속 하시겠습니까?\n");
printf("계속하기 : c 멈추기 : q 기록보기 : r\n");
break;
default:
printf("{c, q, r}중에서 입력하세요!\n");
break;
}
if (choice == 'c') {
break;
}
}
}
}
 
// 게임 끝났다고 출력
// scanf 써서
// 계속하겠습니까? 멈추겠습니까?
// 계속하기 : C 멈추기 : Q 기록보기 : R
// R을 누르면 기록을 보여주기. (CPU 몇승 플레이어 몇승)
// C를 누르면 다시 한판 하기
 
int determine_rsp() {
//기준 시간 선언
int past_time = clock() / CLOCKS_PER_SEC;
// 현재 시간 선언
int current_time;
 
while (1) {
current_time = clock() / CLOCKS_PER_SEC;
// 사용자의 키보드 입력 여부를 검사
if (_kbhit()) {
char select = _getch();
switch (select) {
case 'r':
return rock;
case 's':
return scissor;
case 'p':
return paper;
default:
printf("{r, s, p}중에서 입력하세요!\n");
}
}
// 현재 시간이 기준시간으로부터 5초가 지났을 때 시행
if (current_time - past_time > 5) {
return rand() % 3 + 1;
}
Sleep(20);
}
 
}
 
int determine_winner(int player, int CPU) {
if (CPU - player == 1 || CPU - player == -2) {
return win;
}else if(CPU - player == 0){
return draw;
}else {
return lose;
}
 
}
 
void announce_winner(int player, int CPU, int Result) {
system("cls");
printf("안내면 진거!\n");
Sleep(1000);
printf("가위!\n");
Sleep(500);
printf("바위!\n");
Sleep(500);
printf("보!\n");
Sleep(500);
 
printf("당신 : ");
switch (player) {
case rock:
printf("묵");
break;
case scissor:
printf("찌");
break;
case paper:
printf("빠");
break;
}
printf(" ");
printf("상대 : ");
switch (CPU) {
case rock:
printf("묵");
break;
case scissor:
printf("찌");
break;
case paper:
printf("빠");
break;
}
printf("\n");
 
switch(Result){
case win:
printf("이겼습니다\n");
break;
case lose:
printf("졌습니다\n");
break;
case draw:
printf("비겼습니다\n");
break;
}
 
printf("계속하려면 아무키나 누르시오\n");
while (1) {
if (_kbhit()) {
Sleep(100);
break;
}
}
}
}}}
== 코딩테스트 1단계 ==


@@ -321,3 +538,118 @@
}
}
}}}
=== 짝수와 홀수 ===
{{{
#include <stdio.h>
#include <stdbool.h>
#include <stdlib.h>
#include <string.h>
 
char* solution(int num) {
char* answer = (char*)malloc(sizeof(char)*4 + 1);
if (num % 2 == 0){
strcpy(answer,"Even");
}else{
strcpy(answer,"Odd");
}
return answer;
}
}}}
=== 콜라츠 추측 ===
{{{
#include <stdio.h>
#include <stdbool.h>
#include <stdlib.h>
 
int solution(int num) {
long lnum = num;
int answer = 0;
while(lnum != 1){
if (answer>500){
return -1;
}
if(lnum % 2 == 0){
lnum /= 2;
}else{
lnum = lnum*3 + 1;
}
answer++;
}
return answer;
}
}}}
=== 평균 구하기 ===
{{{
#include <stdio.h>
#include <stdbool.h>
#include <stdlib.h>
 
// arr_len은 배열 arr의 길이입니다.
double solution(int arr[], size_t arr_len) {
double answer = 0;
int i;
for(i = 0; i < arr_len; ++i){
answer += arr[i];
}
answer /= arr_len;
return answer;
}
}}}
=== 하샤드 수 ===
{{{
#include <stdio.h>
#include <stdbool.h>
#include <stdlib.h>
 
bool solution(int x) {
int sum = 0,n = x;
while (n != 0){
sum += n % 10;
n = n / 10;
}
if(x % sum == 0){
return true;
}else{
return false;
}
}
}}}
=== 핸드폰 번호 가리기 ===
{{{
#include <stdio.h>
#include <stdbool.h>
#include <stdlib.h>
#include <string.h>
 
 
// 파라미터로 주어지는 문자열은 const로 주어집니다. 변경하려면 문자열을 복사해서 사용하세요.
char* solution(const char* phone_number) {
int len = strlen(phone_number);
char* answer = (char*)malloc(sizeof(char)*len + 1);
int i;
strcpy(answer,phone_number);
for (i = 0; i < len - 4 ; ++i){
answer[i] = '*';
}
return answer;
}
}}}
=== 직사각형 별찍기 ===
{{{
#include <stdio.h>
 
int main(void) {
int a;
int b;
int i, j;
scanf("%d %d", &a, &b);
for (i = 0; i < b; ++i){
for(j = 0; j < a ; ++j){
printf("*");
}
printf("\n");
}
return 0;
}
}}}




1. 묵찌빠 게임

#include <stdio.h>
#include <stdlib.h>
#include <math.h>
#include <time.h>
#include <conio.h>
#include <windows.h>

enum{
    rock = 1,
    scissor = 2,
    paper = 3,
    win = 1,
    lose = 2,
    draw = 3,
};

int determine_rsp();
int determine_winner(int player, int CPU);
void announce_winner(int player, int CPU, int Result);

int main() {
    srand((unsigned int)time(NULL));
    
    while (1) {
        int player_point = 0;
        int CPU_point = 0;
        //게임 진행
        while (player_point != 2 && CPU_point != 2) {
            system("cls");
            //전판 이긴사람
            printf("공격권 : ");
            if (player_point == 1) {
                printf("당신\n");
            }
            else if (CPU_point == 1) {
                printf("상대\n");
            }
            else {
                printf("없음\n");
            }
            //가위바위보
            int cpu_rsp = rand() % 3 + 1;
            int player_rsp = 0;
            int result = 0;

            printf("가위, 바위, 보 세가지 중 무엇을 낼까?\n");
            printf("(가위: s, 바위: r, 보: p)\n");
            player_rsp = determine_rsp();
            result = determine_winner(player_rsp, cpu_rsp);
            announce_winner(player_rsp, cpu_rsp, result);

            //공격권
            switch (result) {
            case win:
                player_point++;
                CPU_point = 0;
                break;
            case lose:
                player_point = 0;
                CPU_point++;
                break;
            }
        }
        //게임 최종 결과
        system("cls");
        printf("최종 승자! : ");
        if (player_point == 2) {
            printf("당신\n");
        }
        if (CPU_point == 2) {
            printf("상대\n");
        }
        Sleep(3000);
        // 게임 진행 여부 묻기
        // 계속하기 : C 멈추기 : Q 기록보기 : R
        printf("계속 하시겠습니까?\n");
        printf("계속하기 : c 멈추기 : q 기록보기 : r\n");
        while (1) {
            char choice = _getch();
            switch (choice) {
            case 'c':
                printf("게임을 계속 진행합니다.\n");
                Sleep(1000);
                break;
            case 'q':
                printf("잠시후 게임을 종료합니다.\n");
                Sleep(1000);
                exit(0);
                break;
            case 'r':
                printf("미구현!\n");
                Sleep(1000);
                printf("계속 하시겠습니까?\n");
                printf("계속하기 : c 멈추기 : q 기록보기 : r\n");
                break;
            default:
                printf("{c, q, r}중에서 입력하세요!\n");
                break;
            }
            if (choice == 'c') {
                break;
            }
        }
    }
}
    

    // 게임 끝났다고 출력
    // scanf 써서
    // 계속하겠습니까? 멈추겠습니까?
    // 계속하기 : C 멈추기 : Q 기록보기 : R
    // R을 누르면 기록을 보여주기. (CPU 몇승 플레이어 몇승)
    // C를 누르면 다시 한판 하기

int determine_rsp() {
    //기준 시간 선언
    int past_time = clock() / CLOCKS_PER_SEC;
    // 현재 시간 선언
    int current_time;

    while (1) {
        current_time = clock() / CLOCKS_PER_SEC;
        // 사용자의 키보드 입력 여부를 검사
        if (_kbhit()) {
            char select = _getch();
            switch (select) {
                case 'r':
                    return rock;
                case 's':
                    return scissor;
                case 'p':
                    return paper;
                default:
                    printf("{r, s, p}중에서 입력하세요!\n");
            }
        }
        // 현재 시간이 기준시간으로부터 5초가 지났을 때 시행
        if (current_time - past_time > 5) {
            return rand() % 3 + 1;
        }
        Sleep(20);
    }

}

int determine_winner(int player, int CPU) {
    if (CPU - player == 1 || CPU - player == -2) {
        return win;
    }else if(CPU - player == 0){
        return draw;
    }else {
        return lose;
    }

}

void announce_winner(int player, int CPU, int Result) {
    system("cls");
    printf("안내면 진거!\n");
    Sleep(1000);
    printf("가위!\n");
    Sleep(500);
    printf("바위!\n");
    Sleep(500);
    printf("보!\n");
    Sleep(500);

    printf("당신 : ");
    switch (player) {
    case rock:
        printf("묵");
        break;
    case scissor:
        printf("찌");
        break;
    case paper:
        printf("빠");
        break;
    }
    printf("  ");
    printf("상대 : ");
    switch (CPU) {
    case rock:
        printf("묵");
        break;
    case scissor:
        printf("찌");
        break;
    case paper:
        printf("빠");
        break;
    }
    printf("\n");

    switch(Result){
    case win:
        printf("이겼습니다\n");
        break;
    case lose:
        printf("졌습니다\n");
        break;
    case draw:
        printf("비겼습니다\n");
        break;
    }

    printf("계속하려면 아무키나 누르시오\n");
    while (1) {
        if (_kbhit()) {
            Sleep(100);
            break;
        }
    }
}

2. 코딩테스트 1단계



2.1. 두 개 뽑아서 더하기

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

int compare(void *a,void *b);
int* solution(int numbers[], size_t numbers_len) {

    qsort(numbers,numbers_len,sizeof(int),compare);
    int* temp = (int*)malloc(sizeof(int)*201);
    memset(temp,0,sizeof(int));
    
    int i,j,k,n=0;
    for (i = 0; i < numbers_len - 1; ++i){
        for(j = i+1; j < numbers_len; ++j){
            int count = 0;
            for(k=0; k < n; ++k){
                if(temp[k] == numbers [i] + numbers[j]){
                    ++count;
                }
            }
            if(count == 0){
                temp[n] = numbers [i] + numbers[j];
            ++n;
            }           
        }
    }

    qsort(temp,n,sizeof(int),compare);
    int* answer = (int*)malloc(sizeof(int)*n);
    for (i = 0; i < n; ++i){
        answer[i]= temp[i];
    }
    free(temp);
    return answer;
}

int compare(void *a,void *b){
    int num1 = *(int *)a;
    int num2 = *(int *)b;
    return num1 - num2;
}

2.2. 2016년

#include <stdio.h>
#include <stdbool.h>
#include <stdlib.h>
#include <string.h>

char* solution(int a, int b) {
    int days[12] = {31,29,31,30,31,30,31,31,30,31,30,31};
    char week[7][4] = {"FRI","SAT","SUN","MON","TUE","WED","THU"};
    char* answer = (char*)malloc(sizeof(char)*4);

    int i, d, n=-1;

    for (i = 0; i < a - 1; ++i) {
        n += days[i];
    }
    n += b;
    d = n % 7;

    strcpy(answer, week[d]);
    return answer;
}

2.3. 가운데 글자 가져오기

#include <stdio.h>
#include <stdbool.h>
#include <stdlib.h>
#include <string.h>

char* solution(const char* s) {
    int len = strlen(s);
    if (len % 2) {
        char* answer = (char*)malloc(sizeof(char) * 2);
        answer[0] = s[len / 2];
        answer[1] = '\0';
        printf("%s", answer);
        return answer;
    }else{
        char* answer = (char*)malloc(sizeof(char) * 3);
        answer[0] = s[len / 2 - 1];
        answer[1] = s[len / 2];
        answer[2] = '\0';
        printf("%s", answer);
        return answer;
    }
}

2.4. 두 정수 사이의 합

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

long long solution(int a, int b) {
    long long answer = 0;
    int i;
    if (a>b){
        int temp;
        temp = b;
        b = a;
        a = temp;
    }
    for (i = a; i <= b ; ++i){
        answer += i;
    }
    return answer;
}

2.5. 문자열 내림차순으로 배치하기

#include <stdio.h>
#include <stdbool.h>
#include <stdlib.h>
#include <string.h>


char* solution(const char* s) {
    int i,j, len =strlen(s);
    char* answer = (char*)malloc(sizeof(char)*len + 1);
    strcpy(answer,s);
    
    for(i = len; i > 0; --i){
        for(j = 0; j < i - 1; ++j){
            if (answer[j] < answer[j+1]){
                char temp;
                temp = answer[j+1];
                answer[j+1] = answer[j];
                answer[j] = temp;
            }
        }
    }
    
    return answer;
}

2.6. 문자열 다루기 기본

#include <stdio.h>
#include <stdbool.h>
#include <stdlib.h>
#include <ctype.h>
#include <string.h>

bool solution(const char* s) {
    bool t1, t2, answer;
    int i, count, len = strlen(s);
    if(len == 4 || len == 6){
        t1 = true;
    }else{
        t1 = false;
    }
    
    count = 0;
    for(i = 0 ;i < len; ++i){
        if(isdigit(s[i])){
            ++count;
        }
    }
    
    if(count == len){
        t2 = true;
    }else{
        t2 = false;
    }
    
    if(t1&&t2){
        answer = true;
    }else{
        answer = false;
    }
    
    return answer;
}

2.7. 수박수박수박수박수박수?

#include <stdio.h>
#include <stdbool.h>
#include <stdlib.h>
#include <string.h>

char* solution(int n) {
    // 리턴할 값은 메모리를 동적 할당해주세요.
    char* answer = (char*)malloc(sizeof("수") * n + 1);
    int i;
    memset(answer,'\0',sizeof("수") * n + 1);
    for(i = 0;i < n; ++i){
        if(i%2==0){
            strcat(answer,"수");
        }else{
            strcat(answer,"박");
        }
        answer[n*sizeof("수")] = '\0';
    }
    return answer;
}

2.8. 문자열을 정수로 바꾸기

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

int solution(const char* s) {
    int answer = atoi(s);
    return answer;
}

2.9. 약수의 합

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

int solution(int n) {
    int i, answer = 0;
    for(i = 1; i <= n; ++i){
        if(n%i == 0){
             answer += i;
        }
    }
    
    return answer;
}

2.10. 이상한 문자 만들기

#include <stdio.h>
#include <stdbool.h>
#include <stdlib.h>
#include <string.h>
#include <ctype.h>


char* solution(const char* s){
    const int len = strlen(s);
    char* answer = (char*)malloc(sizeof(char) * strlen(s) + 1);
    int i = 0, count = 0;
    memset(answer, '\0', sizeof(char) * strlen(s) + 1);
    while (count < len) {
        if (s[count] != ' ') {
            if (i % 2 == 0) {
                answer[count] = (char)toupper(s[count]);

            }
            else {
                answer[count] = (char)tolower(s[count]);
            }
            i++;
        }
        else {
            answer[count] = s[count];
            i = 0;
        }          
        count++;
    }
    answer[strlen(s)] = '\0';
    return answer;
}

2.11. 자릿수 더하기

#include <stdio.h>
#include <stdbool.h>
#include <stdlib.h>
#include <math.h>

int solution(int n) {
    int i = 0, answer = 0;
    while (n % (int)pow(10, i) != n) {
        answer += (n % (int)pow(10, i + 1))/(int)pow(10, i);
        i++;
    }
    return answer;
}

2.12. 자연수 뒤집어 배열로 만들기

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

int* solution(long long n) {
    int i = 0;
    long long m = n;
    while (m != 0) {
        m = m / 10;
        i++;
    }
    int* answer = (int*)malloc(sizeof(int) * i);
    for (int j = 0; n != 0; ++j) {
        answer[j] = n % 10;
        n = n / 10;
    }
    return answer;
}

2.13. 정수 제곱근 판별

#include <stdio.h>
#include <stdbool.h>
#include <stdlib.h>
#include <math.h>

long long solution(long long n) {
    if (sqrt(n) == (int)sqrt(n)){
        return pow(sqrt(n) + 1,2);
    }else{
        return -1;
    }
}

2.14. 짝수와 홀수

#include <stdio.h>
#include <stdbool.h>
#include <stdlib.h>
#include <string.h>

char* solution(int num) {
    char* answer = (char*)malloc(sizeof(char)*4 + 1);
    if (num % 2 == 0){
        strcpy(answer,"Even");
    }else{
        strcpy(answer,"Odd");
    }
    return answer;
}

2.15. 콜라츠 추측

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

int solution(int num) {
    long lnum = num;
    int answer = 0;   
    while(lnum != 1){
        if (answer>500){
            return -1;
        }
        if(lnum % 2 == 0){
            lnum /= 2;
        }else{
            lnum = lnum*3 + 1;
        }
        answer++;           
    }
    return answer;
}

2.16. 평균 구하기

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

// arr_len은 배열 arr의 길이입니다.
double solution(int arr[], size_t arr_len) {
    double answer = 0;
    int i;
    for(i = 0; i < arr_len; ++i){
        answer += arr[i];
    }
    answer /= arr_len;
    return answer;
}

2.17. 하샤드 수

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

bool solution(int x) {
    int sum = 0,n = x;
    while (n != 0){
        sum += n % 10;
        n = n / 10;
    }
    if(x % sum == 0){
        return true;
    }else{
        return false;
    }
}

2.18. 핸드폰 번호 가리기

#include <stdio.h>
#include <stdbool.h>
#include <stdlib.h>
#include <string.h>


// 파라미터로 주어지는 문자열은 const로 주어집니다. 변경하려면 문자열을 복사해서 사용하세요.
char* solution(const char* phone_number) {
    int len = strlen(phone_number);
    char* answer = (char*)malloc(sizeof(char)*len + 1);
    int i;
    strcpy(answer,phone_number);
    for (i = 0; i < len - 4 ; ++i){
        answer[i] = '*';
    }
    
    return answer;
}

2.19. 직사각형 별찍기

#include <stdio.h>

int main(void) {
    int a;
    int b;
    int i, j;
    scanf("%d %d", &a, &b);
    for (i = 0; i < b; ++i){
        for(j = 0; j < a ; ++j){
            printf("*");
        }
        printf("\n");
    }
    return 0;
}
Valid XHTML 1.0! Valid CSS! powered by MoniWiki
last modified 2021-02-16 14:07:54
Processing time 0.0393 sec