공대생의 비망록

[Google Code Jam][Qualification Round 2022] 3D Printing C++ 풀이 본문

Programming Language/C, C++

[Google Code Jam][Qualification Round 2022] 3D Printing C++ 풀이

myungsup1250 2022. 4. 3. 16:34

취업 준비를 위해 Problem Solving 스킬을 연마하기 위해 관련 오픈 채팅방에 들어가 정보를 기웃거리던 차,

다양한 PS 스킬 챌린지가 있음을 알게 되었고, 100점 만점에 30점만 받아도 티셔츠 한 장은 준다길래 준비도 없이

Code Jam 이라는 챌린지에 참여하였다. Google에서 운영하는 프로그램이고 전세계의 많은 사람들이 참여하는 행사라고 한다.

구글에서 가장 길게 운영한 코딩 대회 Code Jam

실력과 준비 부족으로 많이 풀지는 못했지만 그래도 기록을 위해 남겨본다.

 

문제 링크 및 출처 : Google Code Jam

Swift로 아무리 시도해도 안되길래 C++로 바꾸어 풀었더니 바로 해결... 결론은 실패

2번 문제는 3D Printing 이다. D를 3개 출력한다나 어쩐다나... 일종의 말장난 같다.

결과적으로 말하면 Swift 언어로 시도했다가 같은 로직을 C++로 작성해 성공했다.

하지만 1분 차이로 Qualification Round는 종료... Swift 이럴거야...?

Swift 코드 확인하려면 여기에서...

 

풀이

각 테스트케이스마다 3개의 프린터가 있고, 각 프린터마다 4개의 잉크 양을 입력받는다.

Cyan, Magenta, Yellow, Black 잉크의 양은 모두 음이 아닌 정수이며

3개의 프린터가 정확히 1,000,000 단위 만큼의 잉크만 사용하여 같은 색상의 a single D를 출력할 수 있는 지 여부를 계산하면 된다.

 

테스트케이스 1을 예로 들면,

1번 프린터가 300000, 200000, 300000, 500000

2번 프린터가 300000, 200000, 500000, 300000

3번 프린터가 300000, 500000, 300000, 200000

만큼의 C, M, Y, K 잉크를 가지고 있다고 하면,

1번 프린터 기준 Cyan, Magenta, Yellow 잉크는 모두 사용하고

Black 잉크는 3번 프린터의 최대 보유량이자, 목표 사용량인 1,000,000에 도달할 만큼인 200,000만 사용한다.

그래서 답은 300000 200000 300000 20000가 된다고 하는데...

 

요점만 이야기하자면, 3개 프린터의 각 색상마다의 최소 보유량을 구해서 if문 몇개만 거치면 답을 구할 수 있다.

1. 잉크 최소 보유량이 최대 사용량 이상인가? (minInk >= 1000000)

그렇다면 최대 사용량 만큼만 쓴다

2. 사용가능한 잉크량이 잉크 최소 보유량 이하인가? (sum <= minInk)

그렇다면 사용가능한 잉크량만큼만 잉크를 사용한다.

 

그 이후에는 사용할 잉크 양만큼 사용가능한 잉크 양에서 제하고 (sum -= minInk)

사용한 잉크 양을 기록해둔다.

 

4개 잉크에 대해 같은 작업을 수행한 후 목표량 만큼만 사용했다면 성공한 것이며

사용한 잉크량을 출력한다.

그렇지 않으면 실패한 것이므로

IMPOSSIBLE을 출력하면 된다.

 

설명이 좀 어려운 것 같기도 한데, 코드를 읽어보면 이해하게 될 것이다.

풀이 끝!

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
38
39
40
41
42
43
44
45
46
47
#include <stdio.h>
 
int const GOAL = 1000000;
int const NUM_PRINTERS = 3;
int const NUM_INKS = 4;
 
int min(int a, int b, int c) {
    int tmp = a > b ? b : a;
    return tmp > c ? c : tmp;
}
 
int main() {
    int testcase = 0, NUM_TESTCASE = -1;
    scanf("%d"&NUM_TESTCASE);
    while (testcase <= NUM_TESTCASE) {
        int results[NUM_INKS] = {0, }, sum = GOAL, arr[NUM_PRINTERS][NUM_INKS] = {0, };
        for (int i = 0; i < NUM_PRINTERS; i++) {
            for (int j = 0; j < NUM_INKS; j++) {
                scanf("%ld"&arr[i][j]);
            }
        }
        int i = 0;
        int minInks[NUM_INKS] = {min(arr[0][0], arr[1][0], arr[2][0]), min(arr[0][1], arr[1][1], arr[2][1]), min(arr[0][2], arr[1][2], arr[2][2]), min(arr[0][3], arr[1][3], arr[2][3])};
        while (sum != 0 && i < NUM_INKS) {
            if (minInks[i] >= GOAL) {
                minInks[i] = GOAL;
            }
            if (sum <= minInks[i]) {
                minInks[i] = sum;
            }
            sum -= minInks[i];
            results[i] = minInks[i];
            i++;
        }
        printf("Case #%d: ", testcase + 1);
        if (sum == 0) {
            for (i = 0; i < NUM_INKS; i++) {
                printf("%ld ", results[i]);
            }
        } else {
            printf("IMPOSSIBLE");
        }
        printf("\n");
        testcase++;
    }
    return 0;
}
cs

 

Comments