자바 10

[백준 1197] 최소 스패닝 트리 (MST, 크루스칼 알고리즘) - 자바(JAVA)

1. 문제 https://www.acmicpc.net/problem/1197 1197번: 최소 스패닝 트리 첫째 줄에 정점의 개수 V(1 ≤ V ≤ 10,000)와 간선의 개수 E(1 ≤ E ≤ 100,000)가 주어진다. 다음 E개의 줄에는 각 간선에 대한 정보를 나타내는 세 정수 A, B, C가 주어진다. 이는 A번 정점과 B번 정점이 www.acmicpc.net 2. 풀이 최소 스패닝 트리(MST)는 주어진 그래프의 모든 정점들을 연결하는 부분 그래프 중에서 가중치의 합이 최소인 트리이다. MST는 크루스칼, 프림 알고리즘 두 가지로 구할 수 있다. 간선이 적을 때는 크루스칼, 간선이 많을 때는 프림 알고리즘이 효율적이라고 한다. 이 문제에서는 Union Find를 사용하는 크루스칼 알고리즘으로 문..

알고리즘 2023.10.11

[백준 1753] 최단경로 (다익스트라 알고리즘) - 자바(JAVA)

1. 문제 https://www.acmicpc.net/problem/1753 1753번: 최단경로 첫째 줄에 정점의 개수 V와 간선의 개수 E가 주어진다. (1 ≤ V ≤ 20,000, 1 ≤ E ≤ 300,000) 모든 정점에는 1부터 V까지 번호가 매겨져 있다고 가정한다. 둘째 줄에는 시작 정점의 번호 K(1 ≤ K ≤ V)가 www.acmicpc.net 2. 풀이 방향그래프가 주어질 때 한 시작점에서 다른 모든 정점으로의 최댄 경로를 구하는 문제이다. 다익스트라 알고리즘으로 문제를 풀 수 있다. 다익스트라 알고리즘은 PriorityQueue를 사용한다 ! 3. 코드 import java.io.BufferedReader; import java.io.IOException; import java.io.I..

알고리즘 2023.10.11

모던 자바 인 액션 - CH06. 스트림으로 데이터 수집(2)

6.4 분할 분할은 분할 함수라 불리는 프레디케이트를 분류 함수로 사용하는 특수한 그룹화 기능이다. 분할 함수는 불리언을 반환하므로 맵의 키 형식은 Boolean이다. -> 그룹화 맵은 최대 (참 or 거짓) 두 개의 그룹으로 분류됨 // 채익 요리와 채식이 아닌 요리로 분류 Map partitionedMenu = menu.stream().collect(partitioningBy(Dish::isVegetarian)); // 분할 함수 // 채식 요리를 얻기 List vegitarianDishes = partitionedMenu.get(true); // 프레디케이트로 필터링한 다음에 별도의 리스트에 결과를 수집해도 같은 결과를 얻을 수 있다. List vegitarianDishes = menu.stream..

JAVA 2023.09.12

모던 자바 인 액션 - CH05. 스트림 활용

5.1 필터링 스트림의 요소를 선택하는 방법, 즉 프레디케이트 필터링 방법과 고유 요소만 필터링하는 방법을 배운다. 5.1.1 프레디케이트로 필터링 스트림 인터페이스는 filter 메서드를 지원한다. filter 메서드는 프레디케이트(불리언을 반환하는 함수)를 인수로 받아서 프레디케이트와 일치하는 모든 요소를 포함하는 스트림을 반환한다. List vegetarianMenu = menu.stream() .filter(Dish::isVegetarian) .collect(toList()); 5.1.2 고유 요소 필터링 스트림은 고유 요소로 이루어진 스트림을 반환하는 distinct 메서드도 지원한다. 고유 여부는 스트림에서 만든 객체의 hashCode, equals로 결정된다. List numbers = Ar..

JAVA 2023.08.22

모던 자바 인 액션 - CH04. 스트림 소개

4.1 스트림이란 무엇인가? 스트림(Streams)은 자바 8 API에 새로 추가된 기능이다. 스트림을 이용하면 선언형으로 컬렉션 데이터를 처리할 수 있다. 스트림을 이용하면 멀티스레드 코드를 구현하지 않아도 데이터를 투명하게 병렬로 처리할 수 있다. 다음 예제는 저칼로리 요리명을 반환하고, 칼로리를 기준으로 요리를 정렬하는 자바7 코드이다. List lowCaloricDishes = new ArrayList(); for(Dish dish: menu) { if(dish.getCalories() < 400) { lowCaloricDishes.add(dish); } } Collections.sort(lowCaloricDishes, new Comparator() { public int compare(Dish ..

JAVA 2023.08.15

[백준 11060] 점프 점프 - 자바(JAVA)

1. 문제 https://www.acmicpc.net/problem/11060 11060번: 점프 점프 재환이가 1×N 크기의 미로에 갇혀있다. 미로는 1×1 크기의 칸으로 이루어져 있고, 각 칸에는 정수가 하나 쓰여 있다. i번째 칸에 쓰여 있는 수를 Ai라고 했을 때, 재환이는 Ai이하만큼 오른쪽으로 www.acmicpc.net 2. 풀이 `DP`로 문제를 풀었습니다. dp배열은 해당 칸까지 가는데 걸리는 최소 점프 횟수입니다. 만약에 data[3]=3이고 dp[3]=2라면 3번째 칸 까지 가는 최소 점프 횟수는 2번인데 3번째 칸에서 4, 5, 6칸을 갈 수 있는데 점프를 하니까 3번(dp[3]+1)만에 갈 수 있습니다. 최소면 갱신하고 아니라면 무시하면 됩니다. 이렇게 최솟값을 갱신하면서 dp[0..

알고리즘 2023.08.10

[백준17615] 볼 모으기 - 자바(JAVA)

1. 문제 https://www.acmicpc.net/problem/17615 17615번: 볼 모으기 첫 번째 줄에는 볼의 총 개수 N이 주어진다. (1 ≤ N ≤ 500,000) 다음 줄에는 볼의 색깔을 나타내는 문자 R(빨간색 볼) 또는 B(파란색 볼)가 공백 없이 주어진다. 문자열에는 R 또는 B 중 한 종류만 주 www.acmicpc.net 2. 풀이 볼이 모여있는 뭉탱이(?)의 갯수가 홀수일 때/짝수일 때 경우의 수를 나눠서 문제를 풀었습니다. 볼 뭉탱이 갯수가 `홀수`일 때 R / BBB / R / B / RRR 이면 뭉탱이가 홀수개 입니다. `하나(R)`은 왼쪽 끝, 오른쪽 끝에 감싸고 있고 `하나는(B)`는 사이에 껴 있습니다. R은 왼쪽 끝(1개), 오른쪽 끝(3개) 중에서 많은 쪽으로..

알고리즘 2023.08.03

모던 자바 인 액션 - CH03. 람다 표현식

들어가기에 앞서 ... 이 장에서는 람다 표현식을 어떻게 만드는지, 어떻게 사용하는지, 어떻게 코드를 간결하게 만들 수 있는지 설명한다. 또한 자바 8 API에 추가된 중요한 인터페이스와 형식 추론 등의 기능도 확인한다. 마지막으로 람다 표현식과 함께 위력을 발휘하는 새로운 기능인 메서드 참조를 설명한다. 3.1 람다란 무엇인가? 람다 표현식은 메서드로 전달할 수 있는 익명 함수를 단순화한 것이라고 할 수 있다. 람다 표현식에는 이름이 없지만, 파라미터 리스트, 바디, 반환 형식, 발생할 수 있는 예외 리스트는 가질 수 있다. 람다의 특징 익명 : 보통의 메서드와 달리 이름이 없다. 구현해야 할 코드에 대한 걱정거리가 줄어든다. 함수 : 람다는 메서드처럼 특정 클래스에 종속되지 않으므로 함수라고 부른다...

JAVA 2023.07.30

모던 자바 인 액션 - CH02. 동작 파라미터화 코드 전달하기

들어가기에 앞서.. 동작 파라미터화란 아직은 어떻게 실행할 것인지 결정하지 않은 코드 블록을 의미한다.이 코드 블록은 나중에 프로그램에서 호출한다. 즉, 코드 블록의 실행은 나중으로 미뤄진다. 나중에 실행될 메서드의 인수로 코드 블록을 전달할 수 있다. 결과적으로 코드 블록에 따라 메서드의 동작이 파라미터화 된다. 따라서, 변화하는 요구 사항에 유연하게 대응할 수 있다. 그런데, 동작 파라미터화를 추가하려면 쓸데없는 코드가 늘어난다. 자바 8은 이 문제를 람다 표현식으로 해결한다. 2.1 변화하는 요구사항에 대응하기 하나의 예제를 선정한 다음에 예제 코드를 점차 개션하면서 유연한 코드를 만드는 모범사례로 설명할 것이다. 기존의 농장 재고목록 애플리케이션에 리스트에서 녹색 사과만 필터링하는 기능을 추가한다..

JAVA 2023.07.29

모던 자바 인 액션 - CH01. 자바 8, 9, 10,11 : 무슨 일이 일어나고 있는가?

1.1 역사의 흐름은 무엇인가? 가장 큰 변화는 자바 8에서 일어남 멀티코어 CPU 대중화가 영향을 미침 -> 자바8은 간결한 코드, 멀티코어 프로세서의 쉬운 활용을 바탕으로 탄생 스트림 API - 병렬 연산을 지원 메서드 코드를 전달하는 기법 - 새롭고 간결한 방식으로 동작 파라미터화를 구현 가능 인터페이스의 디폴트 메서드 자바 8은 함수형 프로그래밍에서 위력을 발휘한다. 1.2 왜 아직도 자바는 변화하는가? 특정 분야에서 장점은 가진 언어는 다른 경쟁 언어를 도태시킨다. 1.2.1 프로그래밍 언어 생태계에서 자바의 위치 이전에 자바는 객체지향 모델 덕분에 대중적인 프로그래밍 언어로 성장할 수 있었다. 하지만 이후에, 빅데이터를 효과적으로 처리할 필요성이 커졌다. 이전의 자바로는 충분히 대응할 수 없었..

JAVA 2023.07.25