분류 전체보기 38

[백준/Java] 1707 : 이분 그래프

https://www.acmicpc.net/problem/1707 이번 문제는 그래프 문제입니다. 그래프 문제는 여러가지 유형이 있지만 이번 문제는 '이분 그래프' 입니다. 이분 그래프에 대해 간단히 설명을 하면 모든 정점을 2개의 집합으로 나눌수있으며 하나의 집합 내부 정점들은 서로 이웃이 아닌 집합을 말합니다. 예를 들어 그래프가 1 -> 2 -> 3 -> 4 라고 했을 시 A라는 집합에는 1,3 B라는 집합에는 2,4가 들어간다. 여기서 1,3은 서로 이웃이 아니며 2,4 또한 이웃이 아니다. 이렇게 나타낼 수 있는 그래프를 이분 그래프라 합니다. 구현방법은 처음에는 HashSet을 통해 각각 어느 집단에 넣어주고 확인을 하는 과정을 거쳤지만 이는 시간초과라 해결하지 못하였습니다. 그래서 다른 방식..

알고리즘 2025.02.17

[백준/Java] 11003 : 최솟값 찾기

https://www.acmicpc.net/problem/11003 이번 문제는 자료구조 문제입니다. 이 문제를 해결하기 위해서 우선순위 큐도 사용해보았는데 우선순위 큐는 값을 추가 삭제 할 때마다 O(Log N) 시간복잡도가 발생해 시간초과가 발생할 수 있습니다. 그래서 데이터를 추가 삭제하는데 상수시간인 덱을 활용하였습니다. 실제 데이터를 관리하는 배열과 들어온 인덱스를 관리하는 Deque를 사용하였습니다. Deque에 값을 추가할 때마다 최근에 들어온 값과 비교해 최근에 들어온 값이 더 크다면 그 값을 삭제하고, 추가 후에는 처음에 들어온 값부터 인덱스를 검사해 유효 범위인지 확인을 하는 방식으로 풀이하였습니다. import java.io.*;import java.util.*;import java...

알고리즘 2025.02.17

[백준/Java] 2042 : 구간 합 구하기

https://www.acmicpc.net/problem/2042 이번 문제는 누적합 문제입니다. 누적합 문제의 풀이로는 2가지가 있습니다. 첫 번째는 누적합배열을 사용하는 것이고 두 번째는 세그먼트 트리를 사용하는 방법입니다. 이번에는 두 가지 알고리즘을 큰 차이점만 설명해보겠습니다. 누적합배열은 값이 변경되지 않을 때 효율적입니다. 하지만 값이 변경이 된다면 누적합배열을 다시 갱신해야 하고 변경이 여러번 된다면 시간복잡도가 O(배열길이 * 변경횟수) 이므로 시간초과를 가져올 수 있습니다. 이렇게 값이 변경이 자주 일어난다면 세그먼트 트리를 사용하면 됩니다.세그먼트 트리에서는 자신과 부모 노드만 갱신하여 루트까지 가는 방식으로 O(변경횟수 * log 배열길이)이면 가능합니다. 단점으로는 메모리를 더 사..

알고리즘 2025.02.17

비동기

Thread이 전에 Thread에 대한 개념과 간단한 사용법을 포스팅을 했었습니다. 이 번에는 좀 더 디테일하게 자바에서 제공하는 비동기에 대해서 학습한 내용과 예시 코드를 정리해보겠습니다. 간단하게 스레드를 생성하고 실행하는 클래스입니다. Runnable, Task를 상속받은 클래스를 사용해도 되고, 익명 객체 + 람다 형식으로도 사용할 수 있습니다. 해당 스레드를 종료하기 위해서는 interrupt() 함수를 사용하면 됩니다. interrupt() 메소드는 스레드가 일시 정지 상태에 있을 때 InterruptedException 예외를 발생시키는 역할을 합니다. 이것을 이용하면 Thread의 run() 메소드를 정상 종료시킬 수 있습니다.public static void main(String[] ar..

Thread

Process프로세스란 애플리케이션을 실행하면 운영체제로부터 실행에 필요한 메모리를 할당받아 애플리케이션이 실행되는데, 이를 프로세스라고 합니다. 하나의 애플리케이션은 멀티 프로세스를 만들기도 합니다. 예를 들어 메모장 애플리케이션을 2개 실행했다면 2개의 메모장 프로세스가 생성된 것입니다. Thread운영체제는 두 가징 이상의 작업을 동시에 처리하는 멀티 태스킹을 할 수 있도록 CPU 및 메모리 자원을 프로세스마다 적절히 할당해주고, 병렬로 실행시킵니다. 하나의 프로세스가 두 가지 이상의 작업을 처리하는 방법은 멀티 스레드입니다. 스레드는 하나의 코드 실행 흐름이기 때문에 한 프로세스 내에 스레드가 2개라면 2개의 코드 실행 흐름이 생긴다는 의미입니다. 멀티 프로세스는 운영체제에서 할당받은 자신의 메모..

[백준/Java] 9012 : 괄호

https://www.acmicpc.net/problem/9012 문자열을 끊어 받으면서 단순하게 '(' 가 들어오면 stack에 push해주고 ')' 가 들어오면 stack에 pop을 해주는데 stack이 비워져 있으면 'NO' 출력 후 반복문을 종료하면 된다. 반복문이 끝까지 돌았을 경우에는 stack의 사이즈를 가져와 0이면 'YES' 0이 아니면 '('가 ')' 보다 많은 경우 이기 때문에 'NO' 출력을 하면 된다. import java.io.BufferedReader;import java.io.IOException;import java.io.InputStreamReader;import java.util.Stack;public class Baekjoon_9012_괄호 { public static..

알고리즘 2025.02.16

[백준/Java] 10828 : 스택

https://www.acmicpc.net/problem/10828 입력값 중에서 4개는 하나의 단어로 이루어져있으므로 해당되면 다음 i로 넘어가도록 continue를 해놓고, 남은 한 가지의 경우에는 두 단어 이루어져있으므로 StringTokenizer로 받아서 문제를 풀이하였다. import java.io.BufferedReader;import java.io.IOException;import java.io.InputStreamReader;import java.util.Stack;import java.util.StringTokenizer;public class Baekjoon_10828_스택 { public static void main(String[] args) throws NumberFormatEx..

알고리즘 2025.02.16