◎ 문제
○ 출처
https://programmers.co.kr/learn/courses/30/lessons/42840
코딩테스트 연습 - 모의고사
수포자는 수학을 포기한 사람의 준말입니다. 수포자 삼인방은 모의고사에 수학 문제를 전부 찍으려 합니다. 수포자는 1번 문제부터 마지막 문제까지 다음과 같이 찍습니다. 1번 수포자가 찍는 ��
programmers.co.kr
○ 문제 설명
수포자는 수학을 포기한 사람의 준말입니다. 수포자 삼인방은 모의고사에 수학 문제를 전부 찍으려 합니다. 수포자는 1번 문제부터 마지막 문제까지 다음과 같이 찍습니다. 1번 수포자가 찍는 방식: 1, 2, 3, 4, 5, 1, 2, 3, 4, 5,...
|
○ 제한 조건
|
○ 입출력 예
![]() |
○ 입출력 예 설명
입출력 예 #1
따라서 가장 문제를 많이 맞힌 사람은 수포자 1입니다. 입출력 예 #2
|
○ 작성 예시 코드
using System;
public class Solution {
public int[] solution(int[] answers) {
int[] answer = new int[] {};
return answer;
}
}
◎ 나의 문제 풀이
using System;
using System.Collections;
using System.Collections.Generic;
using System.Linq;
public class Solution
{
public int[] solution(int[] answers)
{
List<int> answer = new List<int>();
// 반복되는 정답 숫자의 배열
int[] student_1 = new int[] { 1, 2, 3, 4, 5 };
int[] student_2 = new int[] { 2, 1, 2, 3, 2, 4, 2, 5 };
int[] student_3 = new int[] { 3, 3, 1, 1, 2, 2, 4, 4, 5, 5 };
// 각 학생의 정답을 카운트하기 위한 배열
int[] count = new int[3];
// 정답 숫자를 반복적으로 순회하기 위한 열거자
IEnumerator student1_enum = student_1.GetEnumerator();
IEnumerator student2_enum = student_2.GetEnumerator();
IEnumerator student3_enum = student_3.GetEnumerator();
for(int i = 0; i < answers.Length; ++i)
{
// 열거자의 끝일 경우 요소를 처음으로 리셋
if (student1_enum.MoveNext() == false)
{
student1_enum.Reset();
student1_enum.MoveNext();
}
if (student2_enum.MoveNext() == false)
{
student2_enum.Reset();
student2_enum.MoveNext();
}
if (student3_enum.MoveNext() == false)
{
student3_enum.Reset();
student3_enum.MoveNext();
}
// 현재 정답 요소와 문제의 답이 일치하면 각각을 카운트
if ((int)student1_enum.Current == answers[i]) count[0]++;
if ((int)student2_enum.Current == answers[i]) count[1]++;
if ((int)student3_enum.Current == answers[i]) count[2]++;
}
// 카운트 배열의 가장 높은 수를 찾고, 정답 리스트에 추가함
int max = count.Max();
for (int i = 0; i < count.Length; ++i)
{
if (max == count[i])
{
answer.Add(i+1);
}
}
// 정답 리스트 정렬
answer.Sort();
return answer.ToArray();
}
}
- 각각의 학생들의 정답 탐색을 위해 순회하는 방식을 IEnumerator를 이용해서 MoveNext()가 false를 반환할 경우
다시 Reset()을 호출하여 열거자를 다시 초기위치로 이동하게끔 하는 방식을 사용했다.
◎ 다른 문제 풀이
for (int i = 0; i < answers.Length; i++)
{
if (answers[i] == student_1[i % student_1.Length]) count[0]++;
if (answers[i] == student_2[i % student_2.Length]) count[1]++;
if (answers[i] == student_3[i % student_3.Length]) count[2]++;
}
- 지정된 배열을 순회하며 탐색하는 데는 여러 방법이 있겠지만 공통적으로 나머지 연산을 이용하여 배열을 순회한 방법이 가장 많았다.
'프로그래밍 문제 풀이 > C#' 카테고리의 다른 글
[프로그래밍 문제 풀이] 프로그래머스 - 소수찾기(C#) (0) | 2020.07.08 |
---|---|
[프로그래밍 문제 풀이] 프로그래머스 - 문자열 다루기 기본(C#) (0) | 2020.07.07 |
[프로그래밍 문제 풀이] 프로그래머스 - 두 정수 사이의 합(C#) (0) | 2020.07.04 |
[프로그래밍 문제 풀이] 프로그래머스 - 가운데 글자 가져오기(C#) (0) | 2020.07.03 |
[프로그래밍 문제 풀이] 프로그래머스 - K번째수(C#) (0) | 2020.07.02 |