https://programmers.co.kr/learn/courses/30/lessons/42840?language=java
문제요약
모의고사를 규칙적인 패턴으로 찍는 세 명의 학생이 있고 문제가 주어질 때, 제일 많이 맞은 학생의 번호를 리턴하는 문제.
맞힌 문제수가 같은 학생의 경우, 학생번호 순서대로 오름차순(작은 수 부터 큰 수)으로 정렬하여 배열로 리턴한다.
풀이
먼저 패턴이 문제에서 제시됐다는 점에서, 뭔가 다음 값을 예측할 수 있는 것을 이용하겠구나 생각을 하고 들어간다.
1. 학생별 맞은 문제 수 구하기
답안지를 순회하며, 현재 문제 인덱스 % 학생별 패턴 길이를 통해 반복문의 인덱스(다음 문제 번호)를 구한다.
전체 문제를 순회하며 학생별로 몇 문제를 맞췄는지 카운트한다.
2. 가장 큰 점수의 학생 구하기
학생별 맞춘 문제 수를 저장한 배열을 순회하며 최대값 구하기
소스코드
https://github.com/999inim/Algorithm/blob/main/programmers/PS32.java
API 정리 및 팁
1. 문자열의 특정 인덱스에 있는 문자 구하기
문자열.charAt(찾는 Index)
2. 문자(아스키코드 정수)를 매칭되는 정수로 변경하기
char 값에서 48을 뺀다.
'0' = 48
'9' = 57(48+9)
3. 반복되는 패턴의 n번째 올 숫자 구하기
반복되는 패턴을 문자열이나 리터럴 배열로 선언해두고 사용하기
String pattern1 = "21562";
int[] pattern2 = {1, 2, 3, 4, 5};
pattern1의 14번째 올 숫자 = 14 % 5 (pattern1 길이) = 4
14번째 올 숫자는 4번째 숫자와 같으므로 답은 6
4. 두 수 비교시 max 값 찾기
Math.max(비교할값, 비교할값);
5. 세 수 비교시 max 값 찾기
int maxScore = Math.max(score[0], Math.max(score[1], score[2]));
ArrayList<Integer> list = new ArrayList<>();
if(maxScore == score[0]) {list.add(1);}
if(maxScore == score[1]) {list.add(2);}
if(maxScore == score[2]) {list.add(3);}
6. 리스트 -> 배열로 변환 (스트림)
return list.stream().mapToInt(i->i.intValue()).toArray();
리스트에서 제공하는 stream 메서드와 위 방식보다 직접 for문 돌리는게 유리할 수 있다고 한다.
느낀점
완전탐색 유형의 특징을 살려서 다음에 다시 풀기
최근댓글