프로그래머스 Level 1 : 모의고사(완전탐색)
Computer Science/알고리즘(백준+프로그래머스)

프로그래머스 Level 1 : 모의고사(완전탐색)

#문제

https://programmers.co.kr/learn/courses/30/lessons/42840

 

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

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

programmers.co.kr

 

# 접근방식

1) 우선 수포자 3명의 패턴을 리스트로 저장한다
2) 수포자 3명의 패턴을 answers 리스트와 비교해서 점수를 낸다 - (size%index)을 이용한 반복문 없는 loop strategy
3) 점수를 score list에 담는다
4) score list의 최댓값을 낸다
5) score list의 최댓값과 score list의 값을 하나하나 비교하며 최댓값과 같으면 answer list에 넣는다

 

#1st Trial

def solution(answers): 
	answer = [] 
    arr1=[1,2,3,4,5] 
    arr2=[2,1,2,3,2,4,2,5] 
    arr3=[3,3,1,1,2,2,4,4,5,5] 
    
    score=[0,0,0] 
    
    score[0]=returnScore(answers,arr1) 
    score[1]=returnScore(answers,arr2) 
    score[2]=returnScore(answers,arr3) 
    
    sortedScore=sorted(score) 
    
    for i in range(len(score)): 
    	if(sortedScore[2]==score[i]): answer.append(i+1) 
        
    answer.sort()
    return answer
 
 def returnScore(answers,arr): 
   score=0 
   for i in range(len(answers)): 
     size=len(arr) 
     idx=i%size 
     if answers[i]==arr[idx]: score+=1 
   
   return score

-> 성공은 했지만 뭔가 깔끔하지 못한느낌.. 굳이 함수로 빼서 for문을 세 번 실행할 필요가 없는듯 하다.

#2nd Trial

def solution(answers): 
	answer = [] 
    arr1=[1,2,3,4,5] 
    arr2=[2,1,2,3,2,4,2,5] 
    arr3=[3,3,1,1,2,2,4,4,5,5] 
    
    score=[0,0,0] 
    
    for i in range(len(answers)): 
    	if answers[i]==arr1[i%(len(arr1))]: score[0]+=1 
        if answers[i]==arr2[i%(len(arr2))]: score[1]+=1 
        if answers[i]==arr3[i%(len(arr3))]: score[2]+=1 
        
    for i in range(len(score)): 
    	if(max(score)==score[i]): answer.append(i+1) 
    
    answer.sort() 
    return answer

1번째, 2번째 실행 결과 전체적으로 2번째가 약간 더 빠름..

- 고찰: Python List Rules!


+) c++ 풀이

#include <string> 
#include <vector> 
#include<algorithm> 
using namespace std; 

vector<int> solution(vector<int> answers) { 
    vector<int> answer; 
    int arr1[] = { 1,2,3,4,5 }; 
    int arr2[] = { 2,1,2,3,2,4,2,5 }; 
    int arr3[] = { 3,3,1,1,2,2,4,4,5,5 }; 
    int score[3] = { 0 }; 

    for (int i = 0; i < answers.size(); i++) { 
        if (arr1[i % 5] == answers[i]) score[0]++; 
        if (arr2[i % 8] == answers[i]) score[1]++; 
        if (arr3[i % 10] == answers[i]) score[2]++; } 


    int maxVal = *max_element(score, score + 3); 

    for (int i = 0; i < 3; i++) { 
        if (score[i] == maxVal) { 
        answer.push_back(i + 1); } 
        } 


    return answer; } /*max_element함수를 통해 array의 최댓값 구할수 있다.*/