https://school.programmers.co.kr/learn/courses/30/lessons/42840
문제 접근
각 수포자 친구들의 답을 찍는 패턴에 따라 점수를 매기는 개별 반복문을 만들어주었음
핵심은 정답 갯수의 크기만큼 돌아가는 반복문에서 각 친구들의 찍는 패턴의 반복 주기가 돌아올 때 마다 반복문의 크기를 0으로 초기화해주고 정답 비교 횟수가 정답 갯수와 같아지면 반복문을 탈출하는 것
세 친구들의 순위를 메기는 기능을 일일이 다 나열하는 식 보단 뭔가 간단하게 만들고 싶었는데 떠오르지 않아서 모든 경우의 수를 다 적고 메서드로 따로 빼줬다.
class Solution {
public int[] solution(int[] answers) {
int[] supo1 = {1, 2, 3, 4, 5};
int[] supo2 = {2, 1, 2, 3, 2, 4, 2, 5};
int[] supo3 = {3, 3, 1, 1, 2, 2, 4, 4, 5, 5};
int score1 = 0;
int score2 = 0;
int score3 = 0;
int check1 = 0; // 정답 비교 횟수
int check2 = 0;
int check3 = 0;
// 1수자 정답 확인
for(int j=0; j<answers.length; j++) {
if(check1==answers.length) break;
if(j>= supo1.length) j=0;
if(answers[check1] == supo1[j]) score1++;
check1++;
}
// 2수자 정답 확인
for(int j=0; j<answers.length; j++) {
if(check2==answers.length) break;
if(j>= supo2.length) j=0;
if(answers[check2] == supo2[j]) score2++;
check2++;
}
// 3수자 정답 확인
for(int j=0; j<answers.length; j++) {
if(check3==answers.length) break;
if(j>= supo3.length) j=0;
if(answers[check3] == supo3[j]) score3++;
check3++;
}
return ranking(score1, score2, score3);
}
public int[] ranking(int score1, int score2, int score3) {
// 세 수가 같을 때
if(score1 == score2 && score2 == score3 && score1 == score3) {
int[] answer = {1,2,3};
return answer;
}
// 두 수가 같을 때
else if(score1 == score2 && score1 > score3) {
int[] answer = {1,2};
return answer;
}
else if(score1 == score3 && score1 > score2) {
int[] answer = {1,3};
return answer;
}
else if(score2 == score3 && score2 > score1) {
int[] answer = {2,3};
return answer;
}
// 세 수가 다 다를 때
else if(score1 > score2 && score1 > score3) {
int[] answer = {1};
return answer;
}
else if(score2 > score1 && score2 > score3) {
int[] answer = {2};
return answer;
}
else if(score3 > score1 && score3 > score2) {
int[] answer = {3};
return answer;
}
return null;
}
}
다른 사람 풀이
코드 해석하면서 나도 이렇게 깔끔하게 풀고싶다라는 생각이 들더라
class Solution{
public static int[] solution(int[] answers) {
int[][] patterns = {
{ 1, 2, 3, 4, 5 }, // 0 1 2 3 4 순서
{ 2, 1, 2, 3, 2, 4, 2, 5 },
{ 3, 3, 1, 1, 2, 2, 4, 4, 5, 5 }
}; // 수포자 친구들 답 찍는 패턴
int[] hit = new int[3]; // 수포자 친구들 답안지
for (int i = 0; i < hit.length; i++) {
for (int j = 0; j < answers.length; j++) { // 답 갯수
if (patterns[i][j % patterns[i].length] == answers[j]) // 답 찾기
// 1번 수포자 예시 answers = {1, 3, 2, 4, 2, 4, 3}일 경우
// (0 % 5) → 패턴의 0번 째 요소 == answers [0] → 1
// (1 % 5) → 패턴의 1번 째 요소 == answers [1] → 3
// (2 % 5) → 패턴의 2번 째 요소 == answers [2] → 2
// (3 % 5) → 패턴의 3번 째 요소 == answers [3] → 4
// (4 % 5) → 패턴의 4번 째 요소 == answers [4] → 2
// (5 % 5) → 패턴의 0번 째 요소 == answers [5] → 4
// (6 % 5) → 패턴의 1번 째 요소 == answers [6] → 3
// 어떻게 이런 생각을?
hit[i]++; // 1번 친구부터 맞을 때 마다 점수 증가
}
}
int max = Math.max(hit[0], Math.max(hit[1], hit[2])); // 3명 중 가장 큰 점수
List<Integer> list = new ArrayList<>();
for (int i = 0; i < hit.length; i++)
if (max == hit[i]) // 최고점이랑 같은 친구가 있다면
list.add(i + 1); // 리스트에 그 친구 저장
int[] answer = new int[list.size()]; // 최고점인 사람 수 만큼 생성
int cnt = 0;
for (int num : list) answer[cnt++] = num; // list에 있는 사람 번호 가져와서 answer 인덱스에 그 사람 번호 넣기
return answer;
}
}
'알고리즘 > 프로그래머스' 카테고리의 다른 글
[프로그래머스 / 크레인 인형뽑기 게임 /JAVA] (0) | 2023.03.12 |
---|---|
[프로그래머스 / K번 째 수 / JAVA / 정렬] * Arrays.copyOfRange() (0) | 2023.03.10 |
[프로그래머스 / 키패드 누르기 / JAVA] (0) | 2023.03.08 |
[프로그래머스 / 신규 아이디 추천 / JAVA / replaceAll()] (0) | 2023.03.07 |
[프로그래머스 / 바탕화면 정리 / JAVA] (0) | 2023.03.06 |
댓글