알고리즘

알고리즘

좌표 2배로 관리하기

문제 프로그래머스 코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요. programmers.co.kr 프로그래머스 코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요. programmers.co.kr 재정의 아이템 줍기 문제이다. 사각형이 겹친 형태로 있을 때, 가장 외곽라인들의 총합을 길로 정한다. 이 길에서 최단거리로 목표지점 까지 도달하는 방법을 구하는 문제. 최단거리이고 가중치가 다 동일하므로, BFS로 최단 거리를 구할 수 있다. 겹친 사각형에서 어떻게 루트를 구할 것인가가 관건인 문제. 사각형의..

알고리즘

최단 경로 관리하기

문제 9370번: 미확인 도착지 (취익)B100 요원, 요란한 옷차림을 한 서커스 예술가 한 쌍이 한 도시의 거리들을 이동하고 있다. 너의 임무는 그들이 어디로 가고 있는지 알아내는 것이다. 우리가 알아낸 것은 그들이 s지점에서 www.acmicpc.net 1719번: 택배 명우기업은 2008년부터 택배 사업을 새로이 시작하기로 하였다. 우선 택배 화물을 모아서 처리하는 집하장을 몇 개 마련했지만, 택배 화물이 각 집하장들 사이를 오갈 때 어떤 경로를 거쳐야 하 www.acmicpc.net 재정의 택배택배 문제는 상대적으로 심플하다. A에서 B로 최단거리로 이동할려면 어느 노드로 가야하는지 구하면 된다. 즉, 최단거리 갱신 타이밍에 가야할 노드도 갱신한다. 미확인 도착지 주어지는 후보노드들의 최단 거리를..

알고리즘

DP를 정의 하는 방법

문제 2302번: 극장 좌석 주어진 조건을 만족하면서 사람들이 좌석에 앉을 수 있는 방법의 가짓수를 출력한다. 방법의 가짓수는 2,000,000,000을 넘지 않는다. (2,000,000,000 < 231-1) www.acmicpc.net 재정의 경우의 수를 활용하여 풀려고 하니 쉽지 않았다. 단순 곱사건(동시에 일어나는 사건)이 아니라, 합사건도 같이 일어나기 때문이다. 이는 완전 탐색을 요구하고, 상태 공간의 중복이 발생한다. 그냥 DP를 사용하려고 하니, 상태 공간의 정의가 마음에 들지 않았다. 손으로 작성 해 보니 어떤 상태 공간을 사용할지 찾을 수 있었다. 역시 DP각은 손으로 써서 봐야 잘 보인다. 재귀 함수로 문제 정의하기 완전 탐색을 해야함을 인지 했으니, 일단 재귀 함수로 간단하게 정의를..

알고리즘

UnionFind와 순서 강제로 탐색하기

문제 & 재정의 2583번: 영역 구하기 첫째 줄에 M과 N, 그리고 K가 빈칸을 사이에 두고 차례로 주어진다. M, N, K는 모두 100 이하의 자연수이다. 둘째 줄부터 K개의 줄에는 한 줄에 하나씩 직사각형의 왼쪽 아래 꼭짓점의 x, y좌표값과 오 www.acmicpc.net 위 문제는 상하좌우 방향에 인접한 블럭들의 크기를 구하는 전형적인 탐색 문제이다. UnionFind로 탐색하기 탐색이 가능한 것은 (x, y)를 기준으로 (x+-1, y)와 (x, y+-1) 총 4개의 경우로 탐색이 가능하다. 이 상하좌우 인접을 하나하나 탐색하는게 아니라, 각각의 그룹으로 묶을 수 있다면? 그룹별 크기를 구하는건 자연스럽게 할 수 있다. 그룹으로 묶는 방법은 여러가지가 있지만 MST를 구현할 때 사용하는 Un..

알고리즘

날짜 비교하기

문제 & 재정의 2457번: 공주님의 정원 첫째 줄에는 꽃들의 총 개수 N (1 ≤ N ≤ 100,000)이 주어진다. 다음 N개의 줄에는 각 꽃이 피는 날짜와 지는 날짜가 주어진다. 하나의 날짜는 월과 일을 나타내는 두 숫자로 표현된다. 예를 들어서, www.acmicpc.net 이전 글인 Greedy에서 상위/하위 호환 처리하기와 동일한 문제이다. Day로 표현하기 일년을 365일이라 칭하는 것 처럼, 일 단위로 표현하는 방법. month_per_day = [0, 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31] def date_to_sum(month: int, day: int) -> int: return sum(month_per_day[1:month]) + day..

알고리즘

Greedy에서 상위/하위 호환 처리하기

문제 2457번: 공주님의 정원 첫째 줄에는 꽃들의 총 개수 N (1 ≤ N ≤ 100,000)이 주어진다. 다음 N개의 줄에는 각 꽃이 피는 날짜와 지는 날짜가 주어진다. 하나의 날짜는 월과 일을 나타내는 두 숫자로 표현된다. 예를 들어서, www.acmicpc.net 재정의 3월 1일부터 11월 30일까지를 커버하는 최소의 꽃 개수 구하기. 1. x월 y일을 비교할 수 있게 정량화 하기. 2. 늦게 끝나는 순, 일찍 시작하는 순으로 정렬하기 (상위 호환 처리를 위해) 3. 정렬된 꽃을 11월 30일이 될 때 까지, 하나씩 집기. 월과 일을 정량화 하는 방법은 무수히 많지만, 두 가지 형태를 주로 사용한다. 날짜 비교하기 이 글에서 설명 된 방식 중, Day로 표현하는 방식을 사용 한다. 탐색의 중복 ..

알고리즘

DP 역추적 하기

문제 & 재정의 2662번: 기업투자 어떤 투자가가 여러 기업들에게 돈을 투자해서 최대의 이익을 얻고자 한다. 단, 투자는 만원 단위로 할 수 있으며 각 기업은 많이 투자할수록 많은 이익을 투자가에게 돌려준다. 돈을 투자하지 www.acmicpc.net 이전의, 인덱스로 상태관리하기 글의 문제와 동일하다. Tabulation으로 DP Tabulation으로 DP를 하게 되면, 상태 공간을 적층식으로 만들어 가게 된다. 즉, 현재 상태공간이 어느 상태공간에서 전이 됐는지 로직상에서 확인이 된다. 이는 적층식으로 전이 되는 과정에서, Path도 전이시켜 따로 관리하면 단순하게 해결할 수 있다. dp = [[0] * (n+2) for _ in range(m+2)] path = [[0] * (n+2) for _..

알고리즘

Index로 상태 공간 정의하기

문제 2662번: 기업투자 어떤 투자가가 여러 기업들에게 돈을 투자해서 최대의 이익을 얻고자 한다. 단, 투자는 만원 단위로 할 수 있으며 각 기업은 많이 투자할수록 많은 이익을 투자가에게 돌려준다. 돈을 투자하지 www.acmicpc.net 재정의 두 가지 제약 조건이 존재한다. 정해진 투자액수만큼 투자 한다. 한 기업에는 한 번만 투자할 수 있다. 금액의 조합을 정해야 하고, 기업의 조합도 정해야 한다. 완전 탐색을 활용한다. 비 효율적인 상태공간 정의 완전 탐색을 해야하는 문제이다. 상태 공간을 기업의 개수, 남은 금액으로 단순하게 정의 했다. 그렇게 되면 다음과 같이 코드가 구성 된다. 다음 코드의 문제점이 무엇인지 생각 해 보자... def get_max_profit() -> List[int]:..

프로그래밍 언어/Java

(Python -> Java) 2차원 배열과 정렬

1. 기존 Python 코드 해야할 기능은 다음과 같다. 2차원 배열로 데이터 저장하기 2차원 배열 정렬하기 2차원 배열 순회하기 2. Java 변환 시도 3. 다른 사람의 Java 코드 빠른 입력 일반 Scanner가 아니라, InputStreamReader -> Bufferedreader로 해야 빠른 것 같다. readLine으로 한 줄 입력을 받고, 바로 parse하거나 또는 StringTokenizer로 문자열을 공백기준으로 split 하고 각각 parse한다. Comparable을 implements하는 클래스 그냥 무지성으로 2차원 배열을 만들었었다. [x, y] 좌표를 가지는 배열 하나, 이 배열들의 배열로 2차원으로 말이다. Java는 oop에 충실한 언어인 만큼, [x, y]를 배열로 하..

코딩 악귀
'알고리즘' 태그의 글 목록