코딩 테스트(JAVA)/인프런 문제풀이 30

💡 이진트리 순회(DFS : 깊이우선탐색, Depth-First Search)

이진트리 순회(깊이우선탐색) 아래 그림과 같은 이진트리를 전위순회와 후위순회를 연습해보세요. [[ 코딩 인터뷰 : 00순회 출력을 숫자로 써서 표현해보세요. ]] 전위순회 출력 : 1 2 4 5 3 6 7 부모 → 왼쪽 자식 → 오른쪽 자식 중위순회 출력 : 4 2 5 1 6 3 7 왼쪽 자식 → 부모 → 오른쪽 자식 후위순회 출력 : 4 5 2 6 7 3 1 왼쪽 자식 → 오른쪽 자식 → 부모 이를 코드로 표현해보겠습니다. import java.util.*; class Node{ int data; // 인스턴스 변수, Node객체의 주소를 저장하는 변수이므로 클래스형(Node형)으로 만듦 Node lt, rt; public Node(int val) { data=val; // 객체 생성시 null값 lt..

원더랜드(최소스패닝트리 : 프림, PriorityQueue)

최소 스패닝 트리 만드는 방법에는 크루스칼 뿐만아니라 프림 알고리즘도 있습니다. 크루스칼 알고리즘을 Union&Find로 구현하였다면 프림 알고리즘은 PriorityQueue를 사용해서 구현합니다. (직전에 풀었던) 같은 문제를 프림 알고리즘을 통해 구현해보도록 하겠습니다. 설명 원더랜드에 문제가 생겼다. 원더랜드의 각 도로를 유지 보수하는 재정이 바닥난 것이다. 원더랜드는 모든 도시를 서로 연결하면서 최소의 유지비용이 들도록 도로를 선택하고 나머지 도로는 폐쇄하려고 한다. 아래의 그림은 그 한 예를 설명하는 그림이다. 위의 지도는 각 도시가 1부터 9로 표현되었고, 지도의 오른쪽은 최소비용 196으로 모든 도시를 연결하는 방법을 찾아낸 것이다. 입력 첫째 줄에 도시의 개수 V(1≤V≤100)와 도로의 ..

원더랜드(최소스패닝트리 문제 - 크루스칼 알고리즘)

설명 원더랜드에 문제가 생겼다. 원더랜드의 각 도로를 유지 보수하는 재정이 바닥난 것이다. 원더랜드는 모든 도시를 서로 연결하면서 최소의 유지비용이 들도록 도로를 선택하고 나머지 도로는 폐쇄하려고 한다. 아래의 그림은 그 한 예를 설명하는 그림이다. 위의 지도는 각 도시가 1부터 9로 표현되었고, 지도의 오른쪽은 최소비용 196으로 모든 도시를 연결하는 방법을 찾아낸 것이다. 입력 첫째 줄에 도시의 개수 V(1≤V≤100)와 도로의 개수 E(1≤E≤1,000)가 주어진다. 다음 E개의 줄에는 각 도로에 대한 정보를 나타내는 세 정수 A, B, C가 주어진다. 이는 A번 도시와 B번 도시가 유지비용이 C인 도로로 연결되어 있다는 의미이다. 출력 모든 도시를 연결하면서 드는 최소비용을 출려한다. 예시 입력 ..

친구인가? (Disjoint-Set : Union&Find)

설명 오늘은 새 학기 새로운 반에서 처음 시작하는 날이다. 현수네 반 학생은 N명이다. 현수는 각 학생들의 친구관계를 알고 싶다. 모든 학생은 1부터 N까지 번호가 부여되어 있고, 현수에게는 각각 두 명의 학생은 친구 관계가 번호로 표현된 숫자쌍이 주어진다. 만약 (1, 2), (2, 3), (3, 4)의 숫자쌍이 주어지면 1번 학생과 2번 학생이 친구이고, 2번 학생과 3번 학생이 친구, 3번 학생과 4번 학생이 친구이다. 그리고 1번 학생과 4번 학생은 2번과 3번을 통해서 친구관계가 된다. 학생의 친구관계를 나타내는 숫자쌍이 주어지면 특정 두 명이 친구인지를 판별하는 프로그램을 작성하세요. 두 학생이 친구이면 “YES"이고, 아니면 ”NO"를 출력한다. 입력 첫 번째 줄에 반 학생수인 자연수 N(1

다익스트라 알고리즘 (수정 필요)

아래의 가중치 방향그래프에서 1번 정점에서 모든 정점으로의 최소 거리비용을 출력하는 프로 그램을 작성하세요. (경로가 없으면 Impossible를 출력한다) ▣ 입력설명 첫째 줄에는 정점의 수 N(1 arr[now]) continue; // 비용 확인 후 갱신 : a가 있는 배열로 들어가서 b,c확인 for(Point p : graph.get(now)) { if(arr[p.dot] > nowCost + p.cost) { // 갱신 후 최소비용으로 offer arr[p.dot] = nowCost + p.cost; pQ.offer(new Point(p.dot, nowCost + p.cost)); } } } } public static void main(String[] args) { Dijkstra T = n..

최대수입스케쥴

설명 현수는 유명한 강연자이다. N개의 기업에서 강연 요청을 해왔다. 각 기업은 D일 안에 와서 강연을 해 주면 M만큼의 강연료를 주기로 했다. 각 기업이 요청한 D와 M를 바탕으로 가장 많을 돈을 벌 수 있도록 강연 스케줄을 짜야한다. 단 강연의 특성상 현수는 하루에 하나의 기업에서만 강연을 할 수 있다. 입력 첫 번째 줄에 자연수 N(1

결혼식

설명 현수는 다음 달에 결혼을 합니다. 현수는 결혼식 피로연을 장소를 빌려 3일간 쉬지 않고 하려고 합니다. 피로연에 참석하는 친구들 N명의 참석하는 시간정보를 현수는 친구들에게 미리 요구했습니다. 각 친구들은 자신이 몇 시에 도착해서 몇 시에 떠날 것인지 현수에게 알려주었습니다. 현수는 이 정보를 바탕으로 피로연 장소에 동시에 존재하는 최대 인원수를 구하여 그 인원을 수용할 수 있는 장소를 빌리려고 합니다. 여러분이 현수를 도와주세요. 만약 한 친구가 오는 시간 13, 가는시간 15라면 이 친구는 13시 정각에 피로연 장에 존재하는 것이고 15시 정각에는 존재하지 않는다고 가정합니다. 입력 첫째 줄에 피로연에 참석할 인원수 N(5

회의실 배정

설명 한 개의 회의실이 있는데 이를 사용하고자 하는 n개의 회의들에 대하여 회의실 사용표를 만들려고 한다. 각 회의에 대해 시작시간과 끝나는 시간이 주어져 있고, 각 회의가 겹치지 않게 하면서 회의실을 사용할 수 있는 최대수의 회의를 찾아라. 단, 회의는 한번 시작하면 중간에 중단될 수 없으며 한 회의가 끝나는 것과 동시에 다음 회의가 시작될 수 있다. 입력 첫째 줄에 회의의 수 n(1