https://www.acmicpc.net/problem/3190

 

3190번: 뱀

문제  'Dummy' 라는 도스게임이 있다. 이 게임에는 뱀이 나와서 기어다니는데, 사과를 먹으면 뱀 길이가 늘어난다. 뱀이 이리저리 기어다니다가 벽 또는 자기자신의 몸과 부딪히면 게임이 끝난다.

www.acmicpc.net

문제

 

해결 방안

문제 전체 다 꼼꼼히 읽어봐야하는 Simulation(구현) 문제이다.

먼저 크게 1. 전체 입력 받는 부분 2. 게임 돌아가는 부분 두 가지로 나누어서 생각을 해봤다.

1. 전체 입력 받는 부분

1-1 보드의 크기
사과의 위치가 행, 열 그대로 주어져서 N+1 x N+1로 설정하였다.

1-2 사과의 위치
보드 위치 위에 사과가 있는 경우 1을 저장해주었다. (board[row][col] = 1)

1-3 뱀의 방향 정보
HashMap 자료구조를 이용하여 key에 시간을 넣어주고 value에 방향값을 넣어줘서 나중에 key값이 있는지 쉽게 찾을 수 있게 하였다.

2. 뱀 게임이 돌아가는 부분

시간에 따른 반복문을 돌게 하였다. 즉 while 안은 1초동안 이뤄지는 일들이다.
index 값을 이용하여 뱀의 머리가 진행할 방향을 설정해주었다.
초깃값은 index=0으로 오른쪽 방향이다.(dx[0], dy[0])
index=0 오른쪽 // index=1 아래 // index=2 왼쪽 //index=3 위
2-5에서 오른쪽으로 방향을 틀면 index++ 이고 왼쪽으로 방향을 틀면 index--가 될것이다.

2-1 다음 움직임 설정
nx, ny를 이용하여 현재 위치에 머리가 진행할 방향으로 이동해준다.
nx = cx + dx[index]
ny = cy + dy[index]

2-2 다음 움직임에 따른 게임이 끝나는지 확인
2-2-1 nx, ny가 벽에 부딪히는 경우(범위 넘어가는 경우)를 확인해준다.
2-2-2 nx, ny가 자기 몸통에 부딪힌 경우를 확인해준다.(snake 몸통 정보 확인)

2-3 보드에 사과 유무에 따른 일 수행
2-3-1 사과 있을 때 머리만 늘어난다.
2-3-2 사과 없을 때 머리는 늘어나고 꼬리는 줄어든다.

2-4 현재 움직임에 다음 움직임 저장

2-5 뱀의 방향 이동 정보가 있는지 확인하고 있으면 방향 설정
해당 시간이 HashMap key값에 있는지 확인하고 방향을 새로 설정해준다. 

 

자세한 것은 코드 주석과 비교하며 코드를 참고하면 된다.

 

코드

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.HashMap;
import java.util.LinkedList;
import java.util.List;
import java.util.Map;

// 뱀
// NxN 정사각형 보드
// 맨위 맨 위측 위치(1,1), 처음 오른쪽 방향을 향함
// 뱀은 계속 머리쪽이 늘어남
// 사과 있으면 사과 없어지고 머리 늘려서 꼬리 그대로
// 사과 없으면 머리 늘려서 꼬리가 위치한 칸 비워줌
public class Main {

	static int n; // 보드의 크기 (2~100)
	static int k; // 사과의 갯수 (0~100)
	static int l; // 뱀의 방향 변환 횟수 (1~100)
	static int time; // 게임 시간
	static int[][] board;
	
	static List<int[]> snake; //뱀의 몸통 위치 (x,y)
	
	// 처음 시작은 오른쪽 방향을 보고 있음
	// 0:오른쪽   1:아래쪽   2:왼쪽   3:위
	// D(오른쪽)가 다오면 index++
	// L(왼쪽)이 나오면 index--
	static int index = 0;
	static int[] dx = {0, 1, 0, -1}; //세로
	static int[] dy = {1, 0, -1, 0}; //가로
	
	static Map<Integer, String> dir; // 뱀의 방향 정보
	
	public static void main(String[] args) throws Exception, IOException {
		BufferedReader br = new BufferedReader(new InputStreamReader(System.in));

		n = Integer.parseInt(br.readLine());
		k = Integer.parseInt(br.readLine());
		
		// 1,1이 맨 위 맨 좌측
		board = new int[n+1][n+1];
		
		// 사과 위치 입력
		String str;
		int row; // 행
		int col; // 열
		for(int i=0; i<k; i++) {
			str = br.readLine();
			
			row = Integer.parseInt(str.split(" ")[0]);
			col = Integer.parseInt(str.split(" ")[1]);
			
			board[row][col] = 1;
		}
		
		// 뱀 방향 정보 입력
		dir = new HashMap<>();
		l = Integer.parseInt(br.readLine());
		for(int i=0; i<l; i++) {
			str = br.readLine();
			int timeInfo = Integer.parseInt(str.split(" ")[0]);
			String directionInfo = str.split(" ")[1];
			
			dir.put(timeInfo, directionInfo);
		}
		
		// 뱀 시작 지점 (1,1) (x,y)
		snake = new LinkedList<>();
		snake.add(new int[]{1,1});
		
		time = 0;
		int nx, ny; // 다음 움직임
		int cx, cy; // 현재 움직임(1,1)
		cx = 1;
		cy = 1;
		// 뱀 움직임 시작
		while(true) {
			time++;
			
			// 다음 움직임(머리 데이터)
			nx = cx + dx[index];
			ny = cy + dy[index];
			
			// 끝나는지 확인
			if(isFinish(nx,ny)) break;
			
			// 사과 있는지 확인
			// 사과 있으면 사과 없어지고 머리 늘려서 꼬리 그대로
			if(board[nx][ny] == 1) {
				board[nx][ny] = 0;
				snake.add(new int[] {nx,ny}); // 머리 정보 추가
			}
			// 사과 없으면 머리 늘려서 꼬리가 위치한 칸 비워줌
			else {
				snake.add(new int[] {nx,ny}); // 머리 정보 추가
				snake.remove(0); // 꼬리 index는 0
			}
			 
			cx = nx;
			cy = ny;
			
			// 해당 시간 끝났을 때 다음 방향 정해주기
			if(dir.containsKey(time)) {
				// D(오른쪽)가 다오면 index++
				if(dir.get(time).equals("D")) {
					index++;
					if(index == 4)
						index = 0;
				}
				// L(왼쪽)이 나오면 index--				
				if(dir.get(time).equals("L")) {
					index--;
					if(index == -1)
						index = 3;
				}
				
			}
		}
		
		System.out.println(time);
	}
	
	// 게임이 끝나는지 확인
	static boolean isFinish(int nx, int ny){
		
		// 벽에 부딪히거나
		if(nx<1 || ny<1 || nx>=n+1 || ny>=n+1) 
			return true;
		
		// 자기 몸통에 닿거나
		for(int i=0; i<snake.size(); i++) {
			if(nx == snake.get(i)[0] && ny == snake.get(i)[1]) 
				return true;
		}
		
		return false;
	}

}

https://www.acmicpc.net/problem/14500

 

14500번: 테트로미노

폴리오미노란 크기가 1×1인 정사각형을 여러 개 이어서 붙인 도형이며, 다음과 같은 조건을 만족해야 한다. 정사각형은 서로 겹치면 안 된다. 도형은 모두 연결되어 있어야 한다. 정사각형의 변�

www.acmicpc.net

문제

N x M 종이 위에 5가지 도형 중 1가지를 놓아서 해당 도형이 놓인 칸에 있는 수들의 최대 값을 출력하는 문제이다.

 

해결 방안

1. ㅜ 모양으로 생긴 도형 외 4가지는 dfs를 이용하여 구할 수 있다.

출처: https://velog.io/@skyepodium/%EB%B0%B1%EC%A4%80-14500-%ED%85%8C%ED%8A%B8%EB%A1%9C%EB%AF%B8%EB%85%B8

- 위와 같이 ㅜ 모양을 제외한 4가지 도형의 각각의 모든 경우(회전, 대칭 포함)은 depth가 4인 DFS 탐색 모양이다. 
- depth가 4일때 최댓값을 구해준다.

2. ㅜ 모양으로 생긴 도형의 경우는 4가지 경우(ㅜ, ㅗ, ㅓ, ㅏ)가 있으므로 해당 경우를 완전 탐색 해준다. 
(가운데 튀어나온 경우 되돌아가야하므로 DFS탐색을 할 수 없다.)

3. 두 가지 경우의 최댓값을 구해준다.

 

코드

import java.util.Scanner;

// 테트로미노
// 테트로미노 5가지 모양(회전, 대칭 가능)
// N X M 종이 위에 테트로미노를 하나 놓으려고 함
// 각각의 칸에는 정수가 하나 쓰여있음
// 테트로미노 하나를 적절히 놓아서 테트로미노가 놓인 칸에 쓰여있는 수들의 합을 최대로 하는 프로그램
public class Main {

	static int n; // 세로크기
	static int m; // 가로크기
	static int[][] maps;
	static boolean[][] checked;
	static int result = 0;
	
	// 왼쪽 오른쪽 위 아래 순으로 한칸 움직였을 때
	static int[] dx = {0, 0, -1, 1}; // 세로
	static int[] dy = {-1, 1, 0, 0}; // 가로
	
	// ㅜ 일때 모든 경우 (ㅜ,ㅗ,ㅓ,ㅏ 순)
	static int[][] ex = {{0, 0, 0, 1}, {1, 1, 1, 0}, {0, 1, 2, 1}, {0, 1, 2, 1}}; //세로
	static int[][] ey = {{0, 1, 2, 1}, {0, 1, 2, 1}, {1, 1, 1, 0}, {0, 0, 0, 1}}; //가로
	
	public static void main(String[] args) {
		// TODO Auto-generated method stub
		Scanner input = new Scanner(System.in);
		
		n = input.nextInt();
		m = input.nextInt();
		maps = new int[n][m];
		checked = new boolean[n][m];
		
		for(int i=0; i<n; i++) {
			for(int j=0; j<m; j++) {
				maps[i][j] = input.nextInt();
			}
		}
		
		// 4가지는 dfs (depth=4인)
		// ㅜ 모양은 따로 구해줌
		for(int i=0; i<n; i++) {
			for(int j=0; j<m; j++) {
				
				// 4가지 모양
				checked[i][j] = true;
				dfs(i, j, maps[i][j], 1);
				checked[i][j] = false;
				
				// ㅜ 모양
				exceptionCase(i, j);
			}
		}
		
		System.out.println(result);
		
	}
	
	// ㅜ를 제외한 4가지 경우 (dfs를 이용하여 모든 경우를 만들 수 있음)
	static void dfs(int x, int y, int sum, int depth) {
		if(depth >= 4) {
			result = Math.max(result, sum);
			return;
		}
		else {
			int nx, ny;
			// 지금 방향에서 왼쪽 오른쪽 위 아래 방향으로 1칸 움직임
			for(int i=0; i<4; i++) {
				nx = x + dx[i]; // 세로
				ny = y + dy[i]; // 가로
				
				// 종이 범위 넘어가는지 확인
				if(nx<0 || nx>=n || ny<0 || ny>=m) continue;
				
				// 방문한적 없으면
				if(!checked[nx][ny]) {
					checked[nx][ny] = true;
					dfs(nx, ny, (sum+maps[nx][ny]), depth+1);
					
					// 체크 해제
					checked[nx][ny] = false;
				}
			}
		}
	}
	
	// ㅜ,ㅗ,ㅓ,ㅏ 모양 검사
	static void exceptionCase(int x, int y) {
		int nx, ny, sum;
		boolean outCheck = false;
		
		for(int i=0; i<4; i++) {
			sum = 0;
			outCheck = false;
			for(int j=0; j<4; j++) {
				nx = x + ex[i][j]; // 세로
				ny = y + ey[i][j]; // 가로
				
				// 종이 범위 넘어가는지 체크
				if(nx<0 || nx>=n || ny<0 || ny>=m) {
					outCheck = true;
					continue;
				}
				
				sum += maps[nx][ny];
			}
			
			// 범위 안나갔으면
			if(!outCheck)
				result = Math.max(sum, result);
		}
	}

}

Windows에서 MySQL 설치

1. MySQL 설치 프로그램 다운로드 하기

1.1) mysql 다운로드 URL 접속

https://www.mysql.com/downloads/

 

MySQL :: MySQL Downloads

Contact MySQL  |  Login  |  Register The world's most popular open source database MySQL.com Downloads Documentation Developer Zone MySQL Enterprise Edition includes the most comprehensive set of advanced features and management tools for MySQL. MySQL

www.mysql.com

1.2) 페이지 밑에 색칠된 링크 클릭

 1.3) MySQL Community Server 링크 클릭

1.4) Go to Download page 버튼 클릭

1.5) mysql-installer-community.msi 다운로드

1.6) No thanks, just start my download 링크 클릭

- mysql-installer-community.msi(mysql 설치프로그램)이 다운로드 된다.
- 해당 프로그램을 실행해서 설치를 진행해준다.

 

2. MySQL 설치 및 세팅

2.1) MySQL 설치

- Developer Default를 클릭하고 next를 눌러준다.

- Excute 누르면 설치가 진행되고 완료되면 아래 화면과 같이 뜬다.

- 그 이후 계정 설정할 때 까지 Excute 및 default 값으로 Next 버튼을 클릭해준다.

- MySQL root 계정의 비번을 설정해준다.

- 그 이후도 default로 설치를 진행한다.

- 커넥션 연결테스트를 진행한다.

- 모든 설치가 완료되었다.

 

3. MySQL workbench, shell 실행 화면

MySQL workbench
MySQL shell

 

4. 콘솔창에서 mysql 명령 실행하기 위한 설정

- 시스템 속성 > 환경변수 > path에 C:\Program Files\MySQL\MySQL Server 8.0\bin를 추가해준다.

 

https://www.acmicpc.net/problem/14499

 

14499번: 주사위 굴리기

첫째 줄에 지도의 세로 크기 N, 가로 크기 M (1 ≤ N, M ≤ 20), 주사위를 놓은 곳의 좌표 x y(0 ≤ x ≤ N-1, 0 ≤ y ≤ M-1), 그리고 명령의 개수 K (1 ≤ K ≤ 1,000)가 주어진다. 둘째 줄부터 N개의 줄에 지도

www.acmicpc.net

 

문제

 

해결방안

구현 문제이다. 주사위가 굴러갈때마다 지도의 좌표와 주사위를 계속 바꿔주면 된다. 

1. 좌표의 경우 동쪽, 서쪽인 경우 y값을 변화시켜주고 이 때 지도의 범위에서 넘어가는지 확인하는 과정이 필요하다.

1-1. 지도에서 넘어갈 경우 해당 명령을 무시하고 넘어가면 된다.

1-2. 지도에서 넘어가지 않는 경우 문제에 주어진 과정을 구현해주면 된다.
(주사위를 굴렸을 때, 이동한 칸에 쓰여 있는 수가 0이면, 주사위의 바닥면에 쓰여 있는 수가 칸에 복사된다. 0이 아닌 경우에는 칸에 쓰여 있는 수가 주사위의 바닥면으로 복사되며, 칸에 쓰여 있는 수는 0이 된다. 주사위를 놓은 곳의 좌표와 이동시키는 명령이 주어졌을 때, 주사위가 이동했을 때 마다 상단에 쓰여 있는 값을 출력한다.)

2. 주사위 경우 항상 주사위의 밑면 index는 6이고 윗면은 1이고 그 외는 주사위의 전개도를 참고한다.
동서남북으로 굴러갈때 굴러간 주사위 면의 값들을 각 주사위 index에 저장해준다.

 

 

코드

import java.util.Scanner;

// 주사위 굴리기
// NxM 지도
// 지도의 오른쪽은 동쪽, 위쪽은 북쪽
// 지도의 좌표 (r,c) 
// r: 북쪽으로부터 떨어진 칸의 갯수
// c: 서쪽으로부터 떨어진 칸의 갯수

public class Main {

	static int n; // 지도의 세로크기 (x)
	static int m; // 지도의 가로크기 (y)
	static int x,y; // 주사위를 놓은 곳의 좌표
	static int k; // 명령의 갯수
	static int[][] maps;
	static int[] dice;
	static int[] tempDice;
	
	public static void main(String[] args) {
		Scanner input = new Scanner(System.in);
		n = input.nextInt();
		m = input.nextInt();
		x = input.nextInt();
		y = input.nextInt();
		k = input.nextInt();

		dice = new int[7];
		
		maps = new int[n][m];
		for(int i=0; i<maps.length; i++) {
			for(int j=0; j<maps[i].length; j++) {
				maps[i][j] = input.nextInt();
				
				// 처음 시작일때(x,y) 밑면이 6
				if(x==i && y==j) {
					if(maps[x][y] == 0)
						maps[x][y] = 0;
					else {
						dice[6] = maps[x][y];
						maps[x][y] = 0;
					}
				}
			}
		}
		
		int command;
		for(int i=0; i<k; i++) {
			command = input.nextInt();
			rollTheDice(command);
		}
	}
	
	// 주사위 굴리기
	// 동:1, 서:2, 북:3, 남:4
	// 범위 넘어가면 명령 무시
	// 아니면 주사위의 윗 면에 써있는 수를 출력(dice[1]);
	public static void rollTheDice(int command) {
		tempDice = dice.clone();
		boolean flag = true;
		
		if(command == 1) {
			if(y+1 < m) {
				y+=1;
				
				dice[1] = tempDice[4];
				dice[2] = tempDice[2];
				dice[3] = tempDice[1];
				dice[4] = tempDice[6];
				dice[5] = tempDice[5];
				dice[6] = tempDice[3];
			}
			else
				flag = false;
		}
		else if(command == 2) {
			if(y-1 >= 0) {
				y-=1;
				
				dice[1] = tempDice[3];
				dice[2] = tempDice[2];
				dice[3] = tempDice[6];
				dice[4] = tempDice[1];
				dice[5] = tempDice[5];
				dice[6] = tempDice[4];
			}
			else
				flag = false;
		}
		else if(command == 3) {
			if(x-1 >= 0) {
				x-=1;
				
				dice[1] = tempDice[5];
				dice[2] = tempDice[1];
				dice[3] = tempDice[3];
				dice[4] = tempDice[4];
				dice[5] = tempDice[6];
				dice[6] = tempDice[2];
			}
			else
				flag = false;
		}
		else if(command == 4) {
			if(x+1 < n) {
				x+=1;
				
				dice[1] = tempDice[2];
				dice[2] = tempDice[6];
				dice[3] = tempDice[3];
				dice[4] = tempDice[4];
				dice[5] = tempDice[1];
				dice[6] = tempDice[5];
			}
			else
				flag = false;
		}
		else {
			;
		}
		
		if(flag) {

			// 지도 좌표가 0인 경우 dice에 적힌 수가 지도 좌표에 적힌 값이 됨
			// 주사위의 젤 밑부분인 dice[6]이 지도 좌표에 적힌 값이 됨
			if(maps[x][y] == 0)
				maps[x][y] = dice[6];
			else {
				dice[6] = maps[x][y];
				maps[x][y] = 0;
			}

			// 그 윗부분인 dice[1]을 출력
			System.out.println(dice[1]);
		}
	}

}

https://www.acmicpc.net/problem/13458

 

13458번: 시험 감독

첫째 줄에 시험장의 개수 N(1 ≤ N ≤ 1,000,000)이 주어진다. 둘째 줄에는 각 시험장에 있는 응시자의 수 Ai (1 ≤ Ai ≤ 1,000,000)가 주어진다. 셋째 줄에는 B와 C가 주어진다. (1 ≤ B, C ≤ 1,000,000)

www.acmicpc.net

문제

 

해결 방안

문제를 이해하고 단순히 구현하는 문제이다.
1. 총 감독은 시험장마다 1명씩 있어서 시험자 응시자 수 배열 a[]에서 b(총감독이 맡을 수 있는 응시자 수)만큼 다 빼주고 cnt++해주고 시작하였다.

2. b만큼 빼준 a[i] 값이 0보다 작거나 같으면 부감독이 필요없으므로 continue 해줬다.

3. 그렇지 않는 경우 a[i]를 c(부감독이 맡을 수 있는 응시자 수)로 나눠주고 몫을 cnt에 더해줬다.

4. a[i]를 c로 나누었을 때 나머지 값이 0보다 큰 경우 부 감독이 한명 더 필요하므로 cnt++를 해줫다.

 

코드

import java.util.Scanner;

// 시험 감독
public class Main {

	public static void main(String[] args) {
		// TODO Auto-generated method stub
		Scanner input = new Scanner(System.in);
		int n = input.nextInt();
		long cnt = 0; // 감독관 수
		int[] a = new int[n]; // 응시자 수
		
		for(int i=0; i<n; i++) {
			a[i] = input.nextInt();
		}
		
		int b = input.nextInt(); // 총감독이 맡을 수 있는 사람수
		int c = input.nextInt(); // 부감독이 맡을 수 있는 사람수
		
		for(int i=0; i<n; i++) {
			a[i]-=b;
			cnt++;
			
			// 총 감독이 맡을 수 있는 경우는 부감독 필요 없으므로 넘어감
			if(a[i]<=0) {
				continue;
			}
			// 부감독이 추가로 필요한 경우
			else {
				cnt += a[i]/c;
				// 나머지가 0보다 크면 부감독 한명 더 추가
				if(a[i]%c > 0) {
					cnt++;
				}
			}
		}
		
		System.out.println(cnt);
	}

}

https://programmers.co.kr/learn/courses/30/lessons/42883?language=java

 

코딩테스트 연습 - 큰 수 만들기

 

programmers.co.kr

코드

// 큰 수 만들기
class Solution {
    public String solution(String number, int k) {
        StringBuilder answer = new StringBuilder();
        
        if(number.charAt(0) == '0') return "0";
        
        int idx = 0;
        char max;
        
        for(int i=0; i<number.length()-k; i++){
            max = '0';
            // k갯수 만큼 구해야함
            for(int j=idx; j<=i+k; j++){
                if(max < number.charAt(j)){
                    max = number.charAt(j);
                    idx = j+1;
                } 
            }
            answer.append(max);
        }
        
        return answer.toString();
    }
}

https://programmers.co.kr/learn/courses/30/lessons/42885

 

코딩테스트 연습 - 구명보트

무인도에 갇힌 사람들을 구명보트를 이용하여 구출하려고 합니다. 구명보트는 작아서 한 번에 최대 2명씩 밖에 탈 수 없고, 무게 제한도 있습니다. 예를 들어, 사람들의 몸무게가 [70kg, 50kg, 80kg, 5

programmers.co.kr

탐욕법은 최적의 해에 도달하기 위한 문제 해결 방안이 필요하다.

 

해결 방안

1. 제일 무거운 사람과 제일 가벼운 사람이 limit에 걸리지 않으면 둘다 나가고 아니면 무거운 사람부터 나가도록 구현함

 

코드

import java.util.*;
// 구명보트
class Solution {
    public int solution(int[] people, int limit) {
        int answer = 0;
        
        Arrays.sort(people);
        
        // 몸무게가 적게 나가는 사람 index
        int index = 0;
        for(int i = people.length-1; i>=index; i--){
            
            // 최대 최소 합이 limit보다 크면 제일 무거운사람 먼저 보냄
            if(people[i] + people[index] > limit){
                answer++;
                
            }
            // 최대 최소 합이 limit 보다 작거나 같으면 둘다 보냄
            else{
                index++;
                answer++;
            }
        }
        
        return answer;
    }
}

https://programmers.co.kr/learn/courses/30/lessons/49189?language=java

 

코딩테스트 연습 - 가장 먼 노드

6 [[3, 6], [4, 3], [3, 2], [1, 3], [1, 2], [2, 4], [5, 2]] 3

programmers.co.kr

처음에 간선 간의 가중치를 1로 생각하여 다익스트라그램을 이용하여 최단 경로를 구한다음 가장 먼 거리에 있는 것들을 찾았는데 테스트케이스 9, 10 에서 시간이 넘어갔다.

그래서 BFS를 이용하여 구현하였다.

해결방안

1. BFS를 이용하였으며 각각 vertex들과 start의 거리를 distance에 배열에 저장해줌

2. distance 배열에 저장되어있는 것들 중 가장 먼 vertex들의 거리를 farthestDepth에 저장하고 distance 배열에서 farthesDepth 인 것들을 찾아 갯수를 세줌

 

코드

import java.util.*;

// 가장 먼 노드
class Solution {
    
    public static boolean[] visited;
    public static int[] distance;
    public static ArrayList<ArrayList<Integer>> graph;
    public static int cnt;
    public static int farthestDepth;
    
    public static void bfs(){
        cnt = 0;
        farthestDepth = 0;
        int start = 1;
        
        Queue<Integer> q = new LinkedList<>();
        q.offer(start);
        visited[start] = true;
        
        int current;
        int near;
        while(!q.isEmpty()){
            current = q.poll();
            
            // 인접 노드 다 찾기
            for(int i=0; i<graph.get(current).size(); i++){
                near = graph.get(current).get(i);
                
                if(!visited[near]){
                    distance[near] = distance[current]+1;
                    q.offer(near);
                    visited[near] = true;
                }
            }
        }
        
        for(int i=1; i<distance.length; i++){
            farthestDepth = Math.max(farthestDepth, distance[i]);
        }
        
        for(int i=1; i<distance.length; i++){
            if(distance[i]==farthestDepth)
                cnt++;
        }

    }
    
    public int solution(int n, int[][] edge) {
        
        visited = new boolean[n+1];
        distance = new int[n+1];
        graph = new ArrayList<>();
        
        for(int i=0; i<n+1; i++){
            graph.add(new ArrayList<Integer>());
        }
        
        int vertex1;
        int vertex2;
        for(int i=0; i<edge.length; i++){
            vertex1 = edge[i][0];
            vertex2 = edge[i][1];
            
            graph.get(vertex1).add(vertex2);
            graph.get(vertex2).add(vertex1);
        }
    
        
        bfs();
        
        return cnt;
    }
}

+ Recent posts