ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • [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();
          }
      }​

     

Designed by Tistory.