티스토리 뷰
it 취업을 위한 알고리즘 문제풀이 입문 (with C/C++) : 코딩테스트 대비 - 인프런 | 강의
강의 저작권으로 인해 문제를 공개하지 않았으며, 답안 코드 혹은 성공한 코드가 작성된 게시글입니다.
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에도 있다면 인덱스만 가져와서 지워주도록 했다.
17. 선생님 퀴즈
2023년 2월 7일
#include <iostream>
using namespace std;
string CorrectOrNot(int num, int sum)
{
string result;
int correctSum = 0;
for (int i = 1; i <= num; i++)
{
correctSum += i;
}
return result = sum == correctSum ? "YES" : "NO";
}
int main()
{
int N = 0;
cin >> N;
for (int i = 0; i < N; i++)
{
int num = 0;
int sum = 0;
cin >> num >> sum;
cout << CorrectOrNot(num, sum) << '\\n';
}
return 0;
}
18. 층간소음
2023년 2월 7일
#include <iostream>
using namespace std;
bool CheckVibration(int standard, int vibration)
{
if (standard < vibration)
return true;
else
return false;
}
int main()
{
int N = 0;
int standard = 0;
cin >> N >> standard;
int seconds = 0;
int max = 0;
for (int i = 0; i < N; i++)
{
int vibration = 0;
cin >> vibration;
if (CheckVibration(standard, vibration))
{
seconds++;
if (seconds > max)
max = seconds;
}
else
seconds = 0;
}
cout << max;
return 0;
}
저장할 만한 **int**형 변수 **max**를 만들어주고 범위에 미치지 못하면 **seconds**를 **0**으로 할당해주어 **max**를 쉽게 찾을 수 있도록 했다.
19. 분노 유발자
2023년 2월 7일
#include <iostream>
#include <vector>
#include <algorithm>
using namespace std;
int CheckHeight(vector<int> students)
{
int trigger = 0;
int length = students.size();
for (int i = 0; i < length - 1; i++)
{
int highest = *max_element(students.begin() + i, students.end());
int currentHeight = students[i];
if (highest == students[i])
{
if (find(students.begin() + i + 1, students.end(), highest) != students.end())
continue;
trigger++;
}
}
return trigger;
}
int main()
{
int N = 0;
cin >> N;
vector<int> students;
for (int i = 0; i < N; i++)
{
int student = 0;
cin >> student;
students.push_back(student);
}
cout << CheckHeight(students);
return 0;
}
강의에서는 가장 마지막 사람을 **max** 값으로 두고 앞사람이 더 크면 가린다고 정의했다. 왜냐하면 갱신될 때마다 뒤에 있는 사람들이 현재 회차의 사람보다 다 작다는 것을 의미하기 때문이다.
이렇게 접근하는 방식도 알아야겠다.
20. 가위 바위 보
2023년 2월 7일
#include <iostream>
#include <vector>
using namespace std;
char RSP(int A, int B)
{
if (A == 1)
{
if (B == 1)
return 'D';
else if (B == 2)
return 'B';
else
return 'A';
}
else if (A == 2)
{
if (B == 1)
return 'A';
else if (B == 2)
return 'D';
else
return 'B';
}
else
{
if (B == 1)
return 'B';
else if (B == 2)
return 'A';
else
return 'D';
}
}
int main()
{
int N = 0;
cin >> N;
vector<int> A;
vector<int> B;
for (int i = 0; i < N; i++)
{
int temp = 0;
cin >> temp;
A.push_back(temp);
}
for (int i = 0; i < N; i++)
{
int temp = 0;
cin >> temp;
B.push_back(temp);
}
for (int i = 0; i < N; i++)
{
cout << RSP(A[i], B[i]) << '\\n';
}
return 0;
}
훨씬 간단하게 분기문으로 결과를 만드는 방법이 있었다.
<aside> 👉 1. 비기는 경우 (= 분기분 1번)
- A가 이기는 경우 (= 분기분 3번)
- A 주먹 VS B 가위
- A 가위 VS B 보
- A 보 VS B 주먹
- else 그 외 : B가 이기는 경우 (= else)
</aside>
이렇게 하면 분기문이 총 5개로 끝난다.
'😈 알고리즘 > 🍃 인프런 #1' 카테고리의 다른 글
🙏 23, 24번 문제 (0) | 2023.02.18 |
---|---|
🙏 21, 22번 문제 (0) | 2023.02.17 |
🙏 11, 12번 문제 (0) | 2023.02.15 |
🙏 5, 6, 7, 8, 9, 10, 14, 15번 문제 (0) | 2023.02.14 |
🙏 1 - 4번 문제 (0) | 2023.02.13 |