U E D R , A S I H C RSS

새싹교실/2020/이찌반/정동원 (rev. 1.25)

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


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;
}
Valid XHTML 1.0! Valid CSS! powered by MoniWiki
last modified 2021-02-16 14:07:54
Processing time 0.0499 sec