[Python - Lv.2] 전화번호 목록

2024. 3. 21. 23:22·알고리즘 연습/프로그래머스

문제

 

프로그래머스

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

programmers.co.kr

문제
문제

문제 이해

  • 한 번호가 다른 번호의 접두어인 경우가 있는지 확인
  • 전화번호를 담은 배열 phone_book
  • 어떤 번호가 다른 번호의 접두어인 경우 False, 그렇지 않다면 True 반환

풀이

배열 phone_book을 모두 확인하여 접두어가 있으면 False, 접두어가 없다면 True 반환
배열 phone_book의 길이는 최대 1,000,000이므로 시간 초과에 유의
=> 연산 횟수를 줄이기 위해 배열과 문자열의 길이를 변수를 통해 저장 및 조건문 추가
  1. sort 메소드를 통해 phone_book을 정렬 -> (ex. [1, 12, 123, 2, 21, 345, 413])
  2. phone_book을 이차 반복문을 통해 하나씩 비교
  3. 두 가지 조건을 통해 연산 횟수를 줄이고 오류 발생 방지
  4. 중간에 다른 번호에 접두어가 있을 경우 바로 False 반환, 모든 경우에 접두어가 없다면 True 반환
<오류 발생 방지>
접두어인지 확인하기 위해 phone_book[i] == phone_book[j][:l2] 조건을 활용(단, l2 = len(phone_book[i])
만약 phone_book[j]의 길이가 더 짧다면 인덱싱 오류가 발생하므로 해당 조건이 필요

<연산 횟수를 줄이기 위한 조건>
첫 번째 작업으로 phone_book을 사전식으로 정렬
만약 앞에 있는 번호의 크기보다 뒤에 있는 번호의 크기가 크다면 그 이후는 접두어가 존재하지 않음
따라서 int(phone_book[i]) < int(phone_book[j][:l2] 조건을 통해 연산 횟수를 획기적으로 감소

코드

처음에  int(phone_book[i]) < int(phone_book[j][:l2] 조건을 넣지 않고 제출했을 때, 효율성 테스트에서 시간초과가 발생하였다. 따라서 해당 조건을 추가하면 phone_book의 길이가 길어지더라도 빠른 속도로 처리가 가능하다. 실제로 정확성 테스트에서 조건 추가 전에는 791ms가 걸렸던 테스트가 조건 추가 시 3ms로 처리됐다.

def solution(phone_book):
    l = len(phone_book)
    
    phone_book.sort()
    for i in range(l):
        l2 = len(phone_book[i])
        for j in range(i + 1, l):
            if l2 > len(phone_book[j]):
                continue
            elif int(phone_book[i]) < int(phone_book[j][:l2]):
                break
            elif phone_book[i] == phone_book[j][:l2]:
                return False
    return True

'알고리즘 연습 > 프로그래머스' 카테고리의 다른 글

[Python - Lv.3] 이중우선순위큐  (0) 2024.04.02
[Python - Lv.2] 행렬의 곱셈  (0) 2024.03.23
[Python - Lv.2] 프로세스  (0) 2024.03.20
[Python - Lv.2] 의상  (0) 2024.03.19
[Python - Lv.2] 기능개발  (3) 2024.03.18
'알고리즘 연습/프로그래머스' 카테고리의 다른 글
  • [Python - Lv.3] 이중우선순위큐
  • [Python - Lv.2] 행렬의 곱셈
  • [Python - Lv.2] 프로세스
  • [Python - Lv.2] 의상
기억에 남는 블로그 닉네임
기억에 남는 블로그 닉네임
  • 기억에 남는 블로그 닉네임
    얕게, 깊게
    기억에 남는 블로그 닉네임
  • 전체
    오늘
    어제
  • 블로그 메뉴

    • 홈
    • 방명록
    • 글쓰기
    • 분류 전체보기
      • Data Engineering
        • Airflow
        • 빅데이터
        • 자동화
        • 기타
      • Infra
        • AWS
        • Terraform
        • [인프라 구축기] Terraform 활용 AWS ..
      • CS
        • 자료구조
        • 알고리즘
        • 네트워크
        • 데이터베이스
        • 이것이 취업을 위한 코딩 테스트다 with 파이썬
      • Python
      • Web
      • Git
      • 기타
        • 취업 & 진로
        • 회고록
        • 기타
      • 프로젝트 단위 공부
        • [부스트코스] DataLit : 데이터 다루기
        • [개인 프로젝트] 공모전 크롤링
        • [개인 프로젝트] FC Online 공식 경기 분..
        • 프로젝트 개선 방안
      • [프로그래머스] 데이터 엔지니어링 데브코스 3기
        • TIL(Today I Learn)
        • 숙제
        • 기타
      • 알고리즘 연습
        • 프로그래머스
        • 백준
  • 링크

    • 깃허브
    • 링크드인
  • 인기 글

  • 최근 글

  • 최근 댓글

  • hELLO· Designed By정상우.v4.10.3
기억에 남는 블로그 닉네임
[Python - Lv.2] 전화번호 목록
상단으로

티스토리툴바