본문 바로가기

DEVELOP/Algorithm

[C] SW Expert Academy 문제풀이 :: 5431번

반응형


SW Expert Academy 민석이의 과제 체크하기 문제풀이. 공교롭게도 처음 푼 레벨3 문제 2개가 모두 쉬웠다. 자신감을 더욱 상승시켜준 문제. 꾸준히 준비하면 삼성 역량 테스트도 충분히 도전해볼만 하겠다.



문제


https://swexpertacademy.com/main/code/problem/problemDetail.do?contestProbId=AWVl3rWKDBYDFAXm&categoryId=AWVl3rWKDBYDFAXm&categoryType=CODE


과제를 제출하지 않은 사람의 번호를 오름차순으로 출력하는 프로그램을 작성하라.



풀이


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
#include <stdio.h>
#include <malloc.h>
 
int main() {
    int tc;
    scanf("%d"&tc);
 
    for (int t = 0; t < tc; t++) {
        int n, k;
        scanf("%d %d"&n, &k);
 
        int* students;
        students = (int*)malloc(sizeof(int)*n);
        for (int i = 0; i < n; i++) {
            students[i] = '\0';
        }
 
        int* submitter;
        submitter = (int*)malloc(sizeof(int)*k);
        for (int i = 0; i < k; i++) {
            scanf("%d"&submitter[i]);
        }
        for (int i = 0; i < k; i++) {
            students[submitter[i]-1= submitter[i];
        }
 
        printf("#%d ", t + 1);
        for (int i = 0; i < n; i++) {
            if (students[i] == NULL) {
                printf("%d ", i+1);
            }
        }
        printf("\n");
    }
 
    return 0;
}
cs


먼저 1번부터 n번까지 학생의 명단을 의미하는 students 배열을 동적할당으로 만들어준다. 각 요소는 null 값으로 초기화해준다.


과제를 제출한 학생의 명단인 submitter를 동적할당으로 k 크기만큼 만든다. for문을 돌려 학생의 번호를 입력받는다. 을 입력받는다.


k만큼 루프를 돌려 students 명단의 제출한 학생의 위치를 제출한 학생 번호로 채워준다. 학생 번호가 4면 students내에서의 인덱스는 3이다(0,1,2,3). 그러니 students[submitter[i]-1] = submitter[i]가 된다. 사실 students에 입력될 값은 null만 아니면 된다. 1이 더 깔끔하겠다.


그럼 students 명단에서 제출한 학생 번호의 인덱스는 어떤 값이 들어가 있을 것이고 제출하지 않은 학생 번호의 인덱스는 여전히 null일 것이다. 예를 들어 5명의 학생 중 2,4번이 제출했다면 null, 2, null, 5, null이 인덱스 0,1,2,3,4에 각각 들어가 있을 것이다.


그럼 다시 students를 루프 돌려서 배열 요소 하나씩 접근한다. 인덱스의 값이 null 이면 인덱스+1을 출력하면 그게 제출 안 한 학생의 번호다.


루프를 돌려 i=0부터 증가하므로 자연스럽게 오름차순으로 출력된다.

반응형