🙏 16. Anagram(아나그램 : 구글 인터뷰 문제)
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보다는 기초 문법으로 문제를 풀어야 하는가?
- 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에도 있다면 인덱스만 가져와서 지워주도록 했다.