- 수 정렬하기 2750번
package 정렬;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Collection;
import java.util.Collections;
public class 수정렬하기_2750 {
public static void main(String[] args) throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
int count = Integer.parseInt(br.readLine());
ArrayList<Integer> arr = new ArrayList<Integer>(); // 동적할당을 위해
for(int i = 1; i <= count; i++){
int num = Integer.parseInt(br.readLine());
arr.add(num);
}
Collections.sort(arr); // 컬랙션으르 이용하여 ArrayList 정렬
for (Integer integer : arr) {
System.out.println(integer);
}
}
}
- 나이순 정렬 10814번
package 정렬;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.ArrayList;
import java.util.Collections;
import java.util.Comparator;
import java.util.StringTokenizer;
class Person {
int age;
String name;
Person(int age, String name) {
this.age = age;
this.name = name;
}
}
public class 나이순정렬_10814 {
public static void main(String[] args) throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
int count = Integer.parseInt(br.readLine());
ArrayList<Person> list = new ArrayList<>();
for (int i = 0; i < count; i++) {
StringTokenizer st = new StringTokenizer(br.readLine(), " ");
int age = Integer.parseInt(st.nextToken());
String name = st.nextToken();
list.add(new Person(age, name));
}
// 나이순으로 정렬하되, 나이가 같으면 입력 순서대로 정렬되도록.
Collections.sort(list, new Comparator<Person>() { //제네릭을 사용하여 비교 및 정려
@Override
public int compare(Person p1, Person p2) {
return Integer.compare(p1.age, p2.age);
}
});
for (Person person : list) {
System.out.println(person.age + " " + person.name);
}
}
}
- 카드2 2164번
package 정렬;
import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.io.IOException;
public class 카드{
public static void main(String[] args) throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
int N = Integer.parseInt(br.readLine());
int[] queue = new int[2 * N]; // 2 * N - 1 의 공간이 필요하다.
for(int i = 1; i <= N; i++) { // 입력 받은에 인덱스 넣기
queue [i] = i;
}
int first = 1, last = N;
while(N-- > 1) {
first++;
queue[last + 1] = queue[last];
last++;
first++;
}
System.out.println(queue[first]);
}
}
}
- 나무자르기 2805번
package 이분탐색;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.StringTokenizer;
public class 나무자르기 {
public static void main(String[] args) throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
StringTokenizer st = new StringTokenizer(br.readLine(), " ");
int n = Integer.parseInt(st.nextToken());
int m = Integer.parseInt(st.nextToken());
int[] arr = new int[n];
StringTokenizer st1 = new StringTokenizer(br.readLine()); // 그 다음 읽기
int min = 0;
int max = -1;
for(int i=0; i<n; i++) {
arr[i] = Integer.parseInt(st.nextToken());
max = Math.max(max, arr[i]); // 이 가운데에서 최댓값을 구하자!
}
while(min<=max) { // 이진탐색 중앙값을 2로 나눈값을 target으로 잡고 구하자!
int mid = (min+max)/2;
long tree=0;
for(int i=0; i<n; i++) {
if(arr[i]>mid) // 만약 중앙 값보다 크다면?
tree+= arr[i]-mid; // 잘라버리기(이것이 트리의 합이된다.)
}
if(tree>=m) { // 최솟값을 높혀라 한 값보다 크다면?
min = mid+1; //
}else if(tree<m) { // 작다면 맞추도록! max를 낮추기!
max = mid-1;
}
}
System.out.println(max);
}
}
- 트리의 지름
package 이분탐색;
import java.io.*;
import java.util.*;
public class 트리의지름 {
// 노드의 개수
static int N;
// 노드의 인접 리스트 배열
static List<Node> nodes[];
// 방문 여부를 확인하는 배열
static boolean[] visited;
// 최대 거리를 저장할 변수
static int max;
public static void main(String[] args)throws IOException{
// 입력을 받기 위한 BufferedReader
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
// 노드의 개수를 입력받음
N = Integer.parseInt(br.readLine());
// 노드 배열 초기화
nodes = new ArrayList[N+1];
// 각 노드에 대한 인접 리스트 초기화
for(int i = 1; i <= N; i++)nodes[i] = new ArrayList<>();
// 노드 사이의 간선 정보를 입력받음
for(int i = 1; i < N; i++){
StringTokenizer st = new StringTokenizer(br.readLine());
int from = Integer.parseInt(st.nextToken());
int to = Integer.parseInt(st.nextToken());
int value = Integer.parseInt(st.nextToken());
// 양방향 간선을 인접 리스트에 추가
nodes[from].add(new Node(to,value));
nodes[to].add(new Node(from,value));
}
// 각 노드에서 DFS를 수행하여 트리의 지름을 찾음
for(int i = 1; i <= N; i++){
// 방문 배열을 초기화
visited = new boolean[N+1];
// 시작 노드를 방문 처리
visited[i] = true;
// DFS 시작
dfs(i,0);
}
// 트리의 지름 출력
System.out.println(max);
}
// DFS를 사용하여 트리의 지름을 찾는 메소드
public static void dfs(int num, int value){
// 현재 노드에서 연결된 모든 노드를 방문
for(Node node : nodes[num]){
// 아직 방문하지 않은 노드라면
if(!visited[node.link]){
// 해당 노드를 방문 처리
visited[node.link] = true;
// 다음 노드로 이동하며 거리를 누적
dfs(node.link, value + node.value);
}
}
// 최대 거리를 갱신
max = Math.max(max,value);
}
}
// 노드 클래스
class Node{
// 연결된 노드 번호
public int link;
// 해당 간선의 거리
public int value;
// 노드 생성자
public Node(int link, int value){
this.link = link;
this.value =value;
}
}