항해 99클럽 코테

99클럽 코테 스터디 8일차 TIL

metamong-data 2024. 11. 4. 15:19
728x90
반응형

오늘의 학습 키워드

> 해시

과제

문제

군대에 간 푸앙이는 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`”를 출력한다. 단, 아무도 근무하지 않을 경우 공평한 것으로 간주한다.

풀이 과정

  1. 입력 받을 주를 input으로 입력 받고
  2. time Dict를 생성 한다
  3. 4교대 이기에 주에 * 4를 한다
  4. 받은 입력을 잘라서 이름이 있으면 + 해주고 없으면 새로 dict에 정의해 준다
  5. 계산 후 제일 큰 수와 작은 수가 12시간 이상 차이 나는지 비교 해서 "Yes", "No"를 print하고
  6. 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


#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;  

}
```

오늘의 회고

- 문제를 이해하는데 너무 오래 걸려서 시간 안에 해결하지 못 한 것 같다.
- 변수의 초기화를 잘 해주고, 문제를 여러 유형을 잘 이해하기 위해 복습을 해야 할 것 같다.

출처 : https://www.acmicpc.net/problem/25593

728x90