삼성은 난이도가 적혀 있어서 문제를 고르기 수월한데 백준은... 좀 난해 하다
혹시 문제 고르는 요령이 있다면 댓글로 적어주길 바란다.
RGB거리에 사는 사람들은 집을 빨강, 초록, 파랑중에 하나로 칠하려고 한다. 또한, 그들은 모든 이웃은 같은 색으로 칠할 수 없다는 규칙도 정했다. 집 i의 이웃은 집 i-1과 집 i+1이고, 첫 집과 마지막 집은 이웃이 아니다.
각 집을 빨강으로 칠할 때 드는 비용, 초록으로 칠할 때 드는 비용, 파랑으로 드는 비용이 주어질 때, 모든 집을 칠하는 비용의 최솟값을 구하는 프로그램을 작성하시오.
첫째 줄에 집의 수 N이 주어진다. N은 1,000보다 작거나 같다. 둘째 줄부터 N개의 줄에 각 집을 빨강으로, 초록으로, 파랑으로 칠하는 비용이 주어진다. 비용은 1,000보다 작거나 같은 자연수이다.
첫째 줄에 모든 집을 칠하는 비용의 최솟값을 출력한다.
이번 문제는 47%퍼센트의 정답률을 기록하고 있는 문제로 상당히 간단해 보인다.
알고리즘은
1. 행렬을 입력 받고 새로운 거리 행렬을 만듬
2. 첫번째 행은 0 0 0으로 초기화
3. 1행 부터 만들어 나감 이 전 행과 똑같지 않은 두 개중 작은 것을 골라 더하기
4. 거리 행렬을 마지막까지 만든 후에 마지막 행중 가장 작은 것 출력
코드
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 | #include <iostream> using namespace std; int N,MIN; int MAP[1001][3], dist[1001][3]; int main() { cin.tie(NULL); cout.tie(NULL); ios_base::sync_with_stdio(false); cin>>N; for(int i=1;i<=N;i++) for(int j=0;j<3;j++) cin>>MAP[i][j]; for(int i=1;i<=N;i++) { dist[i][0] = min(dist[i-1][1], dist[i-1][2]) + MAP[i][0]; dist[i][1] = min(dist[i-1][0], dist[i-1][2]) + MAP[i][1]; dist[i][2] = min(dist[i-1][0], dist[i-1][1]) + MAP[i][2]; } MIN = min(dist[N][0],min(dist[N][1], dist[N][2])); cout<<MIN<<'\n'; return 0; } | cs |
10610. 30 (0) | 2020.02.01 |
---|---|
7576. 토마토 (0) | 2020.01.20 |
2749. 피보나치 수 3 (0) | 2020.01.19 |
9020. 골드바흐의 추측 (0) | 2020.01.19 |
1261. 알고스팟 (0) | 2020.01.13 |
댓글 영역