민듀키티

프로그래머스 Python 코딩테스트 (LEVEL 1 - 6) 본문

Coding Test

프로그래머스 Python 코딩테스트 (LEVEL 1 - 6)

민듀키티 2023. 7. 31. 17:55

🔴 문제 1 : 신규 아이디 추천 (2021 KAKAO BLIND RECRUITMENT)

https://school.programmers.co.kr/learn/courses/30/lessons/72410

 

프로그래머스

코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.

programmers.co.kr

 

정답 ) 

import re
def solution(new_id):
    new_id = new_id.lower() 
    new_id = re.sub('[^a-z-_\.0-9]', '', new_id)
    new_id = re.sub('[\.]+', '.', new_id)
    new_id = re.sub('^\.', '', new_id)
    new_id = re.sub('\.$', '', new_id)

    if len(new_id) == 0 :
        new_id=new_id.join("a")

    if len(new_id) >= 16 :
        new_id = new_id[0:15]

    if len(new_id) <= 3 :
        range_number = 3 - len(new_id)
        new_id = new_id + (new_id[-1] * range_number )
        
    new_id = re.sub('\.$', '', new_id)


    return new_id
  • 정규표현식을 활용하여 알파벳 소문자, 숫자, 빼기(-), 밑줄(_), 마침표(.)를 제외시킴
  • 빈 문자열을 판단하는 방법은 "len(new_id) == 0" 로 판단함. 
  • 만약 문자열의 크기가 16을 넘어갈 경우에는 인덱싱 방식으로 [0:15]까지 
  • 만약 문자열의 크기가 3보다 작을 경우, 반복해야하는 횟수를 구해서, 마지막 문자값을 더해주기
  • 문자열 제외를 하다가 마지막 값이 "." 가 있을 수 있기 때문에 다시 한 번 더 정규표현식을 활용하여 마지막 마침표 문자를 제외시킴

 


🔴 문제 2 : 체육복 

https://school.programmers.co.kr/learn/courses/30/lessons/42862

 

프로그래머스

코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.

programmers.co.kr

 

정답 ) 

def solution(n, lost, reserve): 
    answer = 0 
    
    reserve_del = set(reserve)-set(lost) 
    lost_del = set(lost)-set(reserve) 
    
    for i in reserve_del: 
        if i-1 in lost_del: 
            lost_del.remove(i-1) 
            
        elif i+1 in lost_del: 
            lost_del.remove(i+1) 
            
    answer = n - len(lost_del)
    
    return answer
  • 이 문제의 함정은 "여벌 체육복을 가져온 학생이 체육복을 도난당했을 수 있습니다." 라는 것임. 또한 "중복이 없다" 라는 점
  • 따라서, 여벌 체육복이 있는 학생도 도난을 당했을 수도 있음
    • 예를 들어 reserve = [1,2,3] 이고 lost = [3,4] 처럼
    • 그렇기 때문에 "3" 이라는 값은 reserve에서 제거해줘야 함
    • 또한 중복을 허락하지 않으니깐 set(집합) 으로 만들어줘서 처리
  • reserve_del 을 하나씩 돌면서 reserve_del - 1 또는  reserve_del + 1 값이 lost_del 에 있다면, lost_del 리스트에 있는 해당 값을 remove 해줌

 


🔴  문제 3 : 실패율 (Kakao Blind Recruitment)

https://school.programmers.co.kr/learn/courses/30/lessons/42889

 

프로그래머스

코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.

programmers.co.kr

* 사실 이 문제는 파이참 리턴 값이랑, 프로그래머스 리턴값이랑 다르게 나온다,, 진짜 왜 다르게 나오는지 모르겠어서 ㅜㅜ

 

 

정답 ) 

def solution(N, stages):
    # 스테이지 클리어하지 못한 리스트 / not_clear = []
    # 스테이지에 도달한 플레이어 수 리스트 / total_player = []

    not_clear = []
    total_player = []
    answer_list = []

    for i in range(1,N+1) :
        count = 0
        total_count = 0
        for k in stages :
            if i == k :
                count += 1

            if k >= i :
                total_count += 1

        not_clear.append(count)
        total_player.append(total_count)

    for i in range (len(not_clear)) :
        answer_list.append(not_clear[i] / total_player[i])

    sorted_list= []

    for i in range (len(answer_list)) :
        sorted_list.append(answer_list.index(max(answer_list))+1)
        answer_list[answer_list.index(max(answer_list))] = -1

    return sorted_list
  • 단계별 스테이지 클리어하지 못한 리스트를 not_clear 리스트에, 단계별 스테이지에 도달한 플레이어 수 리스트를 total_player 리스트에 저장
  • not_clear 리스트
    • 1단계에 멈춰있는 사람이 있다 ? 그럼 stages 리스트에서 단순히 1값만 카운트 해주면 됨
    • 2단계에 멈춰있는 사람이 있다 ? 그럼 stages 리스트에서 단순히 2값만 카운트 해주면 됨
  • total_player 리스트
    • 5단계에 멈춰있는 사람이 있다 ? 그럼 1,2,3,4 단계는 통과했다는 뜻
    • 4단계에 멈춰있는 사람이 있다 ? 그럼 1,2,3 단계는 통과했다는 뜻
  • answer_list [i] = not_clear[i] / total_player[i] 로 실패율을 계산해줌
  • 그리고 index를 활용하여 list 값을 뽑아줌