티스토리 뷰

반응형

https://www.acmicpc.net/problem/14226

 

14226번: 이모티콘

영선이는 매우 기쁘기 때문에, 효빈이에게 스마일 이모티콘을 S개 보내려고 한다. 영선이는 이미 화면에 이모티콘 1개를 입력했다. 이제, 다음과 같은 3가지 연산만 사용해서 이모티콘을 S개 만

www.acmicpc.net

필요한 배경지식

  • 다익스트라 or BFS
  • DP

 

문제 해결 방법

이모티콘 N개를 만들기 위한 시간의 최소값을 출력하기 위해 다음과 같은 DP배열을 사용했습니다.

 

dp[N][C] = 현재 이모티콘이 N개이고 클립보드에 저장된 이모티콘의 개수가 C개 일때, 필요한 시간의 최솟값

 

이렇게 정의하면 3가지 연산에 대하여 다음과 같은 식이 성립합니다.

현재 이모티콘의 개수가 n, 클립보드에 복사된 이모티콘의 개수가 c 라면

  1. 복사 연산       : dp[n][n] = dp[n][c] + 1
  2. 붙여넣기 연산 : dp[n+c][c] = dp[n][c] + 1
  3. 삭제 연산       : dp[n-1][c] = dp[n][c] + 1

 

저는 문제를 풀때, 삭제가 들어간 연산때문에 첫번째 방문한 값이 최적의 해가 아닐수도 있다고 생각해서 다익스트라를 이용했는데 다른 사람들의 코드를 확인해 보니 위처럼 dp배열을 정의할 경우 단순 BFS로도 풀리는것 같습니다.

 

아래의 제 코드는 다익스트라를 사용한 코드이며 제 코드에서

dp배열을 단순히 방문처리만 하는 배열로 사용하여 BFS로 풀어내면 더 빠른 시간안에 문제를 해결할 수 있습니다.

 

 

 

전체코드

#include<bits/stdc++.h> #define xx first #define yy second using namespace std; using ll = long long; using pii = pair<int,int>; using pll = pair<ll,ll>; using tpi = tuple<int,int,int>; using tpl = tuple<ll,ll,ll>; using dpi = pair<pii,pii>; using dpl = pair<pll,pll>; const int INF = 0x3f3f3f3f; int N; int dp[1005][1005]{}; void bfs(){ ​​​​memset(dp,0x3f,sizeof(dp)); ​​​​priority_queue<tpi, vector<tpi>, greater<tpi>> pq; ​​​​pq.push({0,1,0}); ​​​​dp[1][0] = 0; ​​​​while(!pq.empty()){ ​​​​​​​​int d,n,c; ​​​​​​​​tie(d,n,c) = pq.top(); ​​​​​​​​pq.pop(); ​​​​​​​​ ​​​​​​​​if(dp[n][c] < d) continue; ​​​​​​​​if(dp[n][n] > d+1){ ​​​​​​​​​​​​pq.push({d+1,n,n}); ​​​​​​​​​​​​dp[n][n] = d+1; ​​​​​​​​} ​​​​​​​​ ​​​​​​​​if(n+c < N+2 && dp[n+c][c] > d+1){ ​​​​​​​​​​​​pq.push({d+1,n+c,c}); ​​​​​​​​​​​​dp[n+c][c] = d+1; ​​​​​​​​} ​​​​​​​​if(n-1 > 0 && dp[n-1][c] > d+1){ ​​​​​​​​​​​​pq.push({d+1,n-1,c}); ​​​​​​​​​​​​dp[n-1][c] = d+1; ​​​​​​​​} ​​​​} } int main() { ​​​​ios_base::sync_with_stdio(0); ​​​​cin.tie(0); ​​​​cin>>N; ​​​​ ​​​​bfs(); ​​​​int res = INF; ​​​​for(int i=0; i<N+2; i++){ ​​​​​​​​res = min(res, dp[N][i]); ​​​​} ​​​​cout<<res; }

 

반응형

'알고리즘 공부 > 문제풀이' 카테고리의 다른 글

백준 10564번 - 팔굽혀펴기  (0) 2022.01.13
백준 1256번 - 사전  (0) 2022.01.12
백준 1017번 - 소수 쌍  (0) 2021.06.09
백준 4991번 - 로봇 청소기  (0) 2021.06.01
백준 17142번 - 연구소 3  (0) 2021.05.31
반응형
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
«   2025/04   »
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
글 보관함