• 분류 전체보기 (512)
    • 개발남노씨(Coding Test) (6)
    • 고농축 백엔드 (17)
    • 재귀함수 DFS 총정리 (1)
    • 프론트엔드 날개달기:Vuejs.React (1)
    • 훈훈한 javascript (5)
    • 렛츠기릿 자바스크립트 (18)
    • 나도코딩 (1)
      • 웹 스크래핑 (1)
    • 프로그래머스(자바스크립트) (41)
      • LV.0(자바스크립트) (41)
    • 프로그래머스(자바) (121)
      • LV.0(자바) (56)
      • LV.1(자바) (41)
      • LV.2(자바) (23)
    • 프로그래머스(파이썬) (127)
      • LV.0(파이썬) (46)
      • LV.1(파이썬) (51)
      • LV.2(파이썬) (30)
    • 임시저장소 (31)
    • 프로젝트 (0)
    • 자바 알고리즘 (13)
      • 알고리즘 직빵 자바 문법 (10)
      • String(문자열) (3)
    • 파이썬 알고리즘 (93)
      • 알고리즘 직빵 파이썬 문법 (20)
      • 알고리즘 백준 (2)
      • 파이썬 알고리즘(사고력기르기) (6)
      • 파이썬 탐색 & 시물레이션 (8)
      • 이분탐색 & 그리디 알고리즘 (10)
      • 스택, 큐, 해쉬, 힙 (10)
      • 완전탐색과 DFS기초 (12)
      • DFS, BFS 활용 (19)
      • 동적계획법 (6)
    • 자바 (27)
      • Java TPC(생각하고, 표현하고, 코딩하고) (17)
      • Java (중요하고, 이해 안 되고, 어려운) (10)
    • 스프링 (5)
      • 스프링 MVC 패턴 2편 (5)
hELLO · Designed By 정상우.
@@#@@

기록용 블로그

프로그래머스(파이썬)/LV.2(파이썬)

전화번호 목록 →기준값 갱신+startswith()+숫자문자열 정렬★★

2022. 12. 29. 23:55

1차 극복

예) 119 > 119234 (접두어인 경우) false, 
     119 > 12119234 (중간 포함이므로 접두어 아님) true
     119 > 12342119 (끝에 포함이므로 접두어 아님) true

 

 

▶ startswith() → 테스트 케이스1 극복

 

 

 

2차 극복

 

▶ 테스트 케이스 ["11" "1"] → false가 나와야된다. 

    왜냐하면 아래와 같이 정렬하는 경우 
   

    ["1" "11"] →  "11"안에 접두어 "1"이 있으므로 false가 나와야된다. 

    이러한 테스트 케이스를 극복하기 위해 미리 "문자열길이"를 기준으로 정렬해준다. (어차피 틀린 풀이)

 

 

3차 극복 

▶ break를 사용하는 경우 안쪽 for문을 종료하고, 바깥쪽 for문을 다시 수행하지만,

   

   접두어가 포함된 문자열을 찾은 경우 return False하면 함수가 바로 종료되므로,

 

   바깥쪽 for문을 순회하는 비효율성을 제거할수있다. 

 

  →효율성 테스트 1,2만 통과 

 

 

 

4차 극복

 

▶ 효율성 테스트 3,4 실패

 

정렬기준을 "문자열 길이"에서 sort()로 바꾸었다.

 

 

str으로 구성된 리스트를 sort()로 정렬하면

 

"숫자문자열"의 첫번째 index의 "숫자문자"에 따라 정렬된다. 

phone_book = ["3", "1117", "213", "123456789"] 일 때

sort()정렬을 하는 경우 

 

"문자열의 길이와 무관하게"

아래와 같은 결과가 나온다.  

['1117', '123456789', '213', '3']


왜 그렇냐?? 왜!!!!!!!!!!!

sort() 함수는 문자열을 정렬할 때, 
즉, 각 문자열 요소의 첫 번째 인덱스의 문자 기준으로 정렬이 이루어진다.
 
그래서 주어진 리스트에서는 첫 번째 인덱스인 '1'이 제일 앞에 위치하고, 그 다음으로 '2'가 위치하고,

마지막으로 '3'이 위치한다.


그래서 정렬 결과가  ['1117', '123456789', '213', '3'] 으로 출력된다. 


그러면 본래 문제로 들어서 Hint를 설명하겠다. 

phone_book = ["11", "1", "1117", "213", "123456789"]

위의 코드를 정렬하면 

['1', '11', '1117', '123456789', '213']

여기서 이미 Hint가 나왔다. 

"1" 옆에는 가장 가까운 "11" 숫자 문자열이 존재한다.

그러면 "1117" 비교할 필요가 없다. cutting하면 된다.

다시 말해서 정렬한 후 접두어의 옆에만 확인하면 끝이다.!!! 


왜냐하면 sort()한 결과 접두어의 우측 옆에는 가장 가까운 숫자문자열이 오기 때문이다!!! 

가장 가까운 문자열이 접두어를 포함하고 있지 않다면,

그 나머지 숫자문자열은 check할 필요가 없다.

 

 

→ 이중 for문에서 for문 1개를 삭제할 기회가 생겼다.

 

 

 

 

 

 

 

 

 

 

 

 

 

나의 풀이 

def solution(phone_book):
    phone_book.sort()
    answer=True


    for i in range(len(phone_book)-1):
        standard=phone_book[i]
        if  phone_book[i+1].startswith(standard):
            answer=False
            return answer
    return answer

 

 

 

저작자표시 비영리 변경금지 (새창열림)

'프로그래머스(파이썬) > LV.2(파이썬)' 카테고리의 다른 글

k진수에서 소수 개수 구하기→ 10진수를 n진법, 소수 판별★,filter()함수★  (0) 2023.01.02
타켓넘버→ DFS(깊이우선탐색)★★+요소 더하기, 요소 빼기+ 재귀함수  (0) 2022.12.30
뉴스 클러스터링→isalpha(), str1[i:i+2], set(), count()★★  (0) 2022.12.28
프린터 → 응급실(큐)+리스트 컴프리핸션 + enumerate()+ any()★★  (0) 2022.12.28
기능 개발→ deque, 이중 while문★, 미친 for문★, 갱신★  (0) 2022.12.27
    '프로그래머스(파이썬)/LV.2(파이썬)' 카테고리의 다른 글
    • k진수에서 소수 개수 구하기→ 10진수를 n진법, 소수 판별★,filter()함수★
    • 타켓넘버→ DFS(깊이우선탐색)★★+요소 더하기, 요소 빼기+ 재귀함수
    • 뉴스 클러스터링→isalpha(), str1[i:i+2], set(), count()★★
    • 프린터 → 응급실(큐)+리스트 컴프리핸션 + enumerate()+ any()★★
    @@#@@
    @@#@@
    자바, 스프링, 알고리즘, 깃허브, 파이썬

    티스토리툴바