Algorithm/Java

프로그래머스 - 모의고사 java :: 완전탐색

고고마코드 2022. 7. 5. 15:00
반응형
42840번

코딩테스트 연습 - 모의고사 | 프로그래머스 스쿨 (programmers.co.kr)

 

프로그래머스

코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.

programmers.co.kr


풀이

뭔가 공식이 있는 문제는 아니고, 코드를 얼마나 효율적으로 짜는지가 중요한 문제 같습니다.

 

  • 풀이1
public int[] solution(int[] answers) {
	// 수포자 패턴
	int[][] supoja_pattern = {
			{ 1, 2, 3, 4, 5 },
			{ 2, 1, 2, 3, 2, 4, 2, 5 },
			{ 3, 3, 1, 1, 2, 2, 4, 4, 5, 5 }
	};
	
	// 정답수 구하기
	List<Integer> answerList = Arrays.asList(0, 0, 0);
	for(int i=0; i<answerList.size(); i++) {
		for(int j=0; j<answers.length; j++) {
			if(supoja_pattern[i][j % supoja_pattern[i].length] == answers[j]) {
				answerList.set(i, answerList.get(i)+1);
			}
		}
	}
	
	// 정답 최댓값 구하기
	int max = Collections.max(answerList);
	List<Integer> maxList = new ArrayList<Integer>();
	for(int i=0; i<answerList.size(); i++) if(max == answerList.get(i)) maxList.add(i+1);
	
	// 반환 타입에 맞춰서 반환하기 위해 최댓값 수포자들 배열에 담기
	int[] answer = new int[maxList.size()];
	for(int i=0; i<maxList.size(); i++) answer[i] = maxList.get(i);
	
	return answer;
}

✅ 지문에 나온대로 각 수포자는 자신만의 찍는 패턴이 있습니다.

정답은 정해져 있으니 각 수포자의 패턴에 맞게 정답수를 찾아낼 수 있습니다.

 

Collections.max()

리스트 내에서 최댓값을 찾습니다.

 

✔ 테스트 케이스 처리속도: 평균 0.1ms / 최대 2.19ms

 

  • 풀이2
public int[] solution2(int[] answers) {
	int supoja = 3;
	int[][] supoja_pattern = {
			{ 1, 2, 3, 4, 5 },
			{ 2, 1, 2, 3, 2, 4, 2, 5 },
			{ 3, 3, 1, 1, 2, 2, 4, 4, 5, 5 }
	};
	
	int[] answerAry = new int[supoja];
	for(int i=0; i<answerAry.length; i++) {
		for(int j=0; j<answers.length; j++) {
			if(supoja_pattern[i][j % supoja_pattern[i].length] == answers[j]) {					
				answerAry[i]++;
			}
		}
	}
	
	int max = Arrays.stream(answerAry).max().getAsInt();
	return IntStream.range(1, supoja+1).filter(i -> answerAry[i-1] == max).toArray();
}

사실 이거는 할 필요 없었는데 그냥 stream으로 풀어서 코드를 좀 줄여보고 싶었어요.

당연하지만 처리속도는 더 안 좋아집니다...^^

 

테스트 케이스 처리속도: 평균 3.5ms / 최대 8.32ms

반응형