고구마와 감자
Amor DevFati(아모르 개발파티)
고구마와 감자
전체 방문자
오늘
어제
  • 분류 전체보기
    • 스프링
    • 알고리즘
      • 백준
      • 프로그래머스
      • 인프런_자바코테강의
      • 리트코드
      • 해커랭크
      • 코드업
      • 이것저것
    • 자바
    • GIT
    • 파이썬
    • 개발이론
    • JPA
    • 김영한 강의
      • 모든 개발자를 위한 HTTP 웹 기본 지식
      • 스프링 MVC 1편 - 백엔드 웹 개발 핵심 기술
      • 스프링 핵심 원리 - 기본편
    • 일기 및 아무말 적기

블로그 메뉴

  • 홈
  • 태그
  • 방명록

공지사항

인기 글

태그

  • 10409
  • 백준
  • 5361
  • 전투 드로이드 가격
  • 1598
  • Mini Fantasy War
  • 더하기 3
  • 남욱이의 닭장
  • 고려대학교에는 공식 와인이 있다
  • 14656
  • 조교는 새디스트야!!
  • 2857
  • 11023
  • 5988
  • 11966
  • 홀수일까 짝수일까
  • 꼬리를 무는 숫자 나열
  • 2의 제곱인가
  • 2921
  • 16673

최근 댓글

최근 글

티스토리

hELLO · Designed By 정상우.
고구마와 감자

Amor DevFati(아모르 개발파티)

알고리즘/프로그래머스

프로그래머스 전화번호 목록 (Python)

2022. 4. 17. 17:21

풀이 참조: https://youtu.be/4-iyppqNCyg

https://programmers.co.kr/learn/courses/30/lessons/42577

 

코딩테스트 연습 - 전화번호 목록

전화번호부에 적힌 전화번호 중, 한 번호가 다른 번호의 접두어인 경우가 있는지 확인하려 합니다. 전화번호가 다음과 같을 경우, 구조대 전화번호는 영석이의 전화번호의 접두사입니다. 구조

programmers.co.kr

위 유튜브 영상을 보고 정리하였습니다. 개발자로 취직하기 님께 감사드립니다. 

 

Solution 1

 

이중포문을 쓰고 if 문 2개로 서로 접두어인지 확인한다. 

테스트케이스 2개가 시간초과가 뜬다. 

# Loop를 활용한 솔루션 : 시간초과 뜸.
def solution_Loop(phone_book):
    # 1. 비교할 A 선택
    for i in range(len(phone_book)):
    # 2. 비교할 B 선택
       for j in range(i+1, len(phone_book)):
    # 3. 서로가 서로의 접두어인지 확인한다.
           if phone_book[i].startswith(phone_book[j]):
               return False
           if phone_book[j].startswith(phone_book[i]):
               return False

    return True

 

Solution 2

 

정렬을 하고 zip을 활용해서 배열의 2번째부터 시작하는 배열과 원래 배열을 묶어서, 비교하여 for문을 한 개로 줄인다.

시간초과없이 잘 통과한다.  

# Sorting / Loop를 활용한 solution
def solution_sorting(phone_book):
    # 1. 전화번호 sorting 한다
    phone_book.sort()
    
    # 2. sorting한 전화번호를 2개씩 확인해서 접두어인지 본다.
    for p1, p2 in zip(phone_book, phone_book[1:]):
        if p2.startswith(p1):
            return False

    return True

Solution 3

해쉬를 활용한 풀이

각 숫자를 키로  해시맵을 만들어 놓고 그 해당 키로 검색을 하는 방법이다.

 

jubdoo 라는 변수에 숫자를 하나씩 붙이면서 해시맵에 해당하는 접두 숫자가 있는지 확인한다. (if jubdoo in hash_map)

jubdoo가 지금 붙여지는 숫자가 아닌 다른 숫자와 일치하는지 동시에 파악한다. (and jubdoo != phone_number)

def solution(phone_book):
    # 1. Hash map 을 만든다.
    hash_map = {}
    for number in phone_book:
        hash_map[number] = 1

    print(hash_map)
    # 2. 접두어가 Hash map 에 존재하는지 찾는다.
    for phone_number in phone_book:
        jubdoo = ''
        for number in phone_number:
            jubdoo += number
            # 3. 접두어를 찾아야 한다. (기존 번호와 같은 경우는 제외한다)
            if jubdoo in hash_map and jubdoo != phone_number:
                return False

    return True

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

프로그래머스 n의 배수 고르기  (0) 2022.12.10
프로그래머스 A로 B만들기  (0) 2022.12.10
프로그래머스 369게임  (0) 2022.12.10
프로그래머스 7의 개수  (0) 2022.12.10
프로그래머스 2차원으로 만들기  (0) 2022.12.10
    '알고리즘/프로그래머스' 카테고리의 다른 글
    • 프로그래머스 A로 B만들기
    • 프로그래머스 369게임
    • 프로그래머스 7의 개수
    • 프로그래머스 2차원으로 만들기
    고구마와 감자
    고구마와 감자
    Amor DevFati는 김연자-Amor Fati에 Development(개발)의 Dev 를 첨가하여 만든 이름

    티스토리툴바