budtree
나를 조금만 더 완성해보는 날
budtree
전체 방문자
오늘
어제
  • 분류 전체보기 (77)
    • 💝 Computer Science (5)
      • OS (1)
      • Network (1)
      • Database (3)
    • 🐤 study (21)
      • kubernetes🕸️ (0)
      • Spring Boot🍃 (1)
      • JPA (2)
      • Infra (2)
      • HTML | CSS (3)
      • Java (6)
      • Kotlin (3)
      • etc (4)
    • 💻 Project (3)
      • memoir & diary 📚 (1)
      • class (0)
      • project (2)
    • 🔥 Problem Solving (38)
      • programmers (30)
      • SQL (8)
      • BOJ (0)
    • ✨ daily (10)
      • diary (5)
      • exercise (5)
      • travel (0)
      • review (0)

블로그 메뉴

  • 홈
  • 태그
  • 방명록

공지사항

인기 글

태그

  • Summer/Winter Coding
  • 취업
  • 월간코드챌린지
  • 서울대입구 헬스장
  • css
  • 2018 KAKAO BLIND RECRUITMENT
  • java
  • 블랙멀티짐
  • 프린이
  • 프로그래머스
  • 일기
  • HashMap
  • programmers
  • 카카오코딩테스트
  • 코린이
  • 피티
  • 코딩테스트
  • kotlin
  • 개린이
  • 카카오
  • 코틀린
  • 월간 코드 챌린지
  • pt
  • 코테
  • 헬린이
  • 자바
  • 취업준비
  • ArrayList
  • 카카오코테
  • 헬스장

최근 댓글

최근 글

티스토리

hELLO · Designed By 정상우.
budtree

나를 조금만 더 완성해보는 날

[프로그래머스] 완전탐색 모의고사(Java)
🔥 Problem Solving/programmers

[프로그래머스] 완전탐색 모의고사(Java)

2022. 2. 16. 14:12

 

🔥DAY +8

 

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

 

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

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

programmers.co.kr

 

> 문제를 보고 싶다면 더보기 클릭!

더보기

문제 설명

수포자는 수학을 포기한 사람의 준말입니다. 수포자 삼인방은 모의고사에 수학 문제를 전부 찍으려 합니다. 수포자는 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하는 값을 오름차순 정렬해주세요.
입출력 예answersreturn
[1,2,3,4,5] [1]
[1,3,2,4,2] [1,2,3]
입출력 예 설명

입출력 예 #1

  • 수포자 1은 모든 문제를 맞혔습니다.
  • 수포자 2는 모든 문제를 틀렸습니다.
  • 수포자 3은 모든 문제를 틀렸습니다.

따라서 가장 문제를 많이 맞힌 사람은 수포자 1입니다.

입출력 예 #2

  • 모든 사람이 2문제씩을 맞췄습니다.

 

🔥 [로직]

1~3번 수포자들에게는 일정하게 찍는 정답패턴이 있다. 우선 이걸 찾아내는게 중요하당.

1번은 {1,2,3,4,5}, 2번은 {2,1,2,3,2,4,2,5}, 3번은 {3,3,1,1,2,2,4,4,5,5}의 숫자가 반복되는데 이 패턴을 2차원 배열에 저장했다!

그리고 각 수포자들의 점수를 담는 1차원 배열인 score도 선언해주고 0으로 초기화한다.

 

그 다음! 문제 수만큼 도는 for문을 선언하는데, 만약에 정답과 패턴이 일치하는 경우 해당 수포자의 score을 증가해준다!

여기서 고려해야 하는 중요한 포인트가 있다

 

문제 수가 패턴의 수보다 많은 경우이다.

예를 들자면 문제의 정답이 1,2,3,4,5,1일 때 1번 수포자는 정답패턴의 길이가 5이기 때문에 6번 문제에 대한 1번 수포자의 답은 1이 되어야 한다는 것이다! 

 

또한 수포자들마다 가진 정답패턴의 길이가 다르기 때문에 이를 모두 고려할 수 있는 방법을 생각해야 한다.

내가 생각한 방법은 (현재 채점중인 문제 번호)에서 각 (수포자들의 패턴 개수)의 나머지를 구하는 것이다(다들 이렇게 생각하지 않을까 싶다) 

말로 설명하기 참 어렵긴한데.. 결과적으로는 수포자들의 정답이 되풀이되는 점을 곰곰히 잘 생각해보면 이해가 갈 것이다!

 

이렇게 해서 각 수포자들의 성적을 구하고, 그 뒤에 최댓값을 구하는데 이때는 stream을 이용해 배열에서의 최댓값을 가져왔다.

int max = Arrays.stream(score).max().getAsInt();

이렇게

 

그리고 정답 ArrayList를 선언해 max값을 가진 수포자들의 아이디를 차례로 추가해주었다!

 

마지막으로 리턴값은 int형 배열, answer은 ArrayList이기 때문에 int형 배열로 형변환을 해주면 끝!

answer.stream().mapToInt(i -> i).toArray();

요렇게

 

🔥 [최종 코드]

import java.util.Arrays;
import java.util.ArrayList;
import java.util.List;

class Solution {
    public int[] solution(int[] answers) {
        
        //수포자들의 정답패턴
        int[][] patterns = {{1,2,3,4,5}, {2,1,2,3,2,4,2,5}, {3,3,1,1,2,2,4,4,5,5}};
        int[] score = {0,0,0};
        
        for(int i = 0; i < answers.length; i++) {
            for(int j = 0; j < 3; j++) {
                int index = i % patterns[j].length;
                if(answers[i] == patterns[j][index]) {
                    score[j]++;
                }
            }
        }
        
        List<Integer> answer = new ArrayList<>();
        int index = 0;
        int max = Arrays.stream(score).max().getAsInt();
        for(int s = 0; s < 3; s++) {
            if(score[s] == max) {
                answer.add(s+1);
            }
        }
        
        return answer.stream().mapToInt(i -> i).toArray();
    }
}

 

🔥 [소감]

사실 문제에서 요구하는 메인 로직은 금방 짰는데 형변환, 최댓값 구하기에 대한 개념이 잘 잡혀있지 않아서 시간이 오래 걸린 것 같다.

로직 파트에 있는 두가지 코드 구문들은 정말 중요하지만 잘 외워지지 않는 것 같다ㅠ 몇번이나 다시 찾아봤는지 모르겠당 의식적으로 외우는 시간을 가져야 할 것 같다!

 

그리고 stream에 대해서도 한번 정리하면 좋을것같다. 

 

 

+)

나는 수학을 그닥 좋아하진 않지만 저렇게 현란하게 패턴까지 만들어가면서 찍어본적은 없다.. 저것도 의지아닐까ㅠ


 

코테 준비를 본격적으로 시작한지 얼마 되지 않아 코드에 미흡한 점이 많을 수 있습니다. 
부족한 점 피드백 주시면 앞으로의 포스팅에 반영하겠습니다! 봐주셔서 정말 감사합니다 :)
-budtree

'🔥 Problem Solving > programmers' 카테고리의 다른 글

[프로그래머스] 2019 KAKAO BLIND RECRUITMENT > 실패율(Java)  (0) 2022.02.18
[프로그래머스] 찾아라 프로그래밍 마에스터 > 폰켓몬 (Java)  (0) 2022.02.16
[프로그래머스] 해시 완주하지 못한 선수(Java)  (0) 2022.02.15
[프로그래머스] Summer/Winter Coding(~2018) 소수 만들기  (0) 2022.02.08
[프로그래머스] 월간 코드 챌린지 시즌1 내적 (Java)  (0) 2022.02.06
    '🔥 Problem Solving/programmers' 카테고리의 다른 글
    • [프로그래머스] 2019 KAKAO BLIND RECRUITMENT > 실패율(Java)
    • [프로그래머스] 찾아라 프로그래밍 마에스터 > 폰켓몬 (Java)
    • [프로그래머스] 해시 완주하지 못한 선수(Java)
    • [프로그래머스] Summer/Winter Coding(~2018) 소수 만들기
    budtree
    budtree
    개발, 운동, 일상등의 글을 올립니다.

    티스토리툴바