https://programmers.co.kr/learn/courses/30/lessons/42840?language=java

 

코딩테스트 연습 - 모의고사

수포자는 수학을 포기한 사람의 준말입니다. 수포자 삼인방은 모의고사에 수학 문제를 전부 찍으려 합니다. 수포자는 1번 문제부터 마지막 문제까지 다음과 같이 찍습니다. 1번 수포자가 찍는

programmers.co.kr

 

문제요약

모의고사를 규칙적인 패턴으로 찍는 세 명의 학생이 있고 문제가 주어질 때, 제일 많이 맞은 학생의 번호를 리턴하는 문제.

맞힌 문제수가 같은 학생의 경우, 학생번호 순서대로 오름차순(작은 수 부터 큰 수)으로 정렬하여 배열로 리턴한다.

 

풀이

먼저 패턴이 문제에서 제시됐다는 점에서, 뭔가 다음 값을 예측할 수 있는 것을 이용하겠구나 생각을 하고 들어간다.

 

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문 돌리는게 유리할 수 있다고 한다.


느낀점

완전탐색 유형의 특징을 살려서 다음에 다시 풀기

 

반응형
  • 네이버 블러그 공유하기
  • 네이버 밴드에 공유하기
  • 페이스북 공유하기
  • 카카오스토리 공유하기