티스토리 뷰
it 취업을 위한 알고리즘 문제풀이 입문 (with C/C++) : 코딩테스트 대비 - 인프런 | 강의
강의 저작권으로 인해 문제를 공개하지 않았으며, 답안 코드 혹은 성공한 코드가 작성된 게시글입니다.
21. 카드게임
2023년 2월 8일
<aside> ☝ **CARD GAME RULE 🃏**
- 10번의 라운드가 진행된다
- 가장 높은 카드를 내는 사람이 해당 라운드를 이기며 3점을 가진다. 패자는 0점.
- 같은 수를 내게되면 비기며 각각 1점을 가져간다.
- 총 승점이 큰 사람이 이긴다.
- 다만, 총 승점이 같을 경우 마지막 라운드를 이기는 사람이 이긴다. 고로, 총 승점이 같고 모든 판이 비겨야지만 비긴게 된다. </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 |
댓글