제주 탈출 일지

[c++][python3] 프로그래머스 레벨 1 - 모의고사 본문

코딩 테스트

[c++][python3] 프로그래머스 레벨 1 - 모의고사

귀건 2020. 10. 26. 04:03
728x90
반응형

첫번째 케이스 8번과 12번을 통과하지 못한 소스코드. 마지막 코드 어떤 사람이 많이 맞았는가를 출력할 떄 고민이 있었다. 한마디로 직관적으로 짠 코드. 한눈에 봐도 깔끔하지 못하다.

#include <string>
#include <vector>

using namespace std;

vector<int> solution(vector<int> answers) {
      
    //수포자 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, ...
    
    int one = 0;
    int two = 0;
    int three = 0;
    vector<int> math1 {1,2,3,4,5};
    vector<int> math2 {2,1,2,3,2,4,2,5};
    vector<int> math3 {3,3,1,1,2,2,4,4,5,5};
    
    int a = math1.size();
    int b = math2.size();
    int c = math3.size();
    
    for(int i = 0; i < answers.size(); i++)
    {  
        // 1이 맞췄는가?
       if(answers[i] == math1[i%a])
       {
           one++;
        }
        
        if(answers[i] == math2[i%b])
        {
            two++;
        }
        
        if(answers[i] == math3[i%c])
        {
            three++;
        }
    }
    
    vector<int> new_answer;
   
    if(one > two){
        if(one == three){
            new_answer.push_back(1);
            new_answer.push_back(3);
        }
        else{
            new_answer.push_back(1);
        }
    }
    else if(one < two){
        if(two == three){
            new_answer.push_back(2);
            new_answer.push_back(3);
        }
        else{
            new_answer.push_back(2);
            
        }
    }
    else{
        if(one == three){
            new_answer.push_back(1);
            new_answer.push_back(2);
            new_answer.push_back(3);
        }
        else if(three > one){
            new_answer.push_back(3);
        }
        else{
            new_answer.push_back(1);
            new_answer.push_back(2);
        }
    }
    
    return new_answer;
}

 

두 번째 개선코드

#include <string>
#include <vector>
#include <map>

using namespace std;

vector<int> solution(vector<int> answers) {
      
    //수포자 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, ...
    
    map<int, int> sol;
    
    vector<int> math1 {1,2,3,4,5};
    vector<int> math2 {2,1,2,3,2,4,2,5};
    vector<int> math3 {3,3,1,1,2,2,4,4,5,5};
    
    int a = math1.size();
    int b = math2.size();
    int c = math3.size();
    
    for(int i = 0; i < answers.size(); i++)
    {  
        // 1이 맞췄는가?
       if(answers[i] == math1[i%a])
       {
           sol[0]++;
        }
        
        if(answers[i] == math2[i%b])
        {
            sol[1]++;
        }
        
        if(answers[i] == math3[i%c])
        {
            sol[2]++;
        }
    }
    
    vector<int> new_answer;
    int max = 0;
    for(int i = 0; i < 3; i++){
        if(sol[i] > max){
            max = sol[i];
        }     
    }
    for(int i = 0; i < 3; i ++){
        if(max == sol[i]){
            new_answer.push_back(i+1);
        }
    }
  

 
    return new_answer;
}

코드길이가 확 줄었다. map을 사용했고, 그냥 3명이라 if문을 쓰는 것보다 반복문으로 최댓값을 찾아서, 최대값과 동일한 사람을 찾는게 빠르다고 판단되어 마지막 출력부를 저렇게 코딩했다.

 

어렵지 않은 문제.

 

2021.06.10)

 

파이썬3로 짠 코드 추가

 

첫 시도 57점.

def solution(answers):
    answer = []
    
    first = [1, 2, 3, 4, 5]
    second = [2, 1, 2, 3, 2, 4, 2, 5]
    third = [3, 3, 1, 1, 2, 2, 4, 4, 5, 5]
    index_first = 0
    index_second = 0
    index_third = 0
    score = {"1" : 0,"2" : 0,"3" : 0}
    
    for i in answers:
        index_first %= len(first)
        index_second %= len(second)
        index_third %= len(third)
        if i == first[index_first]:
            score["1"] += 1
        
        if i == second[index_second] :
            score["2"] += 1
        
        if i == third[index_second] :
            score["3"] += 1
        
        index_first += 1
        index_second += 1
        index_third += 1
    
    st_score = dict(sorted(score.items(),key=lambda x : x[1] ,reverse=True))
    max = 0
    for i in st_score:
        if max <= st_score[i]:
            max = st_score[i]
            answer.append(int(i))
        else:
            break
            
        
        
        
    
    return answer

 

ㅋㅋ 3번쨰 학생(third)의 인덱스를 비교할 때 실수가 있었다. index_second로 비교함.. ㅎ

그래서 헷갈림 방지를 위해서 아예 index를 통일했다.!

def solution(answers):
    answer = []
    
    first = [1, 2, 3, 4, 5]
    second = [2, 1, 2, 3, 2, 4, 2, 5]
    third = [3, 3, 1, 1, 2, 2, 4, 4, 5, 5]
    index = 0
    score = {"1" : 0,"2" : 0,"3" : 0}
    
    for i in answers:
        if i == first[index % len(first)]:
            score["1"] += 1
        
        if i == second[index % len(second)] :
            score["2"] += 1
        
        if i == third[index % len(third)] :
            score["3"] += 1
        
        index += 1
    
    st_score = dict(sorted(score.items(), key=lambda x : x[1] ,reverse=True))
    max = -1
    for i in st_score:
        if max <= st_score[i]:
            max = st_score[i]
            answer.append(int(i))
        else:
            break
            
    answer.sort()
           
    return answer

 

728x90
반응형
Comments