문제 요약
수포자 3명이 각각의 규칙적인 패턴으로 답을 찍는다.
주어진 정답 배열과 비교하여 가장 많이 맞힌 사람을 구하는 문제.
패턴 반복 처리
answers[i] == listA[i % listA.size()]
- 패턴이 반복되는 구조이기 때문에 % 연산으로 순환 처리
- 별도의 배열 확장 없이 효율적으로 비교 가능
고정된 패턴을 순회할 때 사용하는 기본적인 방법
점수 계산 방식
if (answers[i] == listA[i % listA.size()]) scoreA++;
- 정답과 패턴을 비교하여 맞으면 점수 증가
- 직관적이고 이해하기 쉬운 구조
최대값 판별 방식
int maxScore = max({scoreA, scoreB, scoreC});
if (scoreA == maxScore) answer.push_back(1);
if (scoreB == maxScore) answer.push_back(2);
if (scoreC == maxScore) answer.push_back(3);
- 여러 값을 서로 비교하는 대신 기준값(max)을 먼저 구함
- 기준값과 비교하는 방식으로 로직 단순화
- 동점 처리도 자연스럽게 해결됨
여러 값을 비교할 때는 각각 비교하기보다 기준값을 활용하는 것이 효율적
확장 가능한 구조
vector<vector<int>> patterns = {
{1,2,3,4,5},
{2,1,2,3,2,4,2,5},
{3,3,1,1,2,2,4,4,5,5}
};
vector<int> scores(patterns.size(), 0);
for (int i = 0; i < answers.size(); ++i)
{
for (int j = 0; j < patterns.size(); ++j)
{
if (answers[i] == patterns[j][i % patterns[j].size()])
scores[j]++;
}
}
- 패턴과 점수를 벡터로 관리하여 구조 일반화
- 수포자 수가 늘어나도 코드 수정 없이 대응 가능
- 유지보수성과 확장성이 좋아짐
결과 처리 일반화
int maxScore = *max_element(scores.begin(), scores.end());
for (int i = 0; i < scores.size(); ++i)
{
if (scores[i] == maxScore)
answer.push_back(i + 1);
}
- 점수 배열 기반으로 결과 처리
- 특정 인원 수에 의존하지 않는 구조
정리
- % 연산을 활용해 반복 패턴을 효율적으로 처리할 수 있다
- 여러 값 비교 시 기준값을 먼저 구하면 로직이 단순해진다
- 벡터를 활용하면 확장성과 유지보수성이 향상된다
느낀 점
여러 값을 비교하는 문제에서는
직접 비교하는 방식보다 기준값을 먼저 정하고 비교하는 방식이 더 깔끔하고 안정적이다.
비슷한 문제를 만났을 때는
최대값 또는 최소값을 먼저 구할 수 있는지부터 생각하는 것이 중요하다.
'내배캠 TIL' 카테고리의 다른 글
| [내배캠 TIL 260324] C++ 약수 개수 구하기 (완전탐색 vs √N 최적화) (0) | 2026.03.24 |
|---|---|
| [내배캠 TIL 260323] C++ 그리디 (Greedy) : 구간 덮기 문제 (0) | 2026.03.23 |
| [내배캠 TIL 260316] C++ 과일 장수 문제 (0) | 2026.03.16 |
| [내배캠 TIL 260311] Unreal Network - NetDriver 구조 정리 (0) | 2026.03.11 |
| [내배캠 TIL 260310] Unreal Dedicated Server (0) | 2026.03.10 |