본문 바로가기

프로그램언어/C언어

cos pro1급 샘플문제 구조

문제1

학생들의 학번과 등수가 주어질 때, 학번을 등수 순서대로 정렬하려 합니다(, 등수가 같은 학생은 없다고 가정합니다). 이를 위해 다음과 같이 구조체를 정의했습니다.

 

typedef struct Student{

int student_number;

int rank;

}Student;

 

 

또한, 다음과 같이 프로그램 구조를 작성했습니다.

 

 

1. 학생의 학번과 등수로 구성된 구조체 배열을 생성 및 초기화합니다.

2. 생성된 구조체 배열을 등수 기준으로 오름차순 정렬합니다.

3. 정렬된 구조체 배열에서 학번을 첫 번째 원소부터 순서대로 가져와 새로운 배열에 넣습니다.

4. 생성된 학번 배열을 return 합니다.

 

 

학생들의 학번이 들어있는 배열 student_numbersstudent_numbers의 길이 student_numbers_len, 학생들의 등수가 들어있는 배열 ranksranks의 길이 ranks_len이 매개변수로 주어질 때, 학생들의 학번을 등수 순으로 정렬한 배열을 return 하도록 solution 함수를 작성하려 합니다. 위 구조를 참고하여 코드가 올바르게 동작할 수 있도록 빈칸을 채워 전체 코드를 완성해주세요.

 

매개변수 설명

학생들의 학번이 들어있는 배열 student_numbersstudent_numbers의 길이 student_numbers_len, 학생들의 등수가 들어있는 배열 ranksranks의 길이 ranks_lensolution 함수의 매개변수로 주어집니다.

 

* student_numbers_len1 이상 100 이하의 자연수입니다.

* 학생들의 학번은 1 이상 1,000 이하의 자연수입니다.

* ranks_len1 이상 100 이하의 자연수입니다.

* ranks에는 1부터 ranks_len 까지의 자연수가 하나씩 들어있습니다.

* student_numbers_lenranks_len은 항상 같으며, i 번째 학생의 학번과 등수는 student_numbers[i]ranks[i]에 들어있습니다.

 

return 값 설명

학생들의 학번을 등수 순으로 정렬한 배열을 return 해주세요.

 

예시

| student_numbers | student_numbers_len | ranks | ranks_len | return |

| [2,4,3,6,5] | 5 | [3,5,1,2,4] | 5 | [3,6,2,5,4] |

 

예시 설명

 

학번을 등수순서로 정렬하면 [3, 6, 2, 5, 4]가 됩니다.

 

 

문제소스코드

#include <stdio.h>

#include <stdbool.h>

#include <stdlib.h>

 

typedef struct Student{

    int student_number;

    int rank;

}Student;

 

int compare(const void *a, const void * b){

    Student first = *(Student *)a;

    Student second = *(Student *)b;

    if(@@@)

        return -1;

    else if(@@@)

        return 1;

    else

        return 0;

}

 

int* solution(int student_numbers[], int student_numbers_len, int ranks[], int ranks_len) {

    int len = student_numbers_len;

    Student* students = (Student*)malloc(sizeof(Student)*len);

    for(int i = 0; i < len; ++i){

        @@@;

       @@@;

    }

 

    qsort(students, len, sizeof(Student), compare);

 

    int* answer = (int*)malloc(sizeof(int)*len);

    for(int i = 0; i < len; ++i)

        answer[i] = @@@;

 

    return answer;

}

 

// 아래는 테스트케이스 출력을 해보기 위한 main 함수입니다.

int main() {

    int student_numbers[5] = {2,4,3,6,5};

    int student_numbers_len = 5;

    int ranks[5] = {3,5,1,2,4};//동점자 없음

    int ranks_len = 5;

    int* ret = solution(student_numbers, student_numbers_len, ranks, ranks_len);

 

    // [실행] 버튼을 누르면 출력 값을 볼 수 있습니다.

    printf("solution 함수의 반환 값은 {");

    for(int i = 0; i < 6; i++){

        if (i != 0) printf(", ");

            printf("%d", ret[i]);

    }

    printf("} 입니다.\n");

}

 

정답소스코드

더보기

#include <stdio.h>

#include <stdbool.h>

#include <stdlib.h>

 

typedef struct Student{

    int student_number;

    int rank;

}Student;

 

int compare(const void *a, const void * b){

    Student first = *(Student *)a;

    Student second = *(Student *)b;

    if(first.rank < second.rank)

        return -1;

    else if(first.rank > second.rank)

        return 1;

    else

        return 0;

}

 

int* solution(int student_numbers[], int student_numbers_len, int ranks[], int ranks_len) {

    int len = student_numbers_len;

    Student* students = (Student*)malloc(sizeof(Student)*len);

    for(int i = 0; i < len; ++i){

        students[i].student_number = student_numbers[i];

        students[i].rank = ranks[i];

    }

 

    qsort(students, len, sizeof(Student), compare);

 

    int* answer = (int*)malloc(sizeof(int)*len);

    for(int i = 0; i < len; ++i)

         answer[i] = students[i].student_number;

 

    return answer;

}

 

 

문제10

구조체를 이용하여 헤드 노드를 가지는 단일 연결 리스트 코드를 작성하려 합니다. 단일 연결 리스트에는 다음과 같은 함수가 필요합니다.

 

* insert_node : 아래 그림과 같이 target 노드 바로 뒤에 data를 저장한 새 노드를 추가합니다.

* 이 문제에서는 항상 헤드 노드 뒤에 새 노드를 추가합니다.

 

![list_3.png](https://grepp-programmers.s3.amazonaws.com/files/ybm/0bdd1b9771/4e6b1cc7-fc1d-4d70-aad8-30a137441116.png)

 

![list_4.png](https://grepp-programmers.s3.amazonaws.com/files/ybm/297cdb7c72/221a09c6-d0ae-4130-8c62-9f90111d6659.png)

 

* remove_node : 매개변수로 주어진 data와 같은 값을 저장하고 있는 모든 노드를 연결 리스트에서 삭제합니다.

* remove_node 함수는 완성된 상태로 주어집니다.

 

연결 리스트에 데이터를 추가하고 삭제하는 명령이 담긴 2차원 배열 cmdcmd의 세로 길이 cmd_len이 매개변수로 주어질 때, 모든 명령을 처리한 후 연결 리스트에서 데이터가 담긴 노드의 개수를 return 하도록 solution 함수를 작성하려 합니다. 빈칸을 채워 전체 코드를 완성해주세요.

 

---

#####매개변수 설명

연결 리스트에 데이터를 추가하고 삭제하는 명령이 담긴 2차원 배열 cmdcmd의 세로 길이 cmd_lensolution 함수의 매개변수로 주어집니다.

 

* cmd의 세로 길이는 cmd_len, 가로 길이는 2이며, cmd_len1 이상 20 이하입니다.

* cmd의 각 행은 [리스트 조작 명령, 데이터]를 나타냅니다.

* 리스트 조작 명령은 1 또는 2이며, 1은 노드 삽입을, 2는 노드 삭제를 나타냅니다.

* 데이터는 1 이상 100 이하의 자연수입니다.

 

---

#####return 값 설명

모든 명령을 처리한 후 연결 리스트에서 데이터가 담긴 노드의 개수를 return 해주세요.

 

* 헤드 노드는 빼고 세면 됩니다.

 

---

#####예시

 

| cmd | cmd_len | return |

|----------------------------------------------------------|----------|--------|

| [[1, 1], [1, 4], [1, 2], [1, 3], [1, 1], [2, 2], [2, 1]] | 7 | 2 |

 

#####예시 설명

 

명령에 따른 리스트의 상태를 살펴보면 다음과 같습니다.

 

| 명령 | 데이터 | 리스트 상태 |

|--------|--------|----------------------------|

| - | - | [H] (헤드 노드) |

| INSERT | 1 | [H]-[1] |

| INSERT | 4 | [H]-[4]-[1] |

| INSERT | 2 | [H]-[2]-[4]-[1] |

| INSERT | 3 | [H]-[3]-[2]-[4]-[1] |

| INSERT | 1 | [H]-[1]-[3]-[2]-[4]-[1] |

| REMOVE | 2 | [H]-[1]-[3]-[4]-[1] |

| REMOVE | 1 | [H]-[3]-[4] |

 

따라서 리스트에 남은 노드 중, 데이터가 담긴 노드는 총 2개입니다.

 

문제소스코드

#include <stdio.h>
#include <stdbool.h>
#include <stdlib.h>
#define INSERT 1
#define REMOVE 2

struct NODE {
    @@@ next;
    int data;
};

void insert_node(struct NODE *target, int data){
    struct NODE *new_node = (struct NODE*)malloc(sizeof(struct NODE));
    new_node->next = @@@;
    @@@ = data;
    @@@ = new_node;
}

void remove_node(struct NODE *head, int data){
    struct NODE *curr_node = head;
    while(curr_node->next != NULL){
        if(curr_node->next->data == data){
            struct NODE *temp_node = curr_node->next;
            curr_node->next = curr_node->next->next;
            free(temp_node);
        }
        else
            curr_node = curr_node->next;
    }
}

int solution(int cmd[][2], int cmd_len) {
    struct NODE *head = (struct NODE*)malloc(sizeof(struct NODE));
    head->next = NULL;
    
    for(int i = 0; i < cmd_len; i++){
        if(cmd[i][0] == INSERT)
            insert_node(head, cmd[i][1]);
        else if(cmd[i][0] == REMOVE)
            remove_node(head, cmd[i][1]);
    }
    
    int count = 0;
    struct NODE *curr_node = head -> next;
    while (curr_node != NULL){
        count += 1;
        curr_node = curr_node->next;
    }
    
    return count;
}

// 아래는 테스트케이스 출력을 해보기 위한 main 함수입니다.
int main() {
    int cmd[7][2] = {{1,1},{1,4},{1,2},{1,3},{1,1},{2,2},{2,1}};
    int cmd_len = 7;
    int ret = solution(cmd, cmd_len);
    
    // [실행] 버튼을 누르면 출력 값을 볼 수 있습니다.
    printf("solution 함수의 반환 값은 %d 입니다.\n", ret);
}

 

정답소스코드

더보기

#include <stdio.h>
#include <stdbool.h>
#include <stdlib.h>
#define INSERT 1
#define REMOVE 2


struct NODE {
    struct NODE *next;
    int data;
};

void insertNode(struct NODE *target, int data){
    struct NODE *newNode = (struct NODE*)malloc(sizeof(struct NODE));
    newNode->next = target->next;
    newNode->data = data;
    target->next = newNode;
}

void removeNode(struct NODE *head, int data){
    struct NODE *currNode = head;
    while(currNode->next != NULL){
        if(currNode->next->data == data){
            struct NODE *tempNode = currNode->next;
            currNode->next = currNode->next->next;
            free(tempNode);
        }
        else
            currNode = currNode->next;
    }
}

int solution(int cmd[][2], int cmd_len) {
    struct NODE *head = (struct NODE*)malloc(sizeof(struct NODE)); //헤드 노드 생성
    head->next = NULL;
    
    for(int i = 0; i < cmd_len; i++){
        if(cmd[i][0] == INSERT)
            insertNode(head, cmd[i][1]);
        else if(cmd[i][0] == REMOVE)
            removeNode(head, cmd[i][1]);
    }
    
    int count = 0;
    struct NODE *currNode = head -> next;
    while (currNode != NULL){
        count += 1;
        currNode = currNode->next;
    }
    
    return count;
}

 

 

문제4

마방진이란 가로, 세로, 대각선 방향의 수를 더한 값이 모두 같은 정사각형 행렬입니다. 마방진에는 `1`부터 `정사각형 넓이`까지, 수가 하나씩 배치되어야 합니다. 아래는 가로, 세로, 대각선 방향의 수를 더한 값이 모두 344 x 4 마방진입니다.

 

![KakaoTalk_Photo_2018-09-15-17-58-10.png](https://grepp-programmers.s3.amazonaws.com/files/ybm/762ea16c04/303fdbe0-89ed-4f74-87b9-1ed047cf2c7c.png)

 

4 x 4 행렬의 두 빈칸을 채워 행렬을 마방진으로 완성하려 합니다. 빈칸은 0으로 표시합니다. 이를 위해 다음과 같이 프로그램 구조를 작성했습니다.

 

```

1. 두 빈칸의 위치를 찾습니다.

2. 숫자 1 ~ 16 중 존재하지 않는 숫자 2개를 찾습니다.

3. 첫 번째 빈칸에 작은 숫자를, 두 번째 빈칸에 큰 숫자를 넣어 행렬이 마방진이 되는지 검사합니다.

4-1. 마방진이라면 [작은 숫자의 행 번호, 작은 숫자의 열 번호, 작은 숫자, 큰 숫자의 행 번호, 큰 숫자의 열 번호, 큰 숫자]return 합니다.

4-2. 마방진이 아니라면 [큰 숫자의 행 번호, 큰 숫자의 열 번호, 큰 숫자, 작은 숫자의 행 번호, 작은 숫자의 열 번호, 작은 숫자]return 합니다.

```

 

4 x 4 크기 2차원 배열 matrix가 매개변수로 주어질 때, 이때 빈칸의 위치와 각 칸에 들어갈 수를 담은 배열을 return 하도록 solution 함수를 작성하려 합니다. 위 구조를 참고하여 코드가 올바르게 동작하도록 빈칸에 주어진 func_a, func_b, func_c 함수와 매개변수를 알맞게 채워주세요.

 

* 주어진 행렬은 빈칸을 채우면 반드시 마방진으로 완성할 수 있습니다.

 

---

 

#####매개변수 설명

 

2차원 배열 matrixsolution 함수의 매개변수로 주어집니다.

 

* matrix는 크기가 4 x 42차원 배열입니다.

* matrix에는 0이 반드시 두 개 들었습니다.

* matrix에는 1 이상 16 이하인 자연수 14개가 겹치지 않게 들었습니다.

 

---

#####return 값 설명

 

빈칸의 위치와 각 칸에 들어갈 수를 담은 배열을 return 해주세요.

 

---

#####예시

 

| matrix | return |

|--------|--------|

| [[16,2,3,13],[5,11,10,0],[9,7,6,12],[0,14,15,1]] | [4,1,4,2,4,8] |

 

#####예시 설명

 

예시 #1

 

![KakaoTalk_Photo_2018-09-15-18-01-27.png](https://grepp-programmers.s3.amazonaws.com/files/ybm/3228b4e06c/bc8300f8-1e7b-4c77-88a7-82f64f6a53bc.png)

 

위 그림에서 빈칸은 (4, 1)(2, 4)입니다. 각 칸에 48을 채우면 마방진이 완성됩니다. 따라서 [작은 숫자의 행 번호, 작은 숫자의 열 번호, 작은 숫자, 큰 숫자의 행 번호, 큰 숫자의 열 번호, 큰 숫자]return 해야 합니다. 답은 [4, 1, 4, 2, 4, 8]입니다.

 

![KakaoTalk_Photo_2018-09-15-18-01-27 (1).png](https://grepp-programmers.s3.amazonaws.com/files/ybm/07b49bd9cc/06b0e5b9-27ba-49e7-9782-089ca97cd15b.png)

 

 

문제소스코드

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

typedef struct {
    int first;
    int second;
} Pair;

const int n = 4;

int* func_a(int matrix[][4]) {
    int* ret = (int*)malloc(sizeof(int)*(2));
    int idx = 0;
    bool exist[n * n + 1] = {false};
    for (int i = 0; i < n; i++)
        for (int j = 0; j < n; j++)
                exist[matrix[i][j]] = true;
    for (int i = 1; i <= n * n; i++)
        if (exist[i] == false)
            ret[idx++] = i;
    return ret;
}

Pair* func_b(int matrix[][4]) {
    Pair* ret = (Pair*)malloc(sizeof(Pair)*(2));
    int idx = 0;
    for (int i = 0; i < n; i++)
        for (int j = 0; j < n; j++)
            if (matrix[i][j] == 0) {
                ret[idx].first = i;
                ret[idx++].second = j;
            }
    return ret;
}

bool func_c(int matrix[][4]) {
    int sum = 0;
    for (int i = 1; i <= n * n; i++)
        sum += i;
    sum = sum / n;
    for (int i = 0; i < n; i++) {
        int row_sum = 0;
        int col_sum = 0;
        for (int j = 0; j < n; j++) {
            row_sum += matrix[i][j];
            col_sum += matrix[j][i];
        }
        if (row_sum != sum || col_sum != sum)
            return false;
    }
    int main_diagonal_sum = 0;
    int skew_diagonal_sum = 0;
    for (int i = 0; i < n; i++) {
        main_diagonal_sum += matrix[i][i];
        skew_diagonal_sum += matrix[i][n-1-i];
    }
    if (main_diagonal_sum != sum || skew_diagonal_sum != sum)
        return false;
    return true;
}

int* solution(int matrix[][4]) {
    int* answer = (int*)malloc(sizeof(int) * 6);
    int ans_idx = 0;
    Pair* coords = func_@@@(@@@);
    int* nums = func_@@@(@@@);

    matrix[coords[0].first][coords[0].second] = nums[0];
    matrix[coords[1].first][coords[1].second] = nums[1];
    if (func_@@@(@@@)) {
        for (int i = 0; i <= 1; i++) {
            answer[ans_idx++] = coords[i].first + 1;
            answer[ans_idx++] = coords[i].second + 1;
            answer[ans_idx++] = nums[i];
        }
    }
    else {
        matrix[coords[0].first][coords[0].second] = nums[1];
        matrix[coords[1].first][coords[1].second] = nums[0];
        for (int i = 0; i <= 1; i++) {
            answer[ans_idx++] = coords[1-i].first + 1;
            answer[ans_idx++] = coords[1-i].second + 1;
            answer[ans_idx++] = nums[i];
        }
    }
    return answer;
}

// 아래는 테스트케이스 출력을 해보기 위한 main 함수입니다.
int main() {
    int matrix[4][4] = {{16,2,3,13},{5,11,10,0},{9,7,6,12},{0,14,15,1}};
    int* ret = solution(matrix);
    
    // [실행] 버튼을 누르면 출력 값을 볼 수 있습니다.
    printf("solution 함수의 반환 값은 {");
    for (int i = 0; i < 6; i++) {
        if (i != 0) printf(", ");
        printf("%d", ret[i]);
    }
    printf("} 입니다.\n");
}

 

정답소스코드

더보기

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

const int n = 4;

typedef struct {
    int first;
    int second;
} _pair;

int* find_not_exist_nums(int matrix[][n]) {
    int *nums = (int*)malloc(sizeof(int)*(2));
    int nums_n = 0;
    bool exist[n * n + 1] = {false};
    int i, j;
    for (i = 0; i < n; i++) {
        for (j = 0; j < n; j++) {
            if (matrix[i][j] != 0) {
                exist[matrix[i][j]] = true;
            }
        }
    }
    for (i = 1; i <= n * n; i++) {
        if (!exist[i]) {
            nums[nums_n++] = i;
        }
    }
    return nums;
}

_pair *find_blank_coords(int matrix[][n]) {
    _pair* coords = (_pair*)malloc(sizeof(_pair)*(2));
    int coords_n = 0;
    int i, j;
    for (i = 0; i < n; i++) {
        for (j = 0; j < n; j++) {
            if (matrix[i][j] == 0) {
                coords[coords_n].first = i;
                coords[coords_n++].second = j;
            }
        }
    }
    return coords;
}

bool is_magic_square(int matrix[][n]) {
    int i, j;
    int sum = 0;
    for (i = 1; i <= n * n; i++) {
        sum += i;
    }
    sum = sum / n;
    for (i = 0; i < n; i++) {
        int row_sum = 0;
        int col_sum = 0;
        for (j = 0; j < n; j++) {
            row_sum += matrix[i][j];
            col_sum += matrix[j][i];
        }
        if (row_sum != sum) {
            return false;
        }
        if (col_sum != sum) {
            return false;
        }
    }
    int main_diagonal_sum = 0;
    int skew_diagonal_sum = 0;
    for (i = 0; i < n; i++) {
        main_diagonal_sum += matrix[i][i];
        skew_diagonal_sum += matrix[i][n-1-i];
    }
    if (main_diagonal_sum != sum) {
        return false;
    }
    if (skew_diagonal_sum != sum) {
        return false;
    }
    return true;
}

int* solution(int matrix[][n]) {
    int* answer = (int*)malloc(sizeof(int) * 6);
    int ans_n = 0;

    _pair* coords = find_blank_coords(matrix);
    int* nums = find_not_exist_nums(matrix);

    matrix[coords[0].first][coords[0].second] = nums[0];
    matrix[coords[1].first][coords[1].second] = nums[1];
    if (is_magic_square(matrix)) {
        for (int i = 0; i <= 1; i++) {
            answer[ans_n++] = coords[i].first + 1;
            answer[ans_n++] = coords[i].second + 1;
            answer[ans_n++] = nums[i];
        }
    }
    else {
        matrix[coords[0].first][coords[0].second] = nums[1];
        matrix[coords[1].first][coords[1].second] = nums[0];
        for (int i = 0; i <= 1; i++) {
            answer[ans_n++] = coords[1-i].first + 1;
            answer[ans_n++] = coords[1-i].second + 1;
            answer[ans_n++] = nums[i];
        }
    }
    return answer;
}

 

문제7

직사각형의 왼쪽 아래 꼭지점의 좌표, 오른쪽 위꼭지점의 좌표가 주어집니다. 이때 오른쪽 위 꼭지점의 좌표를 x축 방향으로 plus_x만큼, y축 방향으로 plus_y만큼 이동했을 때 사각형의 넓이가 얼마나 증가하는지 구하려 합니다.

 

먼저 좌표평면 위의 한 점을 나타내는 구조체 Point2D와 직사각형을 나타내는 구조체 Rectangle 을 다음과 같이 정의했습니다.

 

typedef struct Point2D {

int x;

int y;

}Point2D;

 

 

typedef struct Rectangle{

Point2D* LeftDown;

Point2D* RightUp;

}Rectangle;

 

 

또한, 직사각형 넓이가 얼마나 커졌는지 구하기 위해 다음과 같이 프로그램 구조를 작성했습니다.

 

 

1. 점과 직사각형을 나타내는 변수를 생성 및 초기화 합니다.

2. 1단계에서 만든 직사각형의 넓이 first_width를 구합니다.

3. 직사각형의 오른쪽 위 꼭지점의 좌표를 주어진 값(plus_x, plus_y) 만큼 이동합니다.

4. 좌표를 이동한 후 직사각형의 넓이 second_width를 구합니다.

5. 4단계에서 구한 직사각형의 넓이 second_width에서 2단계에서 구한 직사각형의 넓이 first_width를 뺀 값을 return 합니다.

 

 

직사각형의 왼쪽 아래 꼭지점의 x좌표 x1, y좌표 y1, 직사각형의 오른쪽 위 꼭지점의 x좌표 x2, y좌표 y2, x축 방향으로 꼭지점을 이동시킨 거리 plus_x, y축 방향으로 꼭지점을 이동시킨 거리 plus_y가 매개변수로 주어질 때, 꼭지점을 이동시킨 후 직사각형의 넓이가 얼마나 커졌는지 return 하도록 solution 함수를 작성하려 합니다. 위 구조를 참고하여 코드가 올바르게 동작할 수 있도록 빈칸을 채워 전체 코드를 완성해주세요.

 

매개변수 설명

 

직사각형의 왼쪽 아래 꼭지점의 x좌표 x1, y좌표 y1, 직사각형의 오른쪽 위 꼭지점의 x좌표 x2, y좌표 y2, x축 방향으로 꼭지점을 이동시킨 거리 plus_x, y축 방향으로 꼭지점을 이동시킨 거리 plus_ysolution 함수의 매개변수로 주어집니다.

 

* x1, y1, x2, y2, plus_x, plus_y는 각각 1 이상 100 이하의 자연수입니다.

* x1 < x2, y1 < y2인 경우만 입력으로 주어집니다.

 

return 값 설명

 

꼭지점을 이동시킨 후 직사각형의 넓이가 얼마나 커졌는지 return해주세요.

 

예시

| x1 | y1 | x2 | y2 | plus_x | plus_y | return |

|----|----|----|----|--------|--------|--------|

| 1 | 1 | 5 | 5 | 2 | 1 | 14 |

 

 

예시 설명

 

![rectangle.png](https://grepp-programmers.s3.amazonaws.com/files/ybm/c5e68e4e61/c6a5c3b6-bc52-4160-b6a9-ed6c19fb7ce4.png)

 

* 직사각형 왼쪽 아래 꼭지점 좌표 : (1, 1)

* 직사각형 오른쪽 위 꼭지점 좌표 : (5, 5)

 

따라서 첫 번째 사각형의 넓이는 4 x 4 = 16 입니다.

 

오른쪽 위 꼭지점의 좌표를 x축으로 2 만큼, y 축으로 1 만큼 이동 하면 오른쪽 위 꼭지점의 좌표는 (7, 6)이 됩니다.

 

따라서 두 번째 사각형의 넓이는 6 x 5 = 30 이 되며, 두 사각형의 넓이 차이 30 - 16 = 14return 하면 됩니다.

 

 

문제소스코드

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

typedef struct Point2D {
    int x;
    int y;
}Point2D;

typedef struct Rectangle{
    Point2D* LeftDown;
    Point2D* RightUp;
}Rectangle;

int solution(int x1, int y1, int x2, int y2, int plus_x, int plus_y){
    Point2D leftdown = {@@@};
    Point2D rightup = {@@@};
    Rectangle rect = {@@@};
    
    int first_width = (rect@@@ - rect@@@) * (rect@@@ - rect@@@);
    
    rightup.x += plus_x;
    rightup.y += plus_y;
    
    int second_width = (rect@@@ - rect@@@) * (rect@@@ - rect@@@);
    
    return second_width - first_width;
}

 

정답소스코드

더보기

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

typedef struct Point2D {
    int x;
    int y;
}Point2D;

typedef struct Rectangle{
    Point2D* LeftDown;
    Point2D* RightUp;
}Rectangle;

int solution(int x1, int y1, int x2, int y2, int plus_x, int plus_y){
    Point2D leftdown = {x1, y1};
    Point2D rightup = {x2, y2};
    Rectangle rect = {&leftdown, &rightup};
    
    int first_width = (rect.RightUp->x - rect.LeftDown->x) * (rect.RightUp->y - rect.LeftDown->y);
    
    rightup.x += plus_x;
    rightup.y += plus_y;
    
    int second_width = (rect.RightUp->x - rect.LeftDown->x) * (rect.RightUp->y - rect.LeftDown->y);
    
    return second_width - first_width;
}

 

 

문제10
피자별 크기와 가격이 주어질 때, 가장 큰 피자의 크기와 가장 싼 피자의 가격을 찾으려 합니다(단, 크기가 같은 피자나 가격이 같은 피자는 없다고 가정합니다). 이를 위해 다음과 같이 구조체를 정의했습니다.


typedef struct Pizza {
    int size;
    int price;
}Pizza;


또한 다음과 같이 프로그램 구조를 작성했습니다.


1. 피자의 크기와 가격으로 구성된 구조체 배열을 생성 및 초기화합니다.
2. 생성한 구조체 배열을 크기의 내림차순으로 정렬합니다.
3. 정렬한 구조체 배열에서 1번째에 있는 피자의 크기를 answer 배열의 첫번째 원소에 담습니다.
4. 구조체 배열을 가격의 오름차순으로 정렬합니다.
5. 정렬한 구조체 배열에서 1번째에 있는 피자의 크기를 answer 배열의 두번째 원소에 담습니다.


피자별 크기를 담은 배열 size와 size의 길이 size_len, 피자별 가격을 담은 배열 price와 price의 길이 price_len이 매개변수로 주어질 때, 가장 큰 피자의 크기와 가장 싼 피자의 가격을 배열에 담아 return 하도록solution 함수를 작성하려 합니다. 위 구조를 참고하여 코드가 올바르게 동작할 수 있도록 빈칸을 채워 전체 코드를 완성해주세요.

매개변수 설명
피자별 크기를 담은 배열 size와 size의 길이 size_len, 피자별 가격을 담은 배열 price와 price의 길이 price_len가 solution 함수의 매개변수로 주어집니다.

* size_len과 price_len은 항상 같으며 3 이상 100 이하인 자연수입니다.
* 피자 크기는 1 이상 100 이하인 자연수입니다.
* 피자 가격은 1 이상 100 이하인 자연수입니다.
* 피자들의 크기와 가격은 서로 다릅니다.

return 값 설명
가장 큰 피자의 크기와 가장 싼 피자의 가격을 배열에 담아 return 합니다.

예제

| size          | size_len | price     | price_len | return  |
|------------------|----------|--------------|-----------|---------|
| [10, 20, 30, 40] | 4     | [3, 1, 5, 4] | 4      | [40, 1] |

예제 설명

크기를 기준으로 정렬하면 [40, 30, 20, 10] 이 됩니다.
가격을 기준으로 정렬하면 [1, 3, 4, 5] 가 됩니다.
따라서 [40, 1] 을 return 합니다.

문제소스코드

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

typedef struct Pizza {
    int size;
    int price;
}Pizza;

int compare_a(const void *a, const void *b) {
    Pizza first = *(Pizza *)a;
    Pizza second = *(Pizza *)b;
    if(@@@)
        return -1;
    else if(@@@)
        return 1;
    else
        return 0;
}

int compare_b(const void *a, const void *b) {
    Pizza first = *(Pizza *)a;
    Pizza second = *(Pizza *)b;
    if(@@@)
        return -1;
    else if(@@@)
        return 1;
    else
        return 0;
}

int* solution(int size[], int size_len, int price[], int price_len) {
    int* answer = (int *)malloc(sizeof(int) * 2);

    int len = size_len;
    Pizza* pizzas = (Pizza *)malloc(sizeof(Pizza) * len);

    for(int i = 0; i < len; i++) {
        pizzas[i].size = size[i];
        pizzas[i].price = price[i];
    }  

    qsort(pizzas, len, sizeof(Pizza), compare_a);
    answer[0] = @@@;

    qsort(pizzas, len, sizeof(Pizza), compare_b);
    answer[1] = @@@;

    return answer;
}

// 아래는 테스트케이스 출력을 해보기 위한 main 함수입니다.
int main() {
    int size[] = {10, 20, 30, 40};
    int size_len = 4;
    int price[] = {3, 1, 5, 4};
    int price_len = 4;
    int* ret = solution(size, size_len, price, price_len);

    // [실행] 버튼을 누르면 출력 값을 볼 수 있습니다.
    printf("solution 함수의 반환 값은 {%d, %d} 입니다.\n", ret[0], ret[1]);
}

 

정답소스코드

더보기

#include <stdio.h>

#include <stdbool.h>

#include <stdlib.h>

 

typedef struct Pizza {

   int size;

    int price;

}Pizza;

 

int compare_a(const void *a, const void *b) {

    Pizza first = *(Pizza *)a;

    Pizza second = *(Pizza *)b;

    if(first.size > second.size)

        return -1;

    else if(first.size < second.size)

        return 1;

    else

       return 0;

}

 

int compare_b(const void *a, const void *b) {

    Pizza first = *(Pizza *)a;

    Pizza second = *(Pizza *)b;

    if(first.price < second.price)

        return -1;

    else if(first.price > second.price)

        return 1;

    else

        return 0;

}

 

int* solution(int size[], int size_len, int price[], int price_len) {

    int* answer = (int *)malloc(sizeof(int) * 2);

 

    int len = size_len;

    Pizza* pizzas = (Pizza *)malloc(sizeof(Pizza) * len);

 

    for(int i = 0; i < len; i++) {

        pizzas[i].size = size[i];

        pizzas[i].price = price[i];

    }

 

    qsort(pizzas, len, sizeof(Pizza), compare_a);

    answer[0] = pizzas[0].size;

 

    qsort(pizzas, len, sizeof(Pizza), compare_b);

    answer[1] = pizzas[0].price;

 

    return answer;

}