티스토리 뷰

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보다는 기초 문법으로 문제를 풀어야 하는가?

  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에도 있다면 인덱스만 가져와서 지워주도록 했다.

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번)

  1. A가 이기는 경우 (= 분기분 3번)
    • A 주먹 VS B 가위
    • A 가위 VS B 보
    • A 보 VS B 주먹
  2. 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
댓글
공지사항
최근에 올라온 글
최근에 달린 댓글
«   2025/06   »
1 2 3 4 5 6 7
8 9 10 11 12 13 14
15 16 17 18 19 20 21
22 23 24 25 26 27 28
29 30
링크
Total
Today
Yesterday