[단속 카메라]
https://programmers.co.kr/learn/courses/30/lessons/42884
코딩테스트 연습 - 단속카메라
[[-20,15], [-14,-5], [-18,-13], [-5,-3]] 2
programmers.co.kr
* 조건
- 각 차량별 고속도로 진입 구간과 진출 구간이 주어진다
- 고속도로를 이용하는 모든 차량은 단속 카메라를 한 번은 만나야한다
- 설치할 수 있는 최소의 카메라 수를 출력한다
* 알고리즘
- 최적의 상태가 있으면 계속 진행: 그리디 알고리즘
* 로직(Logic)
- 고속도로에서 벗어나는 시점을 기준으로 오름차순 정렬
- 제일 먼저 고속도로를 벗어나려는 차량부터 고려해야 한 번씩 카메라를 만나게 할 수 있다
- 카메라를 설치하는 구역(section) < 차량의 진입 구간이라면
- 카메라를 설치하고
- 카메라 설치 구역을 해당 차량의 진출 지점으로 갱신한다
import java.util.Arrays;
import java.util.Comparator;
public class Problem_CCTV {
public static void main(String[] args) {
int[][] routes = {
{-20,15}, {-14,-5}, {-18,-13}, {-5,-3}
};
int answer = solution(routes);
System.out.println(answer);
}
public static int solution(int[][] routes) {
int answer = 0;
//고속도로에서 나간 지점을 기준으로 오름차순 정렬
Arrays.sort(routes, new Comparator<int[]>() {
@Override
public int compare(int[] o1, int[] o2) {
return o1[1] - o2[1];
}
});
// 자동차 진입 구간이 카메라 설치 구간을 벗어난다면 카메라 추가
// 카메라 설치 구간을 해당 자동차가 벗어나는 지점으로 갱신
int section = -30000;
for(int[] route : routes){
if(section <= route[0]){
answer++;
section = route[1];
}
}
return answer;
}
}
[정수 삼각형]
https://programmers.co.kr/learn/courses/30/lessons/43105
코딩테스트 연습 - 정수 삼각형
[[7], [3, 8], [8, 1, 0], [2, 7, 4, 4], [4, 5, 2, 6, 5]] 30
programmers.co.kr
* 조건
- 정수값이 입력된 삼각형이 주어진다
- 삼각형 꼭대기에서 바닥까지 이어지면서 대각선으로 이동이 가능하다
- 거쳐간 경로 중 최댓값을 출력한다
* 알고리즘
- DP
* 로직(Logic)
- dp[][] = 삼각형의 각 위치별 누적 값
- 삼각형의 양 끝변은 한 방향으로 가능하기 때문에 먼저 누적값들을 넣어준다
- 이후 양 끝변을 제외한 나머지 값들을 처리한다
- 구하고자 하는 level의 위치를 기준으로, 바로 위의 level에 연결되어있는 2개의 누적 값 중 더 큰 값을 선택하고 더해준다
- 맨 마지막 level에 누적된 값들이 존재하게되고, 이 값들 중 최대 값을 출력한다
public class Problem_Triangle {
public static void main(String[] args) {
int[][] triangle = {
{7}, {3, 8}, {8, 1, 0}, {2, 7, 4, 4}, {4, 5, 2, 6, 5}
};
int answer = solution(triangle);
System.out.println(answer);
}
public static int solution(int[][] triangle) {
int answer = 0;
//행: level, 열: 누적 값
int[][] dp = new int[triangle.length][triangle.length];
//삼각형 양쪽 변들의 누적을 넣어준다
dp[0][0] = triangle[0][0];
for(int i=1; i<triangle.length; ++i){
dp[i][0] = dp[i-1][0] + triangle[i][0];
dp[i][i] = dp[i-1][i-1] + triangle[i][i];
}
//양쪽 변들을 제외한 나머지 값들 처리
for(int i=2; i<triangle.length; ++i){
for(int j=1; j<i; ++j){
dp[i][j] = Math.max(dp[i-1][j-1], dp[i-1][j]) + triangle[i][j];
}
}
//마지막 level의 값들 중 최댓값 출력
for(int i=0; i<dp[triangle.length-1].length; ++i){
answer = Math.max(answer, dp[triangle.length-1][i]);
}
return answer;
}
}
'Algorithm > Problem_프로그래머스' 카테고리의 다른 글
프로그래머스(여행 경로, 저울) - Java (0) | 2019.11.18 |
---|---|
프로그래머스(입국 심사, 이중우선순위 큐) - Java (0) | 2019.11.11 |
프로그래머스(디스크 컨트롤러, 섬 연결하기) - Java (0) | 2019.11.06 |
프로그래머스(단어 변환, 예산) - Java (0) | 2019.11.04 |
프로그래머스(3xn 타일링, 가장 먼 노드) - Java (0) | 2019.11.01 |