https://www.youtube.com/watch?v=kINK2fJ1Ues
멀티 플레이어 솔루션 계층
Multiplayer playmode로 다수 클라 테스트 가능
Multiplayer Widgets로 방 생성 및 방 접속 테스트 가능

namespace
{
int n, k;
vector<int> nums;
void swap(int idx1, int idx2)
{
int temp = nums[idx1];
nums[idx1] = nums[idx2];
nums[idx2] = temp;
}
// 숫자를 크기 순대로 정렬해야 한다
// 뒤에서부터 순회하며, 역시 역순으로 이중 순회
// 자기보다 작은 놈이 있는 최저 인덱스를 확인
// 최저 인덱스가 역대 최저 인덱스보다 낮으면 갱신
// 이미 정렬돼있다면,
// 같은 숫자가 있다면 그대로 둔다
// 같은 숫자가 없다면 맨 마지막 두 인덱스 교환
// 숫자가 1자리수거나 교환 후 앞자리가 0이라면 return -1
void SwapToMaxVal()
{
if (nums.size() == 1) { nums = { -1 }; return; }
int toIdx = nums.size();
int fromIdx = -1;
for (int i = nums.size()-1; 0 <= i; i--) // 오른쪽
{
for (int j = i - 1; 0 <= j; j--) // 왼쪽
{
if (j <= toIdx && nums[j] < nums[i])
{
if (fromIdx != -1 && i != fromIdx && nums[i] < nums[fromIdx]) continue;
toIdx = j;
fromIdx = i;
}
}
}
if (fromIdx != -1)
{
swap(fromIdx, toIdx);
if(nums[0] == 0) { nums = { -1 }; return; }
}
// 이미 정렬돼있다면
else
{
int pre = -1;
for (int num : nums)
{
if (pre == num) return;
pre = num;
}
swap(nums.size() - 1, nums.size() - 2);
if (nums[0] == 0) { nums = { -1 }; return; }
}
}
}
void B1039::Solution()
{
cin >> n >> k;
// 낮은 자리수의 인덱스가 더 낮은 숫자
while (n > 0)
{
nums.push_back(n%10);
n /= 10;
}
if (nums.size() == 1) cout << -1;
else
{
reverse(nums.begin(), nums.end());
for (int i = 0; i < k; i++)
{
SwapToMaxVal();
}
for (int num : nums)
cout << num;
}
}
고치고 또 고쳐서 18%까진 맞았는데, 그 이상으론 그리디론 도저히 안되겠다.
정석 풀이는 bfs였다. vector를 하나의 노드로 보고, swap하는 걸 엣지로 보는 관점.