[TIL]Day 151

이재희·2021년 4월 29일
0

TIL

목록 보기
151/312

itertools chain 모듈을 사용하여 2차원 리스트를 일렬로 이어붙이기

import itertools
arr = [[1,2,3],[4,5,6],[7,8,9]]
arr = list(itertools.chain(*arr))
print(arr)

list로 변환하지 않아도 max 같은 함수 사용이 가능하다.

import itertools
arr = [[1,2,3],[4,5,6],[7,8,9]]
print(max(itertools.chain(*arr)))

프로그래머스 순위검색
효율성 떨어지는 코드

def solution(info, query):
    answer = []
    for q in query:
        ql = q.replace('and ','').split(' ')
        cnt = 0
        for p in info:
            pl = p.split(' ')
            for i in range(5):
                if i == 4:
                    if int(ql[i]) <= int(pl[i]):
                        cnt += 1
                    break
                if ql[i] != '-' and ql[i] != pl[i]:
                    break
        answer.append(cnt)    
    return answer

효율성 통과 코드

def solution(info, query):
    answer = []
    d = get_dic(info,{})
    for k in d:
        d[k].sort()
    for q in query:
        ql = q.replace('and ','').split(' ')
        q1 = ''.join(ql[:-1])
        s = int(ql[4])
        cnt = 0
        if d.get(q1,False):
            cnt = upper_bound(d[q1],s-1)
        answer.append(cnt)    
    return answer

def get_dic(info,d):
    for s in info:
        t1 = s.split(' ')
        t2 = ['']
        n = int(t1[4])
        for i in range(4):
            t3 = []
            for j in range(len(t2)):
                t3.append(t2[j]+t1[i])
                t3.append(t2[j]+'-')
            t2 = t3
        for item in t2:
            # d[item] = d.get(item,[]) + [n]
            if d.get(item,False):
                d[item].append(n)
            else:
                d[item] = [n]
    return d

def upper_bound(arr,n):
    s = 0
    e = len(arr)
    while s < e:
        mid = s + (e-s)//2
        if n >= arr[mid]:
            s = mid + 1
        else:
            e = mid
    return len(arr) - s

key point
0.딕셔너리에 미리 저장해둬야함
1.정렬 미리 해야함
2.이진탐색으로 찾아야함

upper bound 알고리즘
특정값 이상의 값이 나타나는 인덱스 반환

def upper_bound(arr,n):
	arr.sort()
    s = 0
    e = len(arr)
    while s < e:
        mid = s + (e-s)//2
        if n >= arr[mid]:
            s = mid + 1
        else:
            e = mid
    return s
profile
오늘부터 열심히 산다

0개의 댓글