Notice
Recent Posts
Recent Comments
Link
«   2024/12   »
1 2 3 4 5 6 7
8 9 10 11 12 13 14
15 16 17 18 19 20 21
22 23 24 25 26 27 28
29 30 31
반응형
Archives
Today
Total
관리 메뉴

슈프림 블로그

[프로그래머스] 완전탐색 - 모의고사 (Swift / Java 풀이) 본문

코딩테스트

[프로그래머스] 완전탐색 - 모의고사 (Swift / Java 풀이)

_슈프림 2020. 9. 23. 00:15
728x90

 

programmers.co.kr/learn/courses/30/lessons/42840?language=swift

 

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

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

programmers.co.kr

 

n번째 답으로 무엇을 찍었을까??

수포자들은 일정한 패턴을 반복적으로 사용한다고 한다.

그렇다면 n번째 답으로는 몇번을 찍었을지 예측 할 수 있다!

수포자들이 사용하는 패턴의 길이가 count라고 하면, n번째 위치의 값n % count 위치의 패턴 값과 같다.

 

n번째 문제의 정답과 찍은 답 비교

따라서 n번째 문제의 정답(answer 배열)과 찍은 답(pattern 배열)을 비교하려면

answer[n]과 pattern[n % pattern.count]를 비교하면된다.

 

총 3명의 수포자 패턴이 있다고??

여기서, 수포자는 3명이므로 patterns라는 Int형 2차원 배열에 패턴을 고정시켜 넣어주었다.

그리고 반복문을 0~2까지 돌면서 모든 수포자의 찍은 답과 정답을 비교해 주었다.

 

정답을 맞추면 +1점

corrects 배열은 각 수포자가 맞춘 정답 개수를 담는 배열이다.

위에서 찍은 답과 정답을 비교하면서, 정답을 맞췄을 경우에는 corrects 배열에 각 자리에 +1을 해주었다.

=> 0번째 수포자는 0번 인덱스, 1번째 수포자는 1번 인덱스, 2번째 수포자는 2번 인덱스

 

가장 많이 맞춘 학생

corrects 배열에서 가장 많이 맞춘 점수를 구한다. = max

그리고 반복문을 돌면서 max와 같은 점수를 받은 학생의 인덱스를 배열에 넣어서 리턴하면 끝-!

 

Swift 최종 코드

import Foundation

func solution(_ answers:[Int]) -> [Int] {
    let patterns = [[1,2,3,4,5], [2,1,2,3,2,4,2,5], [3,3,1,1,2,2,4,4,5,5]]
    var corrects = [0,0,0]
   
    for i in 0..<answers.count {
        for j in 0..<3 {
            let pattern = patterns[j]
            if pattern[i%pattern.count] == answers[i] {
                corrects[j] += 1
            }
        }
    }
    
    let max = corrects.max()
    var answer = [Int]()
    for k in 0..<3 {
        if corrects[k] == max {
            answer.append(k+1)
        }
    }
    return answer
}

 

Swift의 경우, 배열이 가변크기이므로 바로 바로 추가해서 그대로 반환하면 되지만,

java의 경우, 배열은 고정크기이므로 일단 ArrayList를 사용하여 가변적으로 값을 추가한다음,

최종 길이가 정해지면 ArrayList와 같은 값을 가진 새로운 고정크기 배열을 생성해서 반환해주었다.

 

Java 최종 코드

import java.util.ArrayList;

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[] corrects = {0,0,0};
        
        for (int i=0; i<answers.length; i++) {
            for(int p=0; p<3; p++) {
                int[] pattern = patterns[p]
                if (answers[i] == pattern[i%pattern.length]) {
                    corrects[p] += 1;
                }
            }
        }
        int max = corrects[0];
        max = max > corrects[1] ? max : corrects[1];
        max = max > corrects[2] ? max : corrects[2];
        
        ArrayList<Integer> list = new ArrayList<>();
        if (max == corrects[0]) {list.add(1);}
        if (max == corrects[1]) {list.add(2);}
        if (max == corrects[2]) {list.add(3);}
        
        int[] answer = new int[list.size()];
        for(int i = 0; i < list.size(); i++){
            answer[i] = list.get(i);
        }
        
        return answer;
    }
}

 

반응형
Comments