티스토리 뷰

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

강의 저작권으로 인해 문제를 공개하지 않았으며, 답안 코드 혹은 성공한 코드가 작성된 게시글입니다.

21. 카드게임


2023년 2월 8일

<aside> ☝ **CARD GAME RULE 🃏**

  1. 10번의 라운드가 진행된다
  2. 가장 높은 카드를 내는 사람이 해당 라운드를 이기며 3점을 가진다. 패자는 0점.
  3. 같은 수를 내게되면 비기며 각각 1점을 가져간다.
  4. 총 승점이 큰 사람이 이긴다.
  5. 다만, 총 승점이 같을 경우 마지막 라운드를 이기는 사람이 이긴다. 고로, 총 승점이 같고 모든 판이 비겨야지만 비긴게 된다. </aside>

문제를 이해하기까지 시간이 조금 드는 문제였다.

#include <iostream>
#include <vector>
#include <string>

using namespace std;

vector<int> CardGame(vector<int> A, vector<int> B)
{
		vector<int> result;
		int ASum = 0;
		int BSum = 0;
		int winner = 68;
		vector<int> gameResult;
	
		int length = A.size();
		for (int i = 0; i < length; i++)
		{
				if (A[i] > B[i])
				{
						gameResult.push_back(1);
						ASum += 3;
				}
				else if (A[i] < B[i])
				{
						gameResult.push_back(2);
						BSum += 3;
				}
				else
				{
						gameResult.push_back(0);
						ASum++;
						BSum++;
				}
		}
	
		result.push_back(ASum);
		result.push_back(BSum);
	
		if (ASum == BSum)
		{
				for (int i = 9; i > 0; i--)
				{
						if (gameResult[i] == 0)
								continue;
					
						if (gameResult[i] == 1)
						{
								winner = 65;
								result.push_back(winner);
								break;
						}
						else if (gameResult[i] == 2)
						{
								winner = 66;
								result.push_back(winner);
								break;
						}
				}
		}
		else
				winner = ASum > BSum ? 65 : 66;
	
		result.push_back(winner);
	
		return result;
}

int main()
{
		ios_base::sync_with_stdio(false);
		cin.tie(NULL);
		cout.tie(NULL);
	
		vector<int> A(10);
		vector<int> B(10);
	
		char winner = ' ';
		vector<int> result;
	
		int length = A.size();
		for (int i = 0; i < length; i++)
		{
				cin >> A[i];
		}
		for (int i = 0; i < length; i++)
		{
				cin >> B[i];
		}
	
		result = CardGame(A, B);
	
		cout << result[0] << ' ' << result[1] << '\\n';
		cout << (char)result[2];
	
		return 0;
}

처음 푼 코드이다.

다른 방법으로 풀어보자면 다음과 같다.

A, B가 이겼을 때 각각 숫자를 정해서 구분해준다. 회차당 계산할 때마다 마지막으로 누가 이겼는지도 확인한다. 그렇게 되면 내가 짠 코드처럼 한 번 더 for문을 돌 필요가 없다.

22. 온도의 최대값


2023년 2월 8일

#include <iostream>
#include <vector>
#include <algorithm>

using namespace std;

int CheckContinuity(vector<int> temp, int continuity)
{
		int result = 0;
		int length = temp.size();
		vector<int> sum;
	
		for (int i = 0; i < length - continuity + 1; i++)
		{
				int value = 0;
				for (int j = i; j < i + continuity; j++)
				{
						value += temp[j];
				}
				sum.push_back(value);
		}
	
		result = *max_element(sum.begin(), sum.end());
	
		return result;
}

int main()
{
		int N = 0;
		int cont = 0;
		vector<int> temp;
	
		ios_base::sync_with_stdio(false);
		cin.tie(NULL);
	
		cin >> N >> cont;
	
		for (int i = 0; i < N; i++)
		{
				int temperature = 0;
				cin >> temperature;
				temp.push_back(temperature);
		}
		
		cout << CheckContinuity(temp, cont);
		
		return 0;
}

방법은 맞았으나 테스트 케이스 5번에서 시간 초과가 걸린다.

#include <iostream>
#include <vector>

using namespace std;

int main()
{
		int N = 0;
		int continuity = 0;
		int sum = 0;
		int max = 0;
		vector<int> temperature;
	
		cin >> N >> continuity;
	
		for (int i = 0; i < N; i++)
		{
				int temp = 0;
				cin >> temp;
				temperature.push_back(temp);
		}
	
		for (int i = 0; i < continuity; i++)
		{
				sum += temperature[i];
		}
		max = sum;
	
		for (int i = continuity; i < N; i++)
		{
				sum = sum + (temperature[i] - temperature[i - continuity]);
				if (sum > max)
						max = sum;
		}
		cout << max;
	
		return 0;
}

강의를 듣고 다시 작성한 코드이다.

위 코드에 사용된 알고리즘은 슬라이딩 윈도우 알고리즘이다.

점프 투 파이썬

for문을 2개 돌리면 될 거라 생각했는데 이 코드처럼 구할 수 있구나 싶었다.

'😈 알고리즘 > 🍃 인프런 #1' 카테고리의 다른 글

🙏 25, 26번 문제  (0) 2023.02.19
🙏 23, 24번 문제  (0) 2023.02.18
🙏 16, 17, 18, 19, 20번 문제  (0) 2023.02.16
🙏 11, 12번 문제  (0) 2023.02.15
🙏 5, 6, 7, 8, 9, 10, 14, 15번 문제  (0) 2023.02.14
댓글
공지사항
최근에 올라온 글
최근에 달린 댓글
«   2025/07   »
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 31
링크
Total
Today
Yesterday