본문 바로가기
Algorithm/Programmers

[프로그래머스] 모의고사

by 수짱수짱 2022. 8. 9.

작성날짜: 2021/08/13

작성언어: Java


문제설명

수포자는 수학을 포기한 사람의 준말입니다. 수포자 삼인방은 모의고사에 수학 문제를 전부 찍으려 합니다. 수포자는 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하는 값을 오름차순 정렬해주세요.

 

입출력예시


import java.util.ArrayList;

class Solution {
    public int[] solution(int[] answers) {        
       	int[] hit=new int[3];
		
		int[] one= {1,2,3,4,5};
		int[] two= {2,1,2,3,2,4,2,5};
		int[] three= {3,3,1,1,2,2,4,4,5,5};
		
		for(int i=0; i<answers.length; i++) { // 수포자 1 점수체크
			if(answers[i]==one[i%one.length]) {
				hit[0]++;
			}
		}
		
		for(int i=0; i<answers.length; i++) { // 수포자 2 점수체크
			if(answers[i]==two[i%two.length]) {
				hit[1]++;
			}
		}
		
		for(int i=0; i<answers.length; i++) { // 수포자 3 점수체크
			if(answers[i]==three[i%three.length]) {
				hit[2]++;
			}
		}
		
		int max=Math.max(hit[0],Math.max(hit[1],hit[2])); // 제일 점수가 높은 사람 찾기
		
		ArrayList list=new ArrayList();
		
		for(int i=0; i<hit.length; i++) {
			if(max==hit[i]) list.add(i+1); // 같은 점수 받은 사람이 몇명인지 알고자 함.
            // list에는 수포자 1,2,3가 들어간다.
		}
		
		int[] answer=new int[list.size()]; // 가장 많은 문제를 맞힌 사람이 들어갈 배열 (수포자1, 2, 3)
		
        
		for(int i=0; i<answer.length; i++) {
			answer[i]=(int)list.get(i);
		}
		
		
		return answer;
    }
    
    
}

Solution.java


처음에 수포자1,2,3번이 찍는 규칙을 answers배열 크기만큼 만드려고했는데 암만해도 복잡함

=> 규칙이 반복되는 순서대로 배열에 넣고 (%배열의 길이) 만큼해주면 계속 주어진 인덱스에서만 반복해서 돌기때문에 효율적임. 이거 솔직히 진짜 놀랐다 내가 정말 무식하게 하는 거 깨달음ㅜ

 

hit배열은 순서대로 1,2,3번의 점수(맞은갯수)를 저장함. Math 클래스 메소드 사용해서 가장 높은 점수를 찾아내고 가장 높은 점수를 맞은 사람이 여러명인 경우를 max==hit[i]를 통해서 골라낸다. 한명이면 가장 높은 점수 맞은 한 명만 answer에 넣어서 보내주면됨 1,2,3이 사람이다

 

여기서 주의해야할 것이 프로그래머스 문제를 처음 풀어보는데 (그래서 문제이해하는게 더 어려웠음) 질문하기에 보니 0점인 경우도 포함되어야 한다더라 ....

만약에 3명이 다 틀린 경우에가 문제던데 나는 Math메소드클래스써서 어차피 max에 0이 들어가니깐 0점인애들 3명이 list에 다들어가는데 다른 경우는.. 모르겠네 어쨋든 문제에서 요구하는건 answer int 배열을 넘겨줘야하는 거니까 answer배열을 list 크기만큼 생성해줌 배열은 남는 공간이 있을수록 비효율적임니다. 처음에 list로 쓴 이유도 이떄문인듯.

그다음에 list에 있는 값은 (int)로 타입캐스팅해줘야합니다 전 아직도 이부분을 이해못해서 왜 타입캐스팅하는지 모름 ㅋㅋ 아마도 Arraylist가 제너릭 클래스라 원소가 Object라서 다운캐스팅해주느거아닐까? list에 들은 원소는 어차피 1,2,3 사람이 들어있어서 그대루 answer에 넣어주면 됩니다.~!


왜 바로 answer에 안 넣고 list에 넣은다음 또 answer에 넣나요 하는건요~

이렇게 해주면 일단 테스트 오류납니다. 왜??

일단 answer을 정적배열이라 빈 공간이 생기면 비효율적이고요 (크기가 3일땐 괜찮지만 크기가 커지면?)

max==hit[i] 조건이 만족을 안하면 answer에 아무값도 없어요 null이란 소리 (배열은 선언될때 초기값이 null이에요)

이대로 null을 그대로 int형 배열이라 초기값 0이에요 null아니고 ㅜㅜ 

 

반대로! 참조배열 (Ex.String) 선언한 경우 초기값은 null입니다!

 

담은채로 answer을 return해주면 틀려요 밑에 사진처럼

제일 높은 사람 것만 담아야해요(0값들어오면안돼) 그래서 list를 쓰는거에요 list는 크기가 가변적이니까 딱 맞춰서 넣을 수 있으니깐요

프로그래머스에서 문제 처음풀어보는데 main 클래스 안 써도되는거에서 좀 당황했고

어렵네요.......................더공부많이해야게써요 저도 엄청 헤매가지고 다른분들 코드도 많이보고 계쏙 손으로 따라갔어요ㅠㅠㅠㅠㅠㅠㅠㅠㅠㅠㅠㅠㅠㅠㅠㅠㅠㅠㅠㅠㅠㅠㅠㅠㅠㅠㅠㅠㅠㅠㅠㅠㅠㅠㅠㅠㅠㅠㅠㅠㅠㅠㅠㅠㅠ