이번 문제는 <모의고사>다.
"코딩 테스트 합격자 되기 자바편" 기준으로는 4번에 해당
(문제 출처 : 프로그래머스 https://school.programmers.co.kr/learn/courses/30/lessons/42840)
프로그래머스는 블로그 게재시 문제 여지가 있어
자세한 내용 없이 문제 제목과 링크로 대체합니다.
문제 설명부터 너무 나를 위한 거라 마음에 들더라?
(아무도 안 믿지만 과거의 수포자)
패턴이 정확히 있고 하니까
정답 배열이랑 비교해서 맞은 개수 카운트 하면 되겠네
하고 가볍게 시작했는데
나중에 보니 가장 많은 문제를 맞힌 사람을 숫자로 표현해줘야 했다.
그게 좀 까다롭(?)다.
import java.util.*;
class Solution {
public int[] solution(int[] answers) {
int[] answer = {};
int[] sa1 = {1, 2, 3, 4, 5}; // 5개
int[] sa2 = {2, 1, 2, 3, 2, 4, 2, 5}; // 8개
int[] sa3 = {3, 3, 1, 1, 2, 2, 4, 4, 5, 5}; // 10개
int[] score = new int[3]; // 점수 계산용
ArrayList<Integer> ans = new ArrayList<>();
int s1 = 0, s2 = 0, s3 = 0;
for (int i=0; i<answers.length; i++){
// 1번 학생의 패턴인 1~5 순서대로 반복하면서 비교
if(sa1[s1]==answers[i]) {score[0]++;}
s1++;
if(s1==5) {s1=0;}
if(sa2[s2]==answers[i]) {score[1]++;}
s2++;
if(s2==8) {s2=0;}
if(sa3[s3]==answers[i]) {score[2]++;}
s3++;
if(s3==10) {s3=0;}
}
// 가장 많이 맞춘 학생의 점수 찾기
int max = Arrays.stream(score)
.max().getAsInt();
// 최고점과 각 학생의 점수 비교해서, 순서찾기
// 다 같이 점수가 동일한 경우에는 어차피 1번 학생부터 add됨
for (int i=0; i<3; i++){
if (max == score[i]){
ans.add(i+1);
}
}
answer = ans.stream().mapToInt(Integer::intValue).toArray();
return answer;
}
}
오 책의 예시 답안을 보니 접근방법은 나랑 비슷한데, 훨씬 더 깔끔하게 풀어내셨다.
import java.util.*;
class Solution {
public int[] solution(int[] answers) {
int[] answer = {};
// (나랑 다른 부분) 패턴을 이렇게 2차원 배열에 넣었다.
int [][] pattern ={
{1, 2, 3, 4, 5}, // 5개
{2, 1, 2, 3, 2, 4, 2, 5}, // 8개
{3, 3, 1, 1, 2, 2, 4, 4, 5, 5}; // 10개
}
// (동일) 점수 저장할 배열을 만들었다
int[] score = new int[3]; // 점수용
// 각 수포자의 패턴과 정답이 얼마나 일치하는지를
// for문 2개에 구성해서 표현했다.
// 이게 핵심이니까 여기는 필요하면 책을 찾아보세요.
// (동일) 가장 높은 점수를 찾고
int max = Arrays.stream(score)
.max().getAsInt();
// (동일) 가장 높은 점수를 가진 사람들을 찾아서 리스트에 담는다.
for (int i=0; i<3; i++){
if (max == score[i]){
ans.add(i+1);
}
}
answer = ans.stream().mapToInt(Integer::intValue).toArray();
return answer;
}
}
공부에 참고한 책 이름은 김희성 님의 "코딩 테스트 합격자 되기 자바편"입니다.
오늘의 챌린지 문제 2개를 풀면서 내가 느낀 것은
1. 어레이 리스트 할당하는 법과 >> ArrayList<Integer> sums = new ArrayList<>();
2. 스트림 메서드를 활용하고 >> Arrays.stream(score).max().getAsInt();
3. 또 변환하는 법도 알아야 한다는 사실 >> sums.stream().mapToInt(Integer::intValue).toArray();
프로그래머스 레벨 1~3이랑 백준 실버까지는 풀어야 된다는데
할 수 있지 나 자신?!
'공부 > 코딩' 카테고리의 다른 글
[프로그래머스/카카오2019] 실패율 (3) | 2025.01.04 |
---|---|
[프로그래머스/연습문제] 행렬의 곱셈 (5) | 2025.01.04 |
[프로그래머스/월간코드챌린지] 두 개 뽑아서 더하기 (feat.코딩 테스트 합격자 되기 자바편) (4) | 2025.01.03 |
[프로그래머스/입문] 저주의 숫자 3 (0) | 2024.12.05 |
[프로그래머스/입문] 분수의 덧셈 (1) | 2024.12.04 |