12/8 Programmers LV2 풀이

김태준·2022년 12월 8일
0

Coding Test - Programmers

목록 보기
4/29

문제 풀이

프린터

def solution(priorities, location):
    wait_list = priorities.copy()
    importance = 0
    idx = [i for i in range(len(priorities))]
    while True:
        if wait_list[importance] < max(wait_list[importance+1:]):
            wait_list.append(wait_list.pop(importance))
            idx.append(idx.pop(importance))
        else:
            importance += 1
        if wait_list == sorted(wait_list, reverse = True):
            break
    answer = idx.index(location) + 1
    return answer

< 풀이 과정 >

  • 주요 풀이 : priorities 리스트 내 인덱스 값을 저장하여 내림차순 정렬된 이후의 인덱스값과 비교하기!

문제 내 주어진 priorities 리스트이 고정된 인덱스를 유지하기 위해 idx라는 리스트를 생성했고, 리스트 내 뒤의 값이 더 크면 뒤로 이동시켜줘야하는 과정을 거치기 위해 고정된 priorities를 두고, copy() 함수로 새로운 대기목록을 생성해준다.

  1. while 문을 통해 현재 인덱스 < 현재+1 인덱스 상황에서 큰 값이 존재한다면제일 왼쪽 값을 pop 해주고 다시 append 하여 진행
  2. 현재 인덱스가 제일 큰 경우, importance를 1씩 늘려가며 priorities 리스트 전체 순환
  3. pop과 append를 거친 리스트와, 내림차순한 결과가 동일하다면 break
  4. 앞서 고정된 인덱스 리스트인 idx에 location값과 일치하는 인덱스를 answer 결과로 리턴

[1차] 뉴스 클러스터링 - 카카오 2018 블라인드 공채


from collections import Counter
def solution(str1, str2):
    answer = 0
    str1 = str1.upper()
    str2 = str2.upper()
    s1 = []
    s2 = []
    for i in range(len(str1)-1):
        if str1[i:i+2].isalpha():
            s1.append(str1[i:i+2])
    for i in range(len(str2)-1):
        if str2[i:i+2].isalpha():
            s2.append(str2[i:i+2])
    
    if len(s1) == 0 and len(s2) == 0:
        return 65536
    c1 = Counter(s1)
    c2 = Counter(s2)
    intersection = len(list((c1 & c2).elements()))
    union = len(list((c1 | c2).elements()))
    answer = int(intersection / union * 65536)
    return answer

< 풀이 과정 >
collections 라이브러리의 Counter 모듈을 처음 사용하여 문제를 풀이하였다.

  1. str1과 str2 모두 대소문자 구분없고 알파벳을 제외한 숫자, 공백은 모두 제거하므로 isalpha() 함수를 이용하여 s1, s2 리스트에 추가해준다.
  2. 두 집합이 모두 공집합인 경우 1을 리턴하고 65536을 곱한다
  3. 교집합인 경우와 합집합인 경우의 값을 구해주고 결과 리턴
    ex) str1 : FRANCE, str2 : FRENCH인 경우
    c1 : Counter({'FR': 1, 'RA': 1, 'AN': 1, 'NC': 1, 'CE': 1})
    c2 : Counter({'FR': 1, 'RE': 1, 'EN': 1, 'NC': 1, 'CH': 1})
    list((c1 & c2).elements()) : ['FR', 'NC']
    list((c1 | c2).elements()) : ['FR', 'RA', 'AN', 'NC', 'CE', 'RE', 'EN', 'CH']
    Counter와 elements() 함수로 위와 같은 결과를 얻을 수 있다.

전화번호 목록

def solution(phone_book):
    answer = True
    phone_book.sort()
    for i in range(len(phone_book)-1):
        if phone_book[i] in phone_book[i+1]:
            answer = False
            break
    return answer

< 풀이 과정 >
phone_book 리스트를 sorting한 이후, 앞 번호가 뒤 번호에 포함될 경우 False를 출력하는 코드를 작성했으나, 효율성은 다 통과하고 13번 테케에서 실패가 떠버렸다.

아래와 같이 phone_book[i+1]:len(phone_book[i])] 으로 변경하여 문제를 해결하였다.

def solution(phone_book):
    answer = True
    phone_book.sort()
    for i in range(len(phone_book)-1):
        if phone_book[i] in phone_book[i+1][:len(phone_book[i])]:
            answer = False
            break
    return answer

생각해보니 그냥 단순히 phone_book[i] in phone_book[i+1]인 경우, 번호가 다른 번호의 접두어가 아닌 경우도 있다. 예를 들면 ['4', '54', '6']의 경우를 보면 접두어가 아니기에 True로 출력되어야 한다.
1. 주어진 입력 phone_book을 sort()오름차순 정렬해준다.
2. for 문을 돌려 phone_book 내 앞 인덱스가 뒤 인덱스[:앞인덱스 길이]로 존재한다면, False를 리턴하도록 한다.

profile
To be a DataScientist

0개의 댓글