
https://www.acmicpc.net/problem/2458
풀이
문제에 주어진 대로 관계가 주어진 학생을 2차원 그래프로 나타낸다.
순위가 정해진다는 의미는 자신보다 크거나 작은 것이 결정된 학생 수가 (전체 학생 수 - 1)이 된다는 뜻이다.
자신을 기준으로 키가 크거나 작은 학생을 bfs로 탐색하여(greaterBfs(), lessBfs()) 각각 몇 명인지 알아내고 합을 구하면 된다.
main()
//학생들 간의 관계 저장할 2차원 배열 static int[][] graph; static int N; static boolean[] isVisited; public static void main(String[] args) throws IOException { BufferedReader bf = new BufferedReader(new InputStreamReader(System.in)); StringTokenizer st = new StringTokenizer(bf.readLine()); N = Integer.parseInt(st.nextToken()); int M = Integer.parseInt(st.nextToken()); graph = new int[N][N]; isVisited = new boolean[N]; for (int i = 0; i < M; i++) { st = new StringTokenizer(bf.readLine()); int low = Integer.parseInt(st.nextToken())-1; int high = Integer.parseInt(st.nextToken())-1; //graph[작은 학생][큰 학생]인 경우 1로 표시 graph[low][high] = 1; }//for end int answer = 0; for (int i = 0; i < N; i++) { //(i+1)번 학생을 기준으로 큰 키의 학생 수 int greaterCnt = greaterBfs(i); //(i+1)번 학생을 기준으로 작은 키의 학생 수 int lessCnt = lessBfs(i); //기준 학생보다 크거나 작은 학생 수의 합이 N-1이면 키 순위 정해짐 if ((greaterCnt + lessCnt) == N-1) { answer++; } }//for end System.out.println(answer); }
greaterBfs()
/** * greaterBfs() : 기준 학생보다 큰 키의 학생들을 bfs로 탐색 * @param studentNum : 기준이 될 학생 번호 * @return : 기준 학생보다 큰 키의 학생 수 */ public static int greaterBfs(int studentNum) { //방문 여부 배열 초기화 Arrays.fill(isVisited, false); Queue<Integer> queue = new LinkedList<>(); queue.add(studentNum); isVisited[studentNum] = true; //조건에 해당하는 학생 수 int cnt = 0; while (!queue.isEmpty()) { int nowStudentNum = queue.poll(); for (int i = 0; i < N; i++) { //graph[작은 학생 번호][큰 학생 번호] 이므로 //뒤 index를 바꿔가며 탐색 if (graph[nowStudentNum][i] == 1 && !isVisited[i]) { queue.add(i); isVisited[i] = true; cnt++; } }//for end }//while end return cnt; }
lessBfs()
greaterBfs()에서 bfs 탐색 결정 조건만 다르다.
for (int i = 0; i < N; i++) { //greaterBfs와는 반대로 작은 키 학생을 찾아야 하므로 //앞 index를 바꿔가며 거꾸로 탐색 if (graph[i][nowStudentNum] == 1 && !isVisited[i]) { queue.add(i); isVisited[i] = true; cnt++; } }//for end

'자료구조 & 알고리즘 > 문제풀이' 카테고리의 다른 글
트리 순회 - 백준 1991 (Java) (0) | 2022.08.03 |
---|---|
길 찾기 게임 - 2019 Kakao Blind Recruitment (Java, Level 3) (0) | 2022.07.30 |
멀쩡한 사각형 - Summer/Winter Coding 2019 (Java, Level 2) (0) | 2022.07.25 |
카드 구매하기 2 - 백준 16194 (Java) (0) | 2022.07.24 |
단어 맞추기 - 백준 9081 (Java) (0) | 2022.07.23 |
댓글