<링크>
https://school.programmers.co.kr/learn/courses/30/lessons/42840?language=java
프로그래머스
코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.
programmers.co.kr
<문제>
수포자는 수학을 포기한 사람의 준말입니다. 수포자 삼인방은 모의고사에 수학 문제를 전부 찍으려 합니다. 수포자는 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하는 값을 오름차순 정렬해주세요.
<입력 및 출력>
<고려사항>
1. 최고점인 사람이 한사람일수도, 여러사람일수도 있기때문에, 리스트로 결과를 선언해야겠다.
2. 찍는 방식에 대한 길이가 다 다르게 주었으니, 저것을 활용해야겠다.
<풀이 - Python>
def solution(answers):
answer = [0, 0, 0]
first = [1, 2, 3, 4, 5]
second = [2, 1, 2, 3, 2, 4, 2, 5]
third = [3, 3, 1, 1, 2, 2, 4, 4, 5, 5]
for i in range(len(answers)):
if first[i % len(first)] == answers[i]:
answer[0] += 1
if second[i % len(second)] == answers[i]:
answer[1] += 1
if third[i % len(third)] == answers[i]:
answer[2] += 1
max_score = max(answer)
result = []
for i in range(len(answer)):
if max_score == answer[i]:
result.append(i + 1)
return result
<풀이 - Java>
import java.util.*;
public int[] solution(int[] answers) { // answers 배열을 입력으로 받아 int 배열을 반환하는 solution 메서드 정의
int[] answer = new int[3]; // 세 명의 수포자(1, 2, 3)에 대한 정답 개수를 저장할 배열 초기화
// 각 수포자의 답안 패턴을 정의
int[] first = { 1, 2, 3, 4, 5 }; // 첫 번째 수포자의 패턴
int[] second = { 2, 1, 2, 3, 2, 4, 2, 5 }; // 두 번째 수포자의 패턴
int[] third = { 3, 3, 1, 1, 2, 2, 4, 4, 5, 5 }; // 세 번째 수포자의 패턴
// 주어진 답안 배열을 순회
for (int i = 0; i < answers.length; i++) {
// 첫 번째 수포자의 정답과 비교
if (first[i % first.length] == answers[i]) {
answer[0]++; // 맞춘 개수 증가
}
// 두 번째 수포자의 정답과 비교
if (second[i % second.length] == answers[i]) {
answer[1]++; // 맞춘 개수 증가
}
// 세 번째 수포자의 정답과 비교
if (third[i % third.length] == answers[i]) {
answer[2]++; // 맞춘 개수 증가
}
}
// 가장 많이 맞춘 개수를 찾음
int max = Arrays.stream(answer).max().getAsInt();
// 가장 많이 맞춘 수포자의 인덱스를 저장할 리스트 초기화
ArrayList<Integer> list = new ArrayList<>();
// 각 수포자의 맞춘 개수를 확인
for (int i = 0; i < answer.length; i++) {
if (max == answer[i]) { // 최대 개수와 같은 경우
list.add(i + 1); // 수포자 번호(1부터 시작)를 리스트에 추가
}
}
int[] result = new int[list.size()]; // 결과 배열을 리스트의 크기로 초기화
// 리스트의 값을 결과 배열에 복사
for (int i = 0; i < result.length; i++) {
// 리스트의 값을 결과 배열에 저장
result[i] = list.get(i);
}
return result; // 결과 배열 반환
}
}
코드 진행 순서
1. 3명이므로, answer을 3개 배열로 선언한다.
2. 각 사람별 찍는 방법을 하나씩의 배열로 선언한다.
3. 주어진 정답들(answers)에 길이만큼 진행하는 for문을 작성한다.
4. 각 사람별로 사람별 길이로 나누었을때의 index와 정답 index가 같다면 answer을 1씩 증가시킨다
5. Arrays를 사용하여 answer에 대한 최댓값을 int로 받아온다.(내장패키지)
6. 최대 점수를 가진 학생을 카운트 하기 위해 새로운 arraylist를 받아온다
7. 결과를 새로운 arraylist에 저장한다
소요시간 : 45분..ㅠㅠ
'알고리즘 > 프로그래머스' 카테고리의 다른 글
<프로그래머스> 짝지어 제거하기 (0) | 2024.08.15 |
---|---|
<프로그래머스> 괄호 회전하기 (0) | 2024.08.15 |
<프로그래머스> 올바른 괄호 (0) | 2024.08.15 |
<프로그래머스> 행렬의 곱셈 (0) | 2024.08.07 |
<프로그래머스> 두 개 뽑아서 더하기 (0) | 2024.08.02 |