내배캠 TIL

[내배캠 TIL 260318] C++ 모의고사 (패턴 반복 & 최대값 판별)

xodn246 2026. 3. 18. 10:03

문제 요약

수포자 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);
}
  • 점수 배열 기반으로 결과 처리
  • 특정 인원 수에 의존하지 않는 구조

정리

  • % 연산을 활용해 반복 패턴을 효율적으로 처리할 수 있다
  • 여러 값 비교 시 기준값을 먼저 구하면 로직이 단순해진다
  • 벡터를 활용하면 확장성과 유지보수성이 향상된다

느낀 점

여러 값을 비교하는 문제에서는
직접 비교하는 방식보다 기준값을 먼저 정하고 비교하는 방식이 더 깔끔하고 안정적이다.

비슷한 문제를 만났을 때는
최대값 또는 최소값을 먼저 구할 수 있는지부터 생각하는 것이 중요하다.