처음에 재귀로 다 돌려봤는데, 역시 시간초과였다.
노트에 채널 목록을 적어서 화살표로 직접 이동시켜봤는데, 문제를 다시 보니 "최소의 이동"이라는 말은 없었다 (!!)
첫 번째 채널부터 화살표를 아래로 계속 이동시키면서(1번 버튼) KBS1 을 찾는다. 찾은 후에는 KBS1을 첫 번째 채널까지 올린다.(4번) KBS2도 1번으로 찾아서 두 번째 채널까지 4번 버튼으로 올리면 된다.
방법의 최대 길이가 500이니 위아래로 화살표가 왕복을 2번 해도 400번이면 충분하다.
그리디는 생각하기 너무 어렵다.
#include <bits/stdc++.h>
using namespace std;
typedef long long int lld;
typedef unsigned long long llu;
#define KBS1 70030
#define KBS2 116686
llu hashValue(char *s){
llu val=0, cr=1;
for(int i=0; s[i]; ++i, cr*=36){
if(s[i]>='0' && s[i]<='9') val += (s[i]-'0')*cr;
else val += (s[i]-'A')*cr;
}
return val;
}
int main(){
int i, n;
scanf("%d ", &n);
llu channel[101];
for(i=0; i<n; ++i){
char s[11];
scanf("%s", s);
channel[i] = hashValue(s);
}
int len = 0, ptr = 0;
char trace[501]={};
while(channel[ptr] != KBS1){
trace[len++] = '1';
ptr += 1;
}
while(ptr != 0){
trace[len++] = '4';
swap(channel[ptr], channel[ptr-1]);
ptr -= 1;
}
while(channel[ptr] != KBS2){
trace[len++] = '1';
ptr += 1;
}
while(ptr != 1){
trace[len++] = '4';
swap(channel[ptr], channel[ptr-1]);
ptr -= 1;
}
puts(trace);
return 0;
}
댓글 없음:
댓글 쓰기