Patrick's Devlog

[SWEA/C++] 자기 방으로 돌아가기(4408번) 본문

Study/Algorithms Practice

[SWEA/C++] 자기 방으로 돌아가기(4408번)

Patrick_ 2022. 7. 26. 15:51

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