코딩톡

JunHyeok Seo·2025년 4월 4일

algorithm

목록 보기
18/30

문제 개요

N명의 사람들이 채팅방에서 메시지를 주고받는다.
메시지를 보낼 때마다 그 시점에서 메시지를 읽지 않은 사람의 수 u[i]가 주어진다.
p번째 메시지를 기준으로 누가 이 메시지를 읽지 않았는지 판단해야 한다.

주요 입력

  • N: 사람 수 (1 ≤ N ≤ 26, A~Z로 이름 지정)
  • M: 메시지 수 (1 ≤ M ≤ 100)
  • p: 기준 메시지 인덱스 (1-based)

각 메시지:

  • c[i]: 보낸 사람 (대문자 알파벳)
  • u[i]: 해당 메시지를 읽지 않은 사람 수

핵심 해석

  1. 메시지를 보냈다는 것은 그 이전의 메시지를 모두 읽었다는 의미로 해석한다.
  2. 따라서 메시지 번호가 증가할수록 u[i] 값은 감소하거나 유지되어야 한다.
  3. u[j] > u[p - 1]이라면, 반드시 j > p - 1이어야 한다.
  4. 이 조건을 통해 p 이후에 메시지를 보낸 사람은 반드시 p번 메시지를 읽은 것으로 간주할 수 있다.
  5. 따라서 u[j] >= u[p - 1]이고, 메시지를 보낸 사람이 특정 인물이라면 그 사람은 p번 메시지를 읽었다고 확정할 수 있다.

코드 요약

for (int i = 0; i < n; i++) {
    char person = (char)((int)'A' + i);
    boolean read = false;

    for (int j = 0; j < m; j++) {
        if (u[j] >= u[p - 1] && c[j] == person)
            read = true;
    }

    if (!read)
        System.out.print(person + " ");
}

코드 핵심 로직

  • p번째 메시지를 기준으로 u[p - 1] 값을 구한다.
  • 그 이후 메시지 중, u[j] >= u[p - 1] 조건을 만족하고 해당 메시지를 보낸 사람은 p번 메시지를 읽었다고 판단한다.
  • 이 조건을 만족하는 메시지를 한 번도 보내지 않은 사람은 p번 메시지를 읽지 않은 것으로 간주한다.

결론

  • 문제는 시간 순서대로 메시지를 읽는 구조로 되어 있으며, 메시지를 보낸 사람은 항상 이전 메시지를 모두 읽은 것으로 간주한다.
  • 따라서 메시지 p를 기준으로 이후 메시지를 보낸 사람 중 u[j] >= u[p - 1]인 경우는 모두 p번째 메시지를 읽은 사람으로 판단할 수 있다.
  • 반대로 이 조건을 한 번도 만족시키지 못한 사람만 출력한다.

0개의 댓글