Problem
Problem URL : 이모티콘
[1] Answer Code (18. 09. 22)
#include <iostream>
#include <queue>
#include <string>
#define p pair<int,int>
using namespace std;
int visit[1001][1001];
int main(){
ios::sync_with_stdio(0);
cin.tie(0);
int n;
cin >> n;
// 현재 이모티콘수, 클립보드 복사된 값, 시간
queue< pair< pair<int,int> , int > > q;
q.push({ {1,1},1} );
while (! q.empty()) {
int a = q.front().first.first;
int b = q.front().first.second;
int c = q.front().second;
q.pop();
if( a == n ){
cout << c << endl;
break;
}
visit[a][b] = 1;
q.push({p(a,a),c+1});
if(a+b <= 1000 && ! visit[a+b][a+b])
q.push({p(a+b,b),c+1});
if(a-1 > -1 && ! visit[a-1][a-1])
q.push({p(a-1,b),c+1});
}
return 0;
}
Review
-
핵심은 visit[현재 이모티콘의 수][클립보드에 복사된 값]을 신경써줘야한다.
-
처음엔 visit[a] = 1;처럼 단순히 현재 이모티콘 수로만 중복방문을 체크했더니 틀렸다.
-
왜냐하면 현재 이모티콘의 수가 같더라도 클립보드에 들어있는 내용에 따라 그 이후 값이 달라질 수 있기 때문이다.
-
즉 현재 글자뿐아니라 클립보드에 복사된 값까지 고려해줘야한다.