알고리즘/BOJ

백준 14653번 너의 이름은

꾸준함. 2018. 8. 8. 17:56

문제 링크입니다: https://www.acmicpc.net/problem/14653


기본적으로 Q번째 톡을 읽은 사람들은 1 ~ (Q - 1)번째 톡도 읽었다는 것이 핵심인 문제였습니다.


알고리즘은 아래와 같습니다.

1. Q 번째 톡을 안 읽은 사람이 0명이면 전원 읽었으므로 -1을 출력합니다.

2. 1번의 경우가 아니라면 Q 번째 톡을 안 읽은 사람과 같거나 적은 톡을 보낸 사람들은 Q번째 톡을 읽은 사람이기 때문에 Read에 표시를 합니다.

3. Read에 표시되어 있지 않은 사람들을 출력합니다.


*기존에 Read 함수를 read로 정의했다가 read 라는 이름을 가진 unix system call 함수랑 충돌해서 런타임 에러가 발생했었습니다.


#include <iostream>

using namespace std;

 

const int MAX = 10000 + 1;

 

int N, K, Q;

pair<int, char> arr[MAX];

bool Read[26];

 

int main(void)

{

        ios_base::sync_with_stdio(0);

        cin.tie(0); //cin 실행속도 향상

        cin >> N >> K >> Q;

 

        for (int i = 1; i <= K; i++)

                 cin >> arr[i].first >> arr[i].second;

       

        int unRead = arr[Q].first;

 

        if (!unRead)

                 cout << -1 << "\n";

        else

        {

                 //안 읽은 사람 옆에 있는 숫자가 unRead보다 작을 수는 없다

                 for (int i = 1; i <= K; i++)

                         if (unRead <= arr[i].first)

                         {

                                 int idx = arr[i].second - 'A';

                                 Read[idx] = true;

                         }

 

                 //읽지 않은 친구들 출력

                 //A는 항상 읽었다

                 for (int i = 1; i < N; i++)

                         if (!Read[i])

                                 cout << char(i + 'A') << " ";

                 cout << "\n";

        }

        return 0;

}


개발환경:Visual Studio 2017


지적, 조언, 질문 환영입니다! 댓글 남겨주세요~

반응형