[C++] 백준 1985번: 디지털 친구

be_clever·2022년 2월 23일
0

Baekjoon Online Judge

목록 보기
90/172

문제 링크

1985번: 디지털 친구

문제 요약

두 숫자의 각 자릿수에 속해 있는 숫자들의 종류가 모두 같으면 친구라고 한다.
만약 두 수 중 하나에게 인접한 두 자리의 숫자를 증가, 감소시켜서 친구가 되면 거의 친구라고 한다. 단, 증가와 감소는 한번씩 사용해야하며, 맨 앞의 수는 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;
}
profile
똑똑해지고 싶어요

0개의 댓글