[프로그래머스/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 그대로 사용을 했네요..ㅋㅋ )
-끝-
'알고리즘 > 프로그래머스' 카테고리의 다른 글
[프로그래머스/C#] 가운데 글자 가져오기 - JJB. (0) | 2022.05.21 |
---|
블로그의 정보
JJB's gloomy DEV
JJB.