코딩 테스트 챌린지

[8월 코테 챌린지] 프로그래머스 :: (Lv0) 225개 (Lv1) 62개 (Lv2) 30개 (Lv3) 4개 // 누적 321개

  • -
728x90
반응형

2024/08/22

(Lv0) 225개 (Lv1) 62개 (Lv2) 30개 (Lv3) 4개 // 누적 321개


풀이한 문제

Lv2

  1. 전화번호 목록
 

프로그래머스

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

programmers.co.kr

 

문제 풀이

def solution(phone_book):
    phone_book.sort(key=lambda x:x)
    i = 0
    while i < len(phone_book)-1: #for i in range(len(phone_book)-1):
        k = len(phone_book[i])
        for j in range(i+1, len(phone_book)):
            if phone_book[j][:k] == phone_book[i]:
                return False
            elif len(phone_book[j])>k:
                break
            elif int(phone_book[j][0]) != int(phone_book[i][0]):
                break
        i += 1
    return True

 

처음엔 이렇게 작성했는데 While문에 for문까지 써서 시간복잡도 기준 초과로 효율성 테스트에서 fail했다.

그래서 for문 하나만 작성해서 문제를 해결하는 방식으로 생각해봤다.

def solution(phone_book):
    phone_book.sort(key=lambda x:x)
    # return phone_book
    for j in range(len(phone_book)-1):
        if len(phone_book[j+1]) < len(phone_book[j]):
            pass
        elif phone_book[j] == phone_book[j+1][:len(phone_book[j])]:
            return False
    return True

어차피 문자열을 길이와 상관없이 앞 순서에 오는 숫자 크기에 맞게 정렬했기 때문에 
맨 앞부터 2개씩만 비교하면 되겠다고 생각했다. 

그리고 처음에는 elif phone_book[j] in phone_book[j+1]:

이렇게 작성했는데 "192", "12319202"의 경우도 False로 출력할 수 있어서 문자열 길이를 기준으로 나눠서 if문을 작성했다.


미완성 문제

Lv2

  1. 구명보트
  2. 피로도
320x100
728x90
Contents

포스팅 주소를 복사했습니다

이 글이 도움이 되었다면 공감 부탁드립니다.