끄적끄적 코딩
article thumbnail
Published 2023. 3. 2. 02:18
[Java] SWEA - Contact 알고리즘
728x90

시작지점을 기준으로 연결된 부분들에 연락이 갈 때 마지막에 연락받은 사람들 중 가장 큰 값을 출력하는 문제입니다.

시작지점에서 BFS를 사용해서 탐색합니다. 탐색하면서 방문한 곳에 카운트값을 넣어줍니다.
탐색이 종료된 시점에 방문한 곳들을 확인하면서 카운트값이 가장 크면서 수가 가장 큰 값을 출력해주었습니다.

import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.InputStreamReader;
import java.io.OutputStreamWriter;
import java.util.ArrayList;
import java.util.LinkedList;
import java.util.Queue;
import java.util.StringTokenizer;
 
public class Solution {
    static int ans = 0;
    static int n;
    static int start;
    static int[] visit;
    static ArrayList<ArrayList<Integer>> al;
    static Queue<Integer> q = new LinkedList<>();
    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 = null;
         
        for(int t=1; t<=10; ++t) {
            st = new StringTokenizer(br.readLine());
            al = new ArrayList<>();
            visit = new int[101];
            for(int i=0; i<101; ++i) {
                ArrayList<Integer> temp = new ArrayList<>();
                al.add(temp);
            }
             
            n = Integer.parseInt(st.nextToken());
            start = Integer.parseInt(st.nextToken());
             
            st = new StringTokenizer(br.readLine());
            for(int i=0; i<n/2; ++i) {
                int a = Integer.parseInt(st.nextToken());
                int b = Integer.parseInt(st.nextToken());
                 
                al.get(a).add(b);
            }
             
            q.add(start);
            visit[start] = 1;
            while(!q.isEmpty()) {
                int cur = q.poll();
                for(int i=0; i<al.get(cur).size(); ++i) {
                    int nextLoc = al.get(cur).get(i);
                    if(visit[nextLoc] > 0) {
                        continue;
                    }
                    visit[nextLoc] = visit[cur] + 1;
                    q.add(nextLoc);
                }
            }
             
            int maxNum = 0;
            for(int i=1; i<visit.length; ++i) {
                if(visit[i] >= maxNum) {
                    maxNum = visit[i];
                    ans = i;
                }
            }
            bw.write("#" + t + " " + ans + "\n");
        }
        bw.close();
    }
}

검색 태그