[Softeer] LV3 - 우물 안 개구리

Sierra·2023년 2월 2일
0

[Softeer] LV3

목록 보기
2/5
post-thumbnail

https://softeer.ai/practice/info.do?idx=1&eid=394

문제

헬스장에서 N명의 회원이 운동을 하고 있다. 각 회원은 1에서 N사이의 번호가 부여되어 있고, i번 회원이 들 수 있는 역기의 무게는 Wi이다. 회원들 사이에는 M개의 친분관계 (Aj, Bj)가 있다. (Aj, Bj)는 Aj번 회원과 Bj번 회원이 친분 관계가 있다는 것을 의미한다. i번 회원은 자신과 친분 관계가 있는 다른 회원보다 들 수 있는 역기의 무게가 무거우면 자신이 최고라고 생각한다. 단, 누구와도 친분이 없는 멤버는 본인이 최고라고 생각한다.

이 헬스장에서 자신이 최고라고 생각하는 회원은 몇 명인가?

제약조건

2 ≤ N ≤ 105
1 ≤ M ≤ 105
1 ≤ Wi ≤ 109
1 ≤ Aj, Bj ≤ N
Aj ≠ Bj

입력형식

첫 번째 줄에 두 정수 N, M이 주어진다.
두 번째 줄에 N개의 정수 W1, W2, ... , WN 이 주어진다.

다음 M개의 줄의 j번째 줄에는 두 정수 Aj, Bj 가 주어진다.

출력형식

첫 번째 줄에 자신이 최고라고 생각하는 회원 수를 출력한다.

입출력 예제

  • 입력예제1
5 3
1 2 3 4 5
1 3
2 4
2 5
  • 출력예제1
3
  • 입력예제2
5 3
7 5 7 7 1
1 2
2 3
3 4
  • 출력예제2
2

Solution

import java.util.*;
import java.io.*;

public class Main
{
        public static void main(String[] args) throws Exception {
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(System.out));
        StringTokenizer st = new StringTokenizer(br.readLine());

        int N = Integer.parseInt(st.nextToken());
        int M = Integer.parseInt(st.nextToken());
        int[] arrOfWeight = new int[N + 1];
        int result = 0;

        st = new StringTokenizer(br.readLine());
        for (int i = 1; i <= N; i++) {
            arrOfWeight[i] = Integer.parseInt(st.nextToken());
        }

        List<Stack<Integer>> listOfStacks = new ArrayList<>();

        for (int i = 0; i <= N; i++) {
            listOfStacks.add(new Stack<Integer>());
        }

        for (int i = 0; i < M; i++) {
            st = new StringTokenizer(br.readLine());
            int U = Integer.parseInt(st.nextToken());
            int V = Integer.parseInt(st.nextToken());
            listOfStacks.get(U).add(V);
            listOfStacks.get(V).add(U);
        }

        for (int i = 1; i <= N; i++) {
            while (!listOfStacks.get(i).isEmpty() && arrOfWeight[listOfStacks.get(i).peek()] < arrOfWeight[i]) {
                listOfStacks.get(i).pop();
            }
            if (listOfStacks.get(i).isEmpty()) {
                result++;
            }
        }

        bw.write(String.valueOf(result));
        bw.flush();

    }
}

스택만 잘 쓰면 된다.
친분 관계가 있는 유저들 간에 정보가 존재하기 때문에 각 유저 별 스택을 생성하여 친분관계가 존재하는 데이터들을 쌓아주고, 나중에 모든 스택을 돌며 무게 데이터를 비교하며 빈 스택이 되는 데이터 갯수를 새면 된다.

profile
블로그 이전합니다 : https://swj-techblog.vercel.app/

0개의 댓글