JJB's gloomy DEV

[프로그래머스/C#] 모의고사 - JJB.

by JJB.

문제설명

수포자는 수학을 포기한 사람의 준말입니다. 수포자 삼인방은 모의고사에 수학 문제를 전부 찍으려 합니다. 수포자는 1번 문제부터 마지막 문제까지 다음과 같이 찍습니다.

1번 수포자가 찍는 방식: 1, 2, 3, 4, 5, 1, 2, 3, 4, 5, ...
2번 수포자가 찍는 방식: 2, 1, 2, 3, 2, 4, 2, 5, 2, 1, 2, 3, 2, 4, 2, 5, ...
3번 수포자가 찍는 방식: 3, 3, 1, 1, 2, 2, 4, 4, 5, 5, 3, 3, 1, 1, 2, 2, 4, 4, 5, 5, ...

1번 문제부터 마지막 문제까지의 정답이 순서대로 들은 배열 answers가 주어졌을 때, 가장 많은 문제를 맞힌 사람이 누구인지 배열에 담아 return 하도록 solution 함수를 작성해주세요.

 

제한조건

  • 시험은 최대 10,000 문제로 구성되어있습니다.
  • 문제의 정답은 1, 2, 3, 4, 5중 하나입니다.
  • 가장 높은 점수를 받은 사람이 여럿일 경우, return 하는 값을 오름차순 정렬해주세요.

 

입출력 예

answers return
[1,2,3,4,5] [1]
[1,3,2,4,2] [1,2,3]

 

입출력 예 설명

입출력 예 #1

수포자 1은 모든 문제를 맞혔습니다.
수포자 2는 모든 문제를 틀렸습니다.
수포자 3은 모든 문제를 틀렸습니다.
따라서 가장 문제를 많이 맞힌 사람은 수포자 1입니다.

 

입출력 예 #2

모든 사람이 2문제씩을 맞췄습니다.

 


문제풀이

public class Solution 
{
	// 수포자들이 정답을 맞힌 개수를 담는 배열
    private int[] _supojaAnswers 	= new int[3];
    // 수포자1의 규칙
    private int[] _supoja1Array 	= new int[5]{1,2,3,4,5}; 
    // 수포자2의 규칙
    private int[] _supoja2Array 	= new int[4]{1,3,4,5};
    // 수포자3의 규칙
    private int[] _supoja3Array 	= new int[5]{3,1,2,4,5};

    public int[] solution(int[] answers) 
    {
        for(int answerIndex = 0; answerIndex < answers.Length; answerIndex++ )
        {
            int answer = answers[answerIndex];
			// 정답을 가져오기
            var answerOfSupoja1 = GetAnswerOfSupoja1 ( answerIndex );
            var answerOfSupoja2 = GetAnswerOfSupoja2 ( answerIndex );
            var answerOfSupoja3 = GetAnswerOfSupoja3 ( answerIndex );
				
            // 정답 카운팅
            if ( answer == answerOfSupoja1 )
                _supojaAnswers[0] ++;

            if ( answer == answerOfSupoja2 )
                _supojaAnswers[1] ++;

            if ( answer == answerOfSupoja3 )
                _supojaAnswers[2] ++;
        }
        return  GetBestSupojaArray ();
    }

    private int GetAnswerOfSupoja1 ( int index )
    {
    	// 1번 수포자가 찍는 방식: 1, 2, 3, 4, 5, 1, 2, 3, 4, 5, ...
        // 단순히 1~5를 연속해서 찍고 있습니다. 
        // 위의 수포자1의 규칙 배열에서 값을 가져올 수 있도록 배열 인덱스를 구했습니다.
        // '%5'
        return _supoja1Array[ index % 5];
    }


    private int GetAnswerOfSupoja2 ( int index )
    {
    	// 2번 수포자가 찍는 방식: 2, 1, 2, 3, 2, 4, 2, 5, 2, 1, 2, 3, 2, 4, 2, 5, ...
        // 짝수문제들의 경우 2번을 찍고 있습니다.
        // 홀수문제들의 경우 1,3,4,5 를 연속해서 찍고 있습니다.
      	// 위의 수포자2의 규칙 배열에서 값을 가져올 수 있도록 배열 인덱스를 구했습니다.
        
        // 짝수일 경우 2를 리턴
        if ( index % 2 == 0 )
            return 2;

		// 홀수 일 경우 수포자2의 규칙 배열 0,1,2,3 인덱스를 가져올 수 있도록 계산
        int result = (index - ((index/2) + 1)) % 4;
        return _supoja2Array[result];
    }

    private int GetAnswerOfSupoja3 ( int index )
    {
        // 3번 수포자가 찍는 방식: 3, 3, 1, 1, 2, 2, 4, 4, 5, 5, 3, 3, 1, 1, 2, 2, 4, 4, 5, 5, ...
        // 3,1,2,4,5 의 형태로 연속된 숫자를 계속해서 찍고 있습니다.
       
        // 숫자를 하나씩 넣어보시면 이해가 되실 거예요.
        if ( index % 2 == 0 )
            index = index - (index/2);
        else
            index = index - ((index/2) +1 );

        return _supoja3Array[ index % 5 ];
    }

    private int[] GetBestSupojaArray()
    { 
        int max = _supojaAnswers[0];
        int arrayCounter = 1;
        int[] result = new int[arrayCounter];

        for (int i = 1; i < _supojaAnswers.Length; i++)
        {
        	// 정답 개수가 동일한 수포자가 있다면 배열 인덱스 카운트 증가
            if ( max == _supojaAnswers [i] )
                arrayCounter ++;
			
            // Max 숫자와, 수포자 번호 찾기
            if (max < _supojaAnswers[i])
            {
                max = _supojaAnswers[i];	
                arrayCounter = 1;
                result[0] = i + 1;
            }
        }
        // 정답 개수가 동일한 수포자 만큼 배열을 만들어줍니다.
        result = new int[arrayCounter];
        int resultIndexer = 0;
		
        // 오름차순으로 정렬 해줍니다.
        for ( int i = 0; i < _supojaAnswers.Length; i++ )
        {
            if ( max == _supojaAnswers[i] )
            {
                result[resultIndexer] = i + 1;
                resultIndexer ++;
            }
        }
        return result;
    }
}

코드가 좀 길어지긴 했지만 해당 문제는 수포자들이 찍는 정답 방식의 규칙을 찾으면 쉽게 풀 수 있는 문제입니다. 

혹시 코드와 주석을 보시고 이해가 안 되신다면 댓글 달아주세요! 

( 문제를 풀 때, student라는 단어가 생각이 안 나서 supoja 그대로 사용을 했네요..ㅋㅋ )

 

-끝-

블로그의 정보

JJB's gloomy DEV

JJB.

활동하기