일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 |
- level3
- LEVEL2
- 3D RPG
- effective C++
- knapsack Problem
- Silver
- Gold
- binary search
- PrefixSum
- stack
- algorithm
- 8-Puzzle
- programmers
- Euclidean
- Modern C++
- BOJ
- BFS
- dirtyflag pattern
- level1
- Flyweight Pattern
- solid 원칙
- Bronze
- SWEA
- Project
- Unity
- trie
- two pointer
- 프로그래머스
- Zenject
- 프로세스 상태
- Today
- Total
Patrick's Devlog
[SWEA/C++] 자기 방으로 돌아가기(4408번) 본문
1. 문제 개요
https://swexpertacademy.com/main/code/problem/problemDetail.do?contestProbId=AWNcJ2sapZMDFAV8
SW Expert Academy
SW 프로그래밍 역량 강화에 도움이 되는 다양한 학습 컨텐츠를 확인하세요!
swexpertacademy.com
※ 본 문제는 SW Expert 아카데미의 문제이므로 무단으로 복제 X
1-1. 설명
수련회에 간 학생들은 밤 12시가 되자 조교들의 눈을 피해 자기 방으로 돌아가려 한다. 최단 시간에 모든 학생이 자신의 방으로 돌아가야 한다. 여기서 복도의 구간이 겹치면 동시에 이동할 수 없으므로, 기다렸다가 이동해야 한다. 이동은 거리에 상관없이 단위 시간이 걸린다. 최소 몇 단위시간만에 모든학생들이 이동할 수 있는지 출력하는 프로그램을 구현한다.
1-2. 제한 사항
- 10개 이하의 테스트 케이스로 이루어져 있으며, 테스트 수는 첫 줄에 입력
- 각 테스트 케이스 첫 줄에는 학생들의 수 N이 주어짐
- 다음 N 줄에는 각 학생의 현재 방번호, 돌아가야할 방 번호가 주어짐(중복 X)
2. 구현
2-1. 풀이
처음에는 문제를 제대로 읽지 않아, 숫자가 겹치는 부분만 count를 올려서 진행하였다. 문제를 제대로 읽고 댓글을 유심히 살펴보니 홀,짝 기준으로 1~200으로 통일 시켜 중복되는 부분을 찾아주면 된다고 적혀있어 그렇게 진행하였다. 여기서 또 주의해야 할 점은 400->1로 가는 경우처럼 큰 번호에서 작은 번호로 가는 경우도 신경써줘야 한다. 숫자를 입력받을 때 큰 번호에서 작은 번호로 가는 경우는 start와 end 위치를 바꿔주었으며, 복도를 기준으로 겹치는 수를 count하는 countNum 배열을 선언하여 반복문을 돌리며 +1을 해주고 제일 큰 값을 뽑아 출력해주었다.
2-2. 코드
#include <iostream>
#include <cstring>
using namespace std;
constexpr size_t MAX_NUM = 1000;
int startRoom[MAX_NUM] = { 0 };
int endRoom[MAX_NUM] = { 0 };
int countNum[201] = { 0 }; // 복도에서 겹치는 수 count
int maxNum();
int main() {
ios_base::sync_with_stdio(false);
cin.tie(NULL);
int T, N, start, end;
cin >> T;
for (int test_case = 1; test_case <= T; ++test_case) {
cin >> N;
memset(countNum, 0, sizeof(countNum));
for (int i = 0; i < N; i++) {
cin >> start >> end;
if (start > end) {
startRoom[i] = (end / 2) + (end % 2);
endRoom[i] = (start / 2) + (start % 2);
}
else {
startRoom[i] = (start / 2) + (start % 2);
endRoom[i] = (end / 2) + (end % 2);
}
}
for (int i = 0; i < N; i++) {
int curStart, curEnd;
curStart = startRoom[i];
curEnd = endRoom[i];
for (int j = curStart; j <= curEnd; j++) {
countNum[j] += 1;
}
}
int result = maxNum();
cout << '#' << test_case << ' ' << result << "\n";
}
}
int maxNum() {
int num = 0;
for (int i = 0; i < 200; i++) {
if (countNum[i] > num) num = countNum[i];
}
return num;
}
'Algorithm > Algorithms Practice' 카테고리의 다른 글
[SWEA/C++] 사탕분배(13736번) (0) | 2022.08.21 |
---|---|
[SWEA/C++] 파핑파핑 지뢰 찾기(1868번) (0) | 2022.08.10 |
[SWEA/C++] 공통조상(1248번) (0) | 2022.07.25 |
[SWEA/C++] 암호문3(1230번) (0) | 2022.07.20 |
[BOJ/C++] 중복 빼고 정렬하기(10867번) (0) | 2022.07.14 |