전체 글 649

[PS] BOJ1515 수 이어 쓰기 ( 그리디 ) with JAVA

1515번: 수 이어 쓰기 세준이는 1부터 N까지 모든 수를 차례대로 공백없이 한 줄에 다 썼다. 그리고 나서, 세준이가 저녁을 먹으러 나간 사이에 다솜이는 세준이가 쓴 수에서 마음에 드는 몇 개의 숫자를 지웠다. 세준 www.acmicpc.net ◎ 문제풀이 1부터 N까지 공백없이 이어붙인 수열에서 임의로 몇 개의 수가 제거되었을 때, 제거된 수열만보고 N의 최솟값을 알아내는 문제이다. 수열의 좌측의 수부터 하나씩 그 수를 포함하는 수의 최솟값을 구하면된다. 134211 이 임의로 제거된 수열이라고 해보자. 가장 좌측인 1을 포함하는 수의 최솟값은 1이다. 그 다음 3을 포함하는 수의 최솟값은 3이다. 그 다음 5를 포함하는 수의 최솟값은 5이다. 그 다음 2를 포함하는 수의 최솟값은 2이다. 그 다음..

문제풀이/Greedy 2024.01.26

[OS] 가상메모리(Virtual Memory)란?

가상메모리에 대해서 알아보기 전에, 우선 CPU부터 간략히 알아보자. 32bit CPU, 64bit CPU라는 말을 많이 들어보았을 것이다. 여기서 32bit와 64bit는 무엇일까? 바로. CPU가 접근할 수 있는 메모리(RAM) 주소범위이다. 1bit가 0 과 1 , 2가지 경우를 표현하므로 32bit는 232가지 경우를 표현할 수 있다. 1GB는 230 가지 경우를 표현하므로, 232 = 22 x 230 = 4GB 정리하면, 32bit CPU는 4GB 메모리에 접근 가능하고 64bit CPU는 264 = 232 x 232 = 4GB X 4GB = 16GB 메모리에 접근가능하다. 그럼 이제 32bit CPU를 예로 들어 가상메모리 기법에 대해서 알아보자. ( 64bit도 원리는 동일하다. ) 가상메모..

CS/OS 2024.01.25

[자료구조] 우선순위큐에 비교로직 전달하기

JAVA에서 우선순위 기준이 복잡할 때, 정렬을 위해 주로 사용하는 자료구조가 우선순위큐(PriorityQueue)이다. 우선순위큐가 내가 원하는 우선순위대로 정렬하려면, 비교로직을 우선순위큐에 전달해야 한다. 이번 포스팅은 우선순위큐에 비교로직을 전달하는 방법을 알아보겠다. 예시 정렬기준 ( 여러 단어를 3가지 기준으로 정렬한다. ) 자주 나오는 단어일수록 앞에 배치한다. 해당 단어의 길이가 길수록 앞에 배치한다. 알파벳 사전 순으로 앞에 있는 단어일수록 앞에 배치한다 1) Comparable 인터페이스 우선순위큐는 객체를 기준으로 정렬하는데, 객체가 자체적인 정렬기준을 가지고 있으면 우선순위큐가 알아서 참조하여 정렬한다. 객체가 자체적인 정렬기준을 가지려면 Comparable 인터페이스를 구현해서 c..

[PS] BOJ20920 영단어 암기는 괴로워 ( 해시 ) with JAVA

20920번: 영단어 암기는 괴로워 첫째 줄에는 영어 지문에 나오는 단어의 개수 $N$과 외울 단어의 길이 기준이 되는 $M$이 공백으로 구분되어 주어진다. ($1 \leq N \leq 100\,000$, $1 \leq M \leq 10$) 둘째 줄부터 $N+1$번째 줄까지 외울 단 www.acmicpc.net ◎ 문제풀이 우선순위로 주어진 3가지 조건에 부합하도록 단어를 나열하는 문제이다. 우선순위가 한 가지가 아니라 3가지를 한번에 고려하여 정렬을 해야하므로 우선순위큐를 발상하였다. 또한 가장 높은 우선순위 조건이 가장 자주 나오는 단어이므로, 동일한 단어가 등장할 때마다 O(1) 시간복잡도로 카운트할 수 있도록 해시맵을 이용하였다. ◎ 코드 import java.io.*; import java.ut..

문제풀이/Hash 2024.01.24

[PS] BOJ15686 치킨 배달 ( 백트래킹 ) with JAVA

15686번: 치킨 배달 크기가 N×N인 도시가 있다. 도시는 1×1크기의 칸으로 나누어져 있다. 도시의 각 칸은 빈 칸, 치킨집, 집 중 하나이다. 도시의 칸은 (r, c)와 같은 형태로 나타내고, r행 c열 또는 위에서부터 r번째 칸 www.acmicpc.net ◎ 문제풀이 2차원 배열에 존재하는 치킨집들에서 M개의 경우를 선택하여 그중 치킨거리가 최소인 거리를 구하는 것이다. N개중 M개를 뽑는 모든 경우를 탐색하는 가장 좋은 방법은 재귀호출을 이용하는 것이다. 재귀호출을 이용하여 가장 적합한 경우를 구하는 문제는 백트래킹(BackTracking)을 활용하면 좋다. 백트래킹은 현재 상태에서 다음상태로 가는 모든 경우의 수를 찾아서 이 모든 경우의수가 더 이상 유망하지 않다고 판단되면 이전의 상태로 ..

[PS] BOJ16236 아기상어 ( 구현 ) with JAVA

16236번: 아기 상어 N×N 크기의 공간에 물고기 M마리와 아기 상어 1마리가 있다. 공간은 1×1 크기의 정사각형 칸으로 나누어져 있다. 한 칸에는 물고기가 최대 1마리 존재한다. 아기 상어와 물고기는 모두 크기를 가 www.acmicpc.net ◎ 문제풀이 문제요약 : 2차원 배열에서 아기상어가 상하좌우로 이동하여 가장 가까운(가장 우선순위가 높은) 먹이를 먹을 때, 먹이를 더이상 먹지 못하고 엄마상어를 부를 때까지 걸리는 시간을 구하라. 문제풀이 : 상하좌우로 이동하며 가장 가까운 먹이를 찾는다는 점에서 최단거리를 구하는 BFS를 떠올렸다. BFS까지는 떠올렸으나 일반적인 BFS 코드로는 먹이를 먹는 우선순위를 적용하기 힘들었다. 일반큐가 아닌 우선순위큐를 사용하여 조건에 맞는 가장 가까운 먹이..

[PS] BOJ9466 텀프로젝트 ( DFS ) with JAVA

9466번: 텀 프로젝트 이번 가을학기에 '문제 해결' 강의를 신청한 학생들은 텀 프로젝트를 수행해야 한다. 프로젝트 팀원 수에는 제한이 없다. 심지어 모든 학생들이 동일한 팀의 팀원인 경우와 같이 한 팀만 있을 www.acmicpc.net ◎ 문제풀이 문제요약 : 학생들이 원하는 팀원 정보가 그래프로 주어질 때, 싸이클을 형성하면 팀으로 구성된다. 싸이클을 형성하지 못하는 팀원의 수를 구하라. 문제풀이 : - 방향그래프에서 싸이클을 찾는 문제이므로 DFS를 발상하였다.( 무방향 그래프에서 싸이클을 찾는 문제는 UNION-FIND 알고리즘 사용 ) - 방문여부 배열과 싸이클 여부 배열로 DFS 로직을 구성하였다. - 탐색과정에서 이미 방문한 노드를 다시 접근하면 싸이클이 형성된다. - 싸이클 여부가 결정..

[OS] 비동기(Async)와 동기(Sync)

비동기(Async)와 동기(Sync) 비동기(Async)란 지금 당장 호출(call)은 해야 하지만 결과는 나중에(back) 받아도 되는 경우에 사용된다. 반대로 동기(Sync)는 지금 요청하고 결과도 받아야 하는 경우 사용한다. 예를들어, 요리에 바쁜 어머니가 아들한테 그릇 세팅하라고 시키는 것은 비동기이다. 그릇은 미리 세팅되어 있으면 좋다. 그래서 어머니 스레드는 아들 스레드에게 그릇세팅 로직을 호출(CALL) 했고 아들은 어머니가 요리하고 있는 사이 그릇 세팅을 완료한 다음 어머니에게 알린다(Back). 요리가 끝난 어머니는 세팅되어 있는 그릇에 음식을 담는다. 동기(Sync)의 경우, 라면을 끓일 때, 스프를 넣고 물이 끓어야 면을 넣는다. 이것은 동기다. 스프를 넣는 로직이 수행되고 물이 10..

CS/OS 2024.01.21

[PS] BOJ15686 치킨 배달 ( 구현 ) with JAVA

15686번: 치킨 배달 크기가 N×N인 도시가 있다. 도시는 1×1크기의 칸으로 나누어져 있다. 도시의 각 칸은 빈 칸, 치킨집, 집 중 하나이다. 도시의 칸은 (r, c)와 같은 형태로 나타내고, r행 c열 또는 위에서부터 r번째 칸 www.acmicpc.net ◎ 문제풀이 2차원 배열로 치킨집과 집의 위치가 좌표로 주어질 때, 집과 치킨집의 거리의 총합이 최소인 치킨집 M개를 선별하고, 치킨집 M개와 집 사이 거리의 총합이 최소일 때의 거리를 구하는 문제이다. 치킨집도 최대 13개이니 무식하게 푸는 것이 좋겠다고 생각했다. 1) 치킨집 M개 조합을 모든 경우를 완전탐색한다. ( DFS ) 2) 모든 경우의 조합과 집 사이의 치킨거리를 구한 뒤, 가장 최소인 치킨거리를 출력한다. N개 중이 M개의 조..

[OS] 멀티 프로세스 vs 멀티 스레드

[OS] 프로세스(Process)란 무엇일까? 개발자들은 고급언어( C, C++, JAVA, Python ... )으로 프로그램을 개발한다. 개발자가 고급언어로 소스코드를 작성하면 컴파일러는 소스코드를 컴파일하여 CPU가 이해할 수 있는 저급언어인 어셈블리 lordofkangs.tistory.com 지난 포스팅에서 Process에 대해서 다루어 보았다. Disk에 있는 Program을 CPU로 처리하려면 RAM에 메모리를 할당해야 한다. 메모리 할당은 Process 단위로 이루어진다. 메모리라는 독립적인 공간이 확보되면 CPU로 처리될 준비가 되었다고 볼 수 있다. 여기서 한 가지 고민해보자. 많은 프로그램이 병렬처리를 한다. 병렬처리를 구현하려면 어떻게 해야할까? 1) 멀티 프로세스 2) 멀티 스레드 ..

CS/OS 2024.01.18