오늘의 학습 키워드
> 해시
과제
문제
군대에 간 푸앙이는 4교대 근무를 서게 된다. 근무 시간대는 08:00
12:00, 12:00
18:00, 18:00
22:00, 22:00
08:00 으로 각각 4, 6, 4, 10시간의 근무로 구성되어 있다.
푸앙이와 동기들은 근무 시간이 최대한 공평하게 배분되기를 원한다. 그래서 근무표 전체에서 각 인원의 근무 시간이 12시간 이하로 차이 나게 해서 최대 50주 치 근무표를 짜려고 한다.
푸앙이는 원래 똑똑해서 이 정도는 한눈에 계산이 가능했지만 어째서인지 푸앙이는 계산이 불가능해졌다. 푸앙이를 위해서 대신 근무표가 공평한지 계산해주자.
입력
첫 번째 줄에 주의 개수인 N$N$이 입력된다. (1≤N≤50)$(1 \leq N \leq 50)$
둘째 줄부터 근무표가 주어진다. 각 주는 4개의 줄로 표현되며, 그중 첫째 줄은 각 날의 08:00
12:00에 근무하는 사람의 이름 또는 '-', 둘째 줄은 12:00
18:00, 셋째 줄은 18:00
22:00, 넷째 줄은 22:00
08:00을 나타낸다. '-'는 근무자가 없음을 의미한다. 근무자의 이름은 모두 알파벳 소문자로 이루어져 있고 20글자를 넘지 않는다.
각 날에는 4개의 시간대에 모두 근무자가 있거나 모두 근무자가 없다. 예를 들어 12:00~18:00에만 근무자가 있는 날은 없다.
근무표에 적히지 않은 근무자는 없으며, 근무자 수는 최대 100$100$명이다.
출력
근무표가 공평하면 “`Yes`”를 아니면 “`No`”를 출력한다. 단, 아무도 근무하지 않을 경우 공평한 것으로 간주한다.
풀이 과정
- 입력 받을 주를 input으로 입력 받고
- time Dict를 생성 한다
- 4교대 이기에 주에 * 4를 한다
- 받은 입력을 잘라서 이름이 있으면 + 해주고 없으면 새로 dict에 정의해 준다
- 계산 후 제일 큰 수와 작은 수가 12시간 이상 차이 나는지 비교 해서 "Yes", "No"를 print하고
- peoples에 비어 있을 경우 "Yes"를 출력한다.
제출 코드 (python)
```python
num = int(input())
time = {"0":4, "1":6, "2":4,"3":10}
peoples = {}
for i in range(num*4):
name = input().split()
for j in range(len(name)):
timeSlot = i%4
if name[j] == '-':
continue
elif name[j] in peoples:
peoples[name[j]] += time[str(timeSlot)]
else:
peoples[name[j]] = time[str(timeSlot)]
if peoples:
if (max(peoples.values()) - min(peoples.values())) <= 12:
print("Yes")
else:
print("No")
else:
print("Yes")
```
다른 언어로 문제 풀기
**GO 언어**
```go
package main
import (
"bufio"
"fmt"
"os"
"strings"
)
func main() {
var num int
fmt.Scan(&num)
time := map\[int\]int{
0: 4,
1: 6,
2: 4,
3: 10,
}
peoples := make(map\[string\]int)
scanner := bufio.NewScanner(os.Stdin)
for i := 0; i < num\*4; i++ {
if scanner.Scan() {
names := strings.Fields(scanner.Text())
timeSlot := i % 4
for \_, name := range names {
if name == "-" {
continue
}
peoples\[name\] += time\[timeSlot\]
}
}
}
if len(peoples) == 0 {
fmt.Println("Yes")
return
}
minVal := -1
maxVal := -1
for \_, v := range peoples {
if minVal == -1 || v < minVal {
minVal = v
}
if maxVal == -1 || v > maxVal {
maxVal = v
}
}
if maxVal-minVal <= 12 {
fmt.Println("Yes")
} else {
fmt.Println("No")
}
}
```
**C++**
```cpp
#include
#include
#include
using namespace std;
int main() {
int num;
cin >> num;
cin.ignore();
map<int, int> time = {
{0, 4},
{1, 6},
{2, 4},
{3, 10}
};
map<string, int> peoples;
string line;
for (int i = 0; i < num \* 4; i++) {
getline(cin, line);
stringstream ss(line);
string name;
int timeSlot = i % 4;
while (ss >> name) {
if (name == "-") continue;
peoples\[name\] += time\[timeSlot\];
}
}
if (peoples.empty()) {
cout << "Yes" << endl;
return 0;
}
int minVal = INT\_MAX;
int maxVal = INT\_MIN;
for (const auto& pair : peoples) {
minVal = min(minVal, pair.second);
maxVal = max(maxVal, pair.second);
}
if (maxVal - minVal <= 12) {
cout << "Yes" << endl;
} else {
cout << "No" << endl;
}
return 0;
}
```
오늘의 회고
- 문제를 이해하는데 너무 오래 걸려서 시간 안에 해결하지 못 한 것 같다.
- 변수의 초기화를 잘 해주고, 문제를 여러 유형을 잘 이해하기 위해 복습을 해야 할 것 같다.
'항해 99클럽 코테' 카테고리의 다른 글
99클럽 코테 스터디 10일차 TIL (3) | 2024.11.06 |
---|---|
99클럽 코테 스터디 9일차 TIL (4) | 2024.11.05 |
99클럽 코테 스터디 7일차 TIL (3) | 2024.11.03 |
99클럽 코테 스터디 6일차 TIL (1) | 2024.11.02 |
99클럽 코테 스터디 5일차 TIL (0) | 2024.11.01 |