본문 바로가기

CodingTest/Programmers

[ 프로그래머스 ] 순위 검색

/  제출  1  /

def solution(info, query):
    answer = []
    for q in query:
        lan, pos, lev, food = q.split(' and ')
        food, score = food.split(' ')
        score = int(score)
        count = check(lan, pos, lev, food, score, info)
        answer.append(count)
    return answer

def check(lan, pos, lev, food, score, information):
    count = 0
    for info in information:
        lan_i, pos_i, lev_i, food_i, score_i = info.split(" ")
        score_i = int(score_i)
        if lan == lan_i or lan == '-':
            if pos == pos_i or pos == '-':
                if lev == lev_i or lev == '-':
                    if food == food_i or food == '-':
                        if score <= score_i:
                            count += 1
    return count
 
채점 결과
정확성: 40.0
효율성: 0.0
합계: 40.0 / 100.0
 
풀이 소요 시간 : 16분
 
if문 떡칠해서 사용하는건 제가 평소에 선호하는 방식도 아닙니다.
특히 해당 문제가 효율성 테스트를 시행하는 걸 봤을 때 적절치 못한 코드라는건 사실 제출 전에도 느낌이 왔습니다.

일단 지금 시간 제한 걸어두고 푸는 걸 연습 중이라 일단 정확한 답을 낼 것 같기는 해서 제출했습니다.

 

 
효율성테스트에 통과하도록 수정해보도록 하겠습니다.

 


/  제출 2  /

def solution(info, query):
    answer = []
    infos = []
    for inf in info:
        temp = list(inf.split(" "))
        temp[-1] = int(temp[-1])
        infos.append(temp)
        
    for q in query:
        lan, pos, lev, food = q.split(' and ')
        food, score = food.split(' ')
        score = int(score)
        
        count = check(lan, pos, lev, food, score, infos)
        answer.append(count)
    return answer

def check(lan, pos, lev, food, score, infos):
    count = 0
    lan_match = check_match(lan, infos,0)
    pos_match = check_match(pos, lan_match, 1)
    lev_match = check_match(lev, pos_match, 2)
    food_match = check_match(food, lev_match, 3)
    count = check_score(score, food_match)
    return count

def check_match(key, infos, i):
    if key == '-':
        return infos
    else:
        result = []
        for info in infos:
            if info[i] == key:
                result.append(info)
        return result
def check_score(score, array):
    count = 0
    for arr in array:
        if score <= arr[-1]:
            count += 1
    return count

 

채점 결과
정확성: 40.0
효율성: 0.0
합계: 40.0 / 100.0

 

 

하.. 안 되네요.. 

 

상위 코드에서는 info를 query마다 새로 만들어주는 정 말 비효율적인 코드라고 생각해서 해당 부분을 고쳐주었습니다.

 

그리고 info를 필터링하는 부분에서도 모든 배열을 통째로 검사하는 식으로 if문을 돌려서 효율성이 저하된다고 생각했습니다. 그래서 해당 부분을 함수로 기능을 쪼개서 매 항목 검사때마다 후보군을 줄여 나가는 식으로 구현했습니다.

 

그런데도 단 하나의 효율성테스트도 통과하지 못했습니다. 

 

당연합니다. 50,000 * 100,000 이 기본으로 들어가는 연산이기 때문입니다.

 

 

따라서 딕셔너리로 값을 찾거나 탐색시간을 줄일 수 있는 방법을 찾아봐야겠다고 생각했습니다.

 


 

카카오는 공채 시험에 대해서 문제 풀이를 제공한다는 것을 알게 됐습니다.

 

https://tech.kakao.com/2021/01/25/2021-kakao-recruitment-round-1/

 

2021 카카오 신입공채 1차 온라인 코딩 테스트 for Tech developers 문제해설

지난 2020년 9월 12일 토요일 오후 2시부터 7시까지 5시간 동안 2021 카카오 신입 개발자 공채 1차 코딩 테스트가 진행되었습니다. 테스트에는 총 7개의 문제가 출제되었으며, 개발 언어는 C++, Java, Jav

tech.kakao.com

 

따라서 해당 풀이를 보고 코드를 다시 작성하였습니다.