일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 |
- 하늘과 바람과 별과 시
- 하늘과 바람과 별과 詩
- nestedlists
- Qualification Round
- 3D PRINTING
- on-prem
- 2022
- Code Jam
- 프로그래머스
- Python
- 코딩테스트
- openebs
- 방통대 대학원 정보과학과
- ESXi 업데이트
- hackerrank
- GitLab
- MySQL
- 파이썬
- swift
- 방송통신대학교 대학원 정보과학과
- secondlowestgrade
- Code Jam 2022
- ingress-nginx
- LEVEL 2
- C++
- 정보과학과
- Kubernetes
- 해커랭크
- K8S
- Today
- Total
공대생의 비망록
[Google Code Jam][Qualification Round 2022] 3D Printing C++ 풀이 본문
[Google Code Jam][Qualification Round 2022] 3D Printing C++ 풀이
myungsup1250 2022. 4. 3. 16:34취업 준비를 위해 Problem Solving 스킬을 연마하기 위해 관련 오픈 채팅방에 들어가 정보를 기웃거리던 차,
다양한 PS 스킬 챌린지가 있음을 알게 되었고, 100점 만점에 30점만 받아도 티셔츠 한 장은 준다길래 준비도 없이
Code Jam 이라는 챌린지에 참여하였다. Google에서 운영하는 프로그램이고 전세계의 많은 사람들이 참여하는 행사라고 한다.
실력과 준비 부족으로 많이 풀지는 못했지만 그래도 기록을 위해 남겨본다.
문제 링크 및 출처 : Google Code Jam
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 |
'Programming Language > C, C++' 카테고리의 다른 글
[C++] map 컨테이너에 데이터 추가하기 insert()? [] 연산자? (0) | 2022.05.03 |
---|---|
[프로그래머스][Lv. 2] 124 나라의 숫자 C++ 풀이 (0) | 2022.04.17 |
[프로그래머스][Lv. 1] 같은 숫자는 싫어 C++ 풀이 (0) | 2022.03.14 |
[프로그래머스][Lv. 1] 폰켓몬 C++ 풀이 (0) | 2022.03.14 |
[프로그래머스][Lv. 1] 완주하지 못한 선수 C++ 풀이 (0) | 2022.03.14 |