Coding Test/Programmers

[Lv.1] 모의고사 [프로그래머스_코딩테스트] [완전탐색] [30분]

whawoo 2025. 6. 9. 16:50
반응형

🔍 문제 요약

https://school.programmers.co.kr/learn/courses/30/lessons/42840

 

프로그래머스

SW개발자를 위한 평가, 교육의 Total Solution을 제공하는 개발자 성장을 위한 베이스캠프

programmers.co.kr

수포자 3명이 문제를 찍는 규칙이 정해져 있고, 답안 answers가 인자로 주어질 때 최대 점수를 맞은 번호들을 반환하는 문제

🧠 나의 접근 방식과 시행착오

대강 15분 정도 걸린 문제. 풀이자체는 규칙을 그대로 int[]로 저장해두고 정답지를 순회하면서 각 번호별로 점수를 저장해두고, 최대 점수인 번호들을 저장하고 올림차순으로 Sort시키는 방식으로 풀었다. 문제의 풀이 자체는 단순하게 직관적으로 푼 거라 더 효율적인 방향이 있을지는 체크를 해봐야 할 듯 함.

using System;
using System.Collections.Generic;

public class Solution
{
    /// <summary>
    /// 모의고사
    /// https://school.programmers.co.kr/learn/courses/30/lessons/42840
    /// </summary>
    public int[] solution(int[] answers)
    {
        List<int> maxScoreList = new List<int>();
        
        // 1번 수포자 규칙 : 1,2,3,4,5, ....
        // 2번 수포자 규칙 : 2,1,2,3,2,4,2,5, ...
        // 3번 수포자 규칙 : 3,3,1,1,2,2,4,4,5,5, ...

        int[] scoreArray = new int[3];
        int[] oneAnswer = new int[] { 1, 2, 3, 4, 5 };
        int[] twoAnswer = new int[] { 2, 1, 2, 3, 2, 4, 2, 5 };
        int[] threeAnswer = new int[] { 3, 3, 1, 1, 2, 2, 4, 4, 5, 5 };

        for (int i = 0; i < answers.Length; i++)
        {
            int answer = answers[i];
            
            // 1번 체크
            int oneIdx = i % oneAnswer.Length;
            if (oneAnswer[oneIdx] == answer)
            {
                scoreArray[0]++;
            }

            // 2번 체크
            int twoIdx = i % twoAnswer.Length;
            if (twoAnswer[twoIdx] == answer)
            {
                scoreArray[1]++;
            }

            // 3번 체크
            int threeIdx = i % threeAnswer.Length;
            if (threeAnswer[threeIdx] == answer)
            {
                scoreArray[2]++;
            }
        }

        // 최대 점수 구하기
        int maxScore = 0;

        for (int i = 0; i < scoreArray.Length; i++)
        {
            if (scoreArray[i] > 0)
            {
                maxScore = Math.Max(maxScore, scoreArray[i]);
            }
        }

        // 최대 점수인 번호들 리스트에 넣기
        for (int i = 0; i < scoreArray.Length; i++)
        {
            if (scoreArray[i] == maxScore)
            {
                maxScoreList.Add(i + 1);
            }
        }

        maxScoreList.Sort();
        
        return maxScoreList.ToArray();
    }
}

/// <summary>
/// C# 7.3
/// </summary>
internal class Program
{
    public static void Main(string[] args)
    {
        var sl = new Solution();
        var answers1 = new int[] { 1, 2, 3, 4, 5 };
        var answers2 = new int[] { 1, 3, 2, 4, 2 };
        var res1 = sl.solution(answers1);
        var res2 = sl.solution(answers2);

        foreach (var i in res1)
        {
            Console.Write(i + " , ");
        }
        
        Console.WriteLine();
        
        foreach (var i in res2)
        {
            Console.Write(i + " , ");
        }
    }
}

✅ 풀이 코드

피드백 자체는 소소하게 주어진 듯 하다. 문제를 생각해봤을 때 Sort가 의미가 없었다는 점과 루프 안에 동일한 규칙이 반복되는 부분은 함수로 뺄 수 있을 것 정도로 보인다. 함수로 빼는 것 자체는 실제 개발을 하거나 할 때는 필요할 듯 한 방향으로 보인다. 문제의 해결을 빠르게 하는 점에서는 굳이 큰 상관 없을 것으로 보임. 

🔄 정리

문제 자체가 단순하게 완전탐색을 하면서 패턴대로 점수를 체크해서 최대점수인 번호만 구하면 되는 문제라 쉽게 푼 문제. 크게 추후에 볼 필요는 없을 듯 한 문제다

반응형