😈 알고리즘/🍃 인프런 #1

🙏 16. Anagram(아나그램 : 구글 인터뷰 문제)

Buᐢ༝ᐢy 2023. 3. 6. 18:00

it 취업을 위한 알고리즘 문제풀이 입문 (with C/C++) : 코딩테스트 대비 - 인프런 | 강의

모든 문제에 대한 저작권은 위 강의에 있습니다.

문제

자연수 N이 입력되면 1부터 N까지의 수 중 M의 배수합을 출력하는 프로그램을 작성하세요.

입력 설명

첫 줄에 자연수 N과 M이 차례대로 입력됩니다.(3<=M<N<=1000)

출력 설명

첫 줄에 M의 배수합을 출력한다.

입력 예제 1

15 3

제출 코드

2023년 2월 1일

#include <iostream>

using namespace std;

int main() {
	
	int N = 0;
	int M = 0;
	int sum = 0;
	
	cin >> N >> M;
	
	for(int i = 1; i <= N; i++)
	{
		if(i % M == 0)
			sum += i;
	}
	
	cout << sum;
	
	return 0;
}

풀이

16. Anagram(아나그램 : 구글 인터뷰 문제)


2023년 2월 7일

#include <iostream>

using namespace std;

int main()
{
		char A[101] = {};
		char B[101] = {};
	
		cin.getline(A, 101);
		cin.getline(B, 101);
	
		string result = "YES";
	
		for (int i = 0; A[i] != '\\0'; i++)
		{
				for (int j = 0; B[j] != '\\0'; j++)
				{
						if (B[j] == A[i])
						{
								B[j] = -1;
								break;
						}
				}
		}
	
		for (int i = 0; B[i] != '\\0'; i++)
		{
				if (B[i] != -1)
				{
						result = "NO";
						break;
				}
		}
		cout << result;
		return 0;
}

처음에는 겹치는 문자가 있다면 0으로 넣었었는데, 공백처리가 되어 하단 for문을 돌 때 break가 바로 되어 YES가 나와서 틀렸었다. 그래서 A와 B가 겹치는 문자가 있다면 B 배열 겹치는 문자 자리에 -1을 넣어주어 공백을 막아주도록 했다. 다음에는 넣더라도 ‘0’을 넣거나 0 말고 다른 수를 넣어야겠다.

➕ 추가)

질문을 읽던 중 누군가 나와 같은 고민을 하고 있었다.

<aside> ❓ 1. STL에 너무 의존하는 것 같은데 해당 강의처럼 STL보다는 기초 문법으로 문제를 풀어야 하는가?

  1. main 함수에서만 수행하여 결과가 나오는게 나을지, 함수를 만들어서 수행하는게 나을지?

</aside>

강사님은 그에 대한 명쾌한 대답을 해주셨다. 프로그래머스에서 문제를 풀 때는 **vector**, **string**은 필수조건인 것처럼 풀었었는데 해당 강의를 시작하고서 16번까지 풀고나니 질문자처럼 내가 너무 STL에 의존하는게 아닐까 싶어 웬만하면 STL 사용을 하지 않고 문제를 풀려고 했다. 이제는 STL로 풀 수 있을 거 같다면 그렇게 하도록 해야겠다.

#include <iostream>
#include <string>

using namespace std;

string CompareString(string A, string B)
{
		string result;
		int length = A.length();
	
		for (int i = 0; i < length; i++)
		{
				if (B.find(A[i]) == string::npos)
				{
						return result = "NO";
						break;
				}
				int temp = B.find(A[i]);
				B.erase(B.begin() + temp);
		}
	
		return result = B.length() == 0 ? "YES" : "NO";
}

int main()
{
		string A;
		string B;
	
		cin >> A >> B;
	
		cout << CompareString(A, B);
	
		return 0;
}

이 문제도 for문을 줄이고 함수와 STL을 사용해서 풀 수 있지 않을까 해서 다시 풀어보았다. 여러 번의 시도 끝에 풀게 되었다.

#include <iostream>
#include <string>

using namespace std;

string CompareString(string A, string B)
{
		string result;
		int length = A.length();
	
		for (int i = 0; i < length; i++)
		{
				if (B.find(A[i]) == string::npos)
				{
						return result = "NO";
						break;
				}
				int temp = B.find(A[i]);
				A.erase(A.begin() + temp);
		}
	
		return result = A.length() == 0 ? "YES" : "NO";
}

int main()
{
		string A;
		string B;
	
		cin >> A >> B;
	
		cout << CompareString(A, B);
	
		return 0;
}

처음에 풀었던 코드이다.

처음에 이렇게 풀었을 때에는 에러가 나서 안 됐는데 잘 보면 B에서 A[i] 찾은 내용을 B가 아닌 A에서 찾다보니 A의 길이가 계속 줄어드는데 줄어들기 전만큼 for문을 돌리니 index 범위를 넘어서 그랬던 것이었다.

또, find 함수와 **erase** 함수를 잘 써야 한다. 처음에는 그저 특정 문자를 찾았으면 지우게끔 해주었더니 해당 문자가 문자열에서 전부 사라져버려서 글자수 상관없이 다 지워버리는 바람에 YES가 출력되었다.

#include <iostream>
#include <string>

using namespace std;

string CompareString(string A, string B)
{
		string result;
		int length = A.length();
	
		for (int i = 0; i < length; i++)
		{
				if (B.find(A[i]) != string::npos)
				{
						B.erase(find(B.begin(), B.end(), A[i]), B.end());
				}
		}
	
		return result = B.length() == 0 ? "YES" : "NO";
}

int main()
{
		string A;
		string B;
	
		cin >> A >> B;
	
		cout << CompareString(A, B);
	
		return 0;
}

그래서 A 문자열의 0부터 length까지 순서대로 돌면서 B에도 있다면 인덱스만 가져와서 지워주도록 했다.