본문 바로가기

컴린이 일기장/Today I Learned

[TIL] 프로그래머스 - 전화번호 목록 / 위장 (feat. reduce)

반응형

[주절주절]

면접 통보 받았다! 휴
기술 면접이 포함되어 있어서 프로그래머스 고득점 kit로 유형 쭉 다시 보고 가볼 계획이다

 

[Today I Learned]

# 프로그래머스 - 전화번호 목록 

문제
전화번호부에 적힌 전화번호 중, 한 번호가 다른 번호의 접두어인 경우가 있는지 확인하려 합니다.전화번호가 다음과 같을 경우, 구조대 전화번호는 영석이의 전화번호의 접두사입니다.
구조대 : 119박준영 : 97 674 223지영석 : 11 9552 4421
전화번호부에 적힌 전화번호를 담은 배열 phone_book 이 solution 함수의 매개변수로 주어질 때, 어떤 번호가 다른 번호의 접두어인 경우가 있으면 false를 그렇지 않으면 true를 return 하도록 solution 함수를 작성해주세요.

 

@solution.py

처음에는 냅다 itertools의 combinations를 사용해서 접근했다. 들어올 수 있는 데이터 범위가 커서 긴가민가했는데,,, 역시나 효율성 테스트 탈락! 아예 답이 틀린 경우도 있었다.

다음 방법으로는 dict를 사용했다. (해쉬- 키) 처음에 dict에 phone_book의 원소를 모두 넣어놓고, phone_book의 for문을 돌면서 각각의 원소의 sub string이 dict에 있는지 검사하는 방법을 사용했다. 그럼 phone 자기 자신은 검사하지 않도록 했어야하는데 이 부분을 늦게 떠올려서 시간이 좀 오래 걸렸다. 

생각을 먼저 꼼꼼히 코드를 짜자! 냅다 테스트 돌리지 말고,,

def solution(phone_book):
    
    answer = True
    
    phone_dict = {p:1 for p in phone_book}
    
    for phone in phone_book:
        for i in range(len(phone)-1):
            if phone_dict.get(phone[:i+1]):
                answer = False
                break
        
        if not answer:
            break
    
    return answer

 

# 프로그래머스 - 위장

문제
스파이들은 매일 다른 옷을 조합하여 입어 자신을 위장합니다.
예를 들어 스파이가 가진 옷이 아래와 같고 오늘 스파이가 동그란 안경, 긴 코트, 파란색 티셔츠를 입었다면 다음날은 청바지를 추가로 입거나 동그란 안경 대신 검정 선글라스를 착용하거나 해야 합니다.
스파이가 가진 의상들이 담긴 2차원 배열 clothes가 주어질 때 서로 다른 옷의 조합의 수를 return 하도록 solution 함수를 작성해주세요.

 

@solution.py

def solution(clothes):
    
    clothes_dict = {}
    
    for name, kind in clothes:
        if clothes_dict.get(kind):
            clothes_dict[kind] += 1
            
        else:
            clothes_dict[kind] = 1
    
    answer = 1
    for c in clothes_dict.values():
        answer *= (c+1)
    
    return answer - 1

우선 dict에 옷 종류와 이름을 추가하는 과정은 Counter로 간소화할 수 있다.

from collections import Counter

cnt = Counter([kind for name, kind in clothes])

또 나는 리스트의 전체 원소의 곱을 구하는 방법으로 반복문을 사용했는데, reduce라는 처음 듣는 함수를 사용할 수 있다고 해서 간단하게 reduce에 대해 정리를 해보았다.

# reduce

- 주로 여러 데이터를 대상으로 누적 집계를 내기 위해 사용
- 기본 문법은 아래와 같음

reduce(집계 함수, 순회 가능한 데이터, 초기값 = None)

- 이 때, 집계 함수는 두 개의 인자를 받는데, 첫번째 인자는 누적자, 두번째 인자는 현재값이 된다. 누적자는 함수 실행의 시작부터 끝까지 계속해서 재사용되는 값이고, 현재값은 루프를 돌면서 계속 바뀌는 값이다.

따라서 리스트 원소의 전체 곱은 다음과 같은 식으로 계산할 수 있다.

reduce(lambda x, y: x*y, clothes_dict.values(), 1)
반응형