두 숫자의 각 자릿수에 속해 있는 숫자들의 종류가 모두 같으면 친구라고 한다.
만약 두 수 중 하나에게 인접한 두 자리의 숫자를 증가, 감소시켜서 친구가 되면 거의 친구라고 한다. 단, 증가와 감소는 한번씩 사용해야하며, 맨 앞의 수는 0이 될 수 없다.
두 수가 주어지면 두 수의 친구관계를 출력해야 한다.
두 수 각각에 인접한 자릿수를 증가, 감소시키는 것을 총 4번하면 되는 간단한 구현 문제입니다. 감소시킬 수는 0보다는 커야하며, 증가시킬 수는 1보다는 작아야 합니다.
쉬운 문제였는데, memset()을 사용할 때 터무니 없는 실수를 저질러서 여러번 틀렸습니다.
memset(array, false, sizeof(array));
와 같이 쓰려고 머리는 생각을 했는데, 손이
memset(array, false, sizeof(false));
이런식으로 타이핑을 해버렸습니다. 이걸 찾지 못해서 재차 틀리는 일을 겪었습니다.
#include <bits/stdc++.h>
using namespace std;
bool is_friends(string& x, string& y)
{
bool flag1[10], flag2[10];
memset(flag1, false, sizeof(flag1));
memset(flag2, false, sizeof(flag2));
for (auto& i : x)
flag1[i - '0'] = true;
for (auto& i : y)
flag2[i - '0'] = true;
for (int i = 0; i < 10; i++)
if (flag1[i] != flag2[i])
return false;
return true;
}
bool fix_numbers(string& x, string& y)
{
for (int i = 0; i < x.size() - 1; i++)
{
if (x[i] > '0' && x[i + 1] < '9')
{
x[i]--;
x[i + 1]++;
if (is_friends(x, y) && x[0] != '0')
{
cout << "almost friends\n";
return true;
}
x[i]++;
x[i + 1]--;
}
if (x[i] < '9' && x[i + 1] > '0')
{
x[i]++;
x[i + 1]--;
if (is_friends(x, y))
{
cout << "almost friends\n";
return true;
}
x[i]--;
x[i + 1]++;
}
}
return false;
}
int main(void)
{
ios::sync_with_stdio(false);
cin.tie(0);
cout.tie(0);
for (int i = 0; i < 3; i++)
{
string x, y;
cin >> x >> y;
if (is_friends(x, y))
{
cout << "friends\n";
continue;
}
if (fix_numbers(x, y))
continue;
if (fix_numbers(y, x))
continue;
cout << "nothing\n";
}
return 0;
}