-
[Java] - 모의고사 (42840) (완전탐색/ ArrayList, LinkedList)카테고리 없음 2024. 3. 7. 11:57
📚 문제 - 42840
수포자는 수학을 포기한 사람의 준말입니다. 수포자 삼인방은 모의고사에 수학 문제를 전부 찍으려 합니다. 수포자는 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하는 값을 오름차순 정렬해주세요.
입출력 예
answers return [1,2,3,4,5] [1] [1,3,2,4,2] [1,2,3] -
입출력 예 #1
수포자 1은 모든 문제를 맞혔습니다. 수포자 2는 모든 문제를 틀렸습니다. 수포자 3은 모든 문제를 틀렸습니다.
따라서 가장 문제를 많이 맞힌 사람은 수포자 1입니다. - 입출력 예 #2
모든 사람이 2문제씩을 맞췄습니다.
⌨️ 작성한 코드
import java.util.ArrayList; import java.util.List; class Solution { public int[] solution(int[] answers) { int[] score = new int[3]; // 세 수포자의 점수 int[] answer = {}; // 최고 점수를 받은 수포자들의 번호 int[] pattern1 = {1, 2, 3, 4, 5}; int[] pattern2 = {2, 1, 2, 3, 2, 4, 2, 5}; int[] pattern3 = {3, 3, 1, 1, 2, 2, 4, 4, 5, 5}; // 정답과 비교하여 점수 계산 for (int i = 0; i < answers.length; i++) { if (answers[i] == pattern1[i % pattern1.length]) score[0]++; if (answers[i] == pattern2[i % pattern2.length]) score[1]++; if (answers[i] == pattern3[i % pattern3.length]) score[2]++; } // 최고 점수 계산 int maxScore = Math.max(score[0], Math.max(score[1], score[2])); // 최고 점수를 받은 수포자들의 번호 찾기 List<Integer> list = new ArrayList<>(); for (int i = 0; i < 3; i++) { if (score[i] == maxScore) { list.add(i + 1); // 배열의 인덱스가 0부터 시작하므로 +1 } } // List를 배열로 변환 answer = new int[list.size()]; for (int i = 0; i < list.size(); i++) { answer[i] = list.get(i); } return answer; } }
- 접근 방식:
정답과 수포자들의 패턴을 비교하기 위해서, 패턴을 배열로 저장했다. for문을 돌면서 정답의 개수를 score배열에 저장한 뒤에 가장 높은 점수를 받은 수포자를 찾으면 될 것같았다. Math.max() 메소드를 사용하여 세 수포자의 최고 점수를 알아냈다. 최고 점수를 받은 수포자를 찾기 위해 세 수포자의 점수를 순회하면서, maxScore와 같은 점수를 가진 수포자를 리스트에 추가했다. 리스트를 사용한 이유는 최고 점수를 받은 수포자가 여러 명일 수 있기 때문이다. 마지막으로 리스트에 추가된 수포자의 번호를 배열로 변환하여 return했다. - 문제&해결:
처음에는 리스트말고 배열를 썼었는데, 리스트를 사용하는 편이 메모리를 낭비하지 않을 것 같아서 리스트를 사용했다. 그러나 리스트에 대해 잘 몰라서 list.length()라고 쓰는 등 좀 버벅였다. 리스트에 대해 알아본 뒤에야 코드를 완성할 수 있었다.
✅ 배운 점
[ List ]
- ArrayList:
- 가장 일반적으로 사용되는 리스트 구현체
- 내부적으로 배열을 사용하여 요소를 저장하며, 인덱스를 기반으로 빠르게 요소에 접근할 수 있다.
- 요소를 추가하거나 제거할 때 크기를 동적으로 조절한다.
- 요소의 삽입 및 삭제 때, 요소 이동이 발생한다.
- LinkedList:
- 이중 연결 리스트로 구현되어 있습니다.
- 각 요소는 자신의 이전 요소와 다음 요소에 대한 참조를 유지합니다.
- 요소의 앞 노드와 뒷 노드를 직접 연결하므로, 배열의 요소를 이동할 필요가 없다.
- 인덱스를 기반으로 요소에 접근하는 데는 선형 시간이 소요된다.
- List 주요 메소드
import java.util.ArrayList; import java.util.List; class Main { public static void main(String[] args) { // 리스트 생성 List<Integer> myList = new ArrayList<>(); // add(E element) 메소드: 리스트에 요소 추가 myList.add(1); myList.add(2); // add(int index, E element) 메소드: 특정 위치에 요소 추가 myList.add(1, 4); // addAll(Collection<? extends E> c) 메소드: 다른 컬렉션의 모든 요소 추가 List<Integer> anotherList = new ArrayList<>(); anotherList.add(5); anotherList.add(6); myList.addAll(anotherList); // remove(Object o) 메소드: 요소 제거 myList.remove(Integer.valueOf(2)); // 요소 2를 제거 // removeAll(Collection<?> c) 메소드: 다른 컬렉션에 있는 모든 요소 제거 myList.removeAll(anotherList); // get(int index) 메소드: 특정 위치의 요소 조회 int element = myList.get(0); // indexOf(Object o) 메소드: 요소의 인덱스 조회 int index = myList.indexOf(3); // size() 메소드: 리스트의 크기 조회 int size = myList.size(); } }