250x250
Notice
Recent Posts
Recent Comments
Link
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | 5 | 6 | 7 |
8 | 9 | 10 | 11 | 12 | 13 | 14 |
15 | 16 | 17 | 18 | 19 | 20 | 21 |
22 | 23 | 24 | 25 | 26 | 27 | 28 |
29 | 30 | 31 |
Tags
- D4
- 직무면접
- 알고리즘 문제
- 코딩테스트
- sw expert
- 코테 준비
- the midnight library
- 원서읽기
- MySQL
- 코테
- SQL
- nightroutine
- sw expert academy
- PyQt
- dfs
- 원서읽자
- 코테 대비
- 쉬운 알고리즘 문제
- 완전탐색
- 삼성
- readingbook
- 프로그래머스
- 백준
- 알고리즘
- 원서
- English
- swexpertacademy
- englishbook
- STUDYENGLISH
- BFS
Archives
- Today
- Total
시나브로
9780. 외계인 침공 본문
728x90
이 문제는 전형적인 DP 문제입니다.
하지만, DP에 약한 저는 타블로그를 참고하여 포인트를 얻었습니다. ㅠㅜ
Solution
문제를 읽어보면, 2가지의 규칙을 찾을 수 있습니다.
- 침공당한 도시의 인접한 도시는 침공할 수 없다. -> 침략을 하면 무조건 한칸은 뛰어야한다.
- 도시는 침공 당한 도시와 당하지 않는 도시로 나뉘어진다.
이 두가지 규칙을 가지고 DB식을 세울 수 있습니다.
DB[i] = max(DB[i-1],DB[i-2]+problem[i]);
DB[i]는 i-1번째 도시까지의 max값(DB[i-1])이랑 i-2번째 도시를 방문하고 i번째의 도시를 방문하는 값(DB[i-1]+problem[i])을 비교하여 더 큰값을 가지면 됩니다.
Key Point
- 왜인지 모르겠지만, 타임오버가 났다. 이를 해결하기위해서 cin/cout을 printf/scanf로 바꾸었습니다.
- 총 2가지의 솔류션을 생각했습니다. 10^6까지의 배열을 만들기에는 공간이 낭비된다고 생각하여 필요한 값 3가지(2번째 전 값, 1번째 전 값, 현재 값)를 가지는 배열을 선언하였습니다.
- 또한, 입력은 받는 즉시 계산을 하기 때문에 데이터량만큼 도는 for이 한개만 존재하게 됩니다.
#include <stdio.h>
long long max(long long a,long long b) {
return a > b ? a : b;
}
long long list[1000010];
int main(void) {
long long tc = 0;
scanf("%lld", &tc);
long long box;
long long number = 0;
for (int i = 0; i < tc; i++) {
scanf("%lld", &number);
scanf("%lld",&list[1]);
list[0]=0;
for (int j = 1; j < number; j++) {
scanf("%lld",&list[j+1]);
list[j+1]= max(list[j+1] + list[j-1], list[j]);
}
printf( "#%d %lld\n", i+1,list[number]);
}
return 0;
}
#include <stdio.h>
#include <iostream>
using namespace std;
long long max(int a,int b) {
return a > b ? a : b;
}
int main(void) {
long long tc = 0;
scanf("%lld", &tc);
for (int i = 0; i < tc; i++) {
long long number = 0;
scanf("%lld", &number);
long long list[3] = { 0 };
long long box;
scanf("%lld", &list[1]);
for (int j = 1; j < number; j++) {
scanf("%lld", &list[2]);
box = max(list[0] + list[2], list[1]);
list[0] = list[1];
list[1] = box;
list[2] = 0;
}
printf("#%d %lld\n", i + 1, max(list[0], list[1]));
}
return 0;
}
728x90
'알고리즘 > SW Expert Academy' 카테고리의 다른 글
3813. [Professional] 그래도 수명이 절반이 되어서는... (0) | 2021.04.13 |
---|---|
1949. [모의 SW 역량테스트] 등산로 조성 (0) | 2020.12.02 |
9778. 카드 게임 (0) | 2020.05.19 |
1859. 백만 장자 프로젝트 (0) | 2020.05.17 |
[D5] 9015. 배열의 분할 (0) | 2020.03.18 |
Comments