본문 바로가기
algorithmProblems

전화번호 목록

by holaf 2021. 2. 19.
반응형

조합이다? zip이다!

리스트 아이템을 서로 비교하는 것이 필요한가? 즉, 아이템들을 조합 묶어서 뭐가 조치를 취해야한다? 그럼 zip을 쓰자.

 

일단 zip을 다시 상기시켜보자.

a=[1,2,3]
b=[1,2]

list(zip(a,b))
#[(1,1),(2,2)]

 

문제

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

  • 구조대 : 119
  • 박준영 : 97 674 223
  • 지영석 : 11 9552 4421

전화번호부에 적힌 전화번호를 담은 배열 phone_book 이 solution 함수의 매개변수로 주어질 때, 어떤 번호가 다른 번호의 접두어인 경우가 있으면 false를 그렇지 않으면 true를 return 하도록 solution 함수를 작성해주세요.

 

입출력 예시:

[119, 97674223, 1195524421] -> false

[123,456,789] -> true

[12,123,1235,567,88] -> false

 

접근방법 (의식의 흐름을 모두 기록하자)

일단, 접두어 확인은 startswith() 함수를 쓰면된다.

 

그리고, 아이템들을 서로서로 비교해야되기 때문에, 즉 조합을 만들고, 그 조합끼리 비교해야되기 때문에! zip을 쓰면된다.

 

아이템이 3개인 리스트에선, 가능한 조합이 3개 나온다 (조합: 3 C 2)

이론상(?)

[ (119,97674223), (97674223,1195524421), (119,1195524421)]

이렇게 세 조합이 나온다.

 

그럼, zip으로 이런식으로 조합을 만들려면 어떻게 해야할까?

[119,97674223,1195524421] 과

[97674223,1195524421] 을 zip 하면 일단 두개 조합을 만들 수 있다.

 

(119,97674223), (97674223,1195524421)

 

이게 뭐냐하면,

phone_book (리스트 전체) 와 phone_book[1:] (리스트의 아이템 0번을 제외한/1번 부터 끝까지)이다.

 

근데 여기서 문제가 있다. (119,1195524421)은???

 

여기에 phone_book을 sorting해줘야하는 이유가 있다.

 

phone_book.sort()를 하면 아래처럼 순서가 정렬된다. str은 index값끼리 대소를 비교하기 때문이다.

['119', '97674223', '1195524421'] ->

['119', '1195524421', '97674223'] 

 

새로운 phone_book으로 zip(phone_book,phone_book[1:])을 하면,

(119,1195524421), (1195524421,97674223)

이렇게 두 조합이 나온다.

 

그럼에도 뭔가 찝찝한건왜일까? (119,97674223)은?

맨 첫 아이템과 마지막 아이템은 비교할 필요가 없다. 왜냐면, sort를 했기때문에 맨앞과 맨뒤 아이템은 매우 다르다. 설사 마지막 아이템이 119로 시작해서 포함관계여도, 이미 앞에서 매칭되는 케이스가 나왔을거기 때문에 이 케이스는 비교하지 않아도 된다. 이 문제는 true,false 문제니까 매칭되는 경우를 1번만 확인하면되기 떄문이다!

 

정리하자면,

def solution(phone_book):

	phone_book.sort()
    
    for a,b in zip(phone_book,phone_book[1:]):
    	if b.startswith(a):
        	return False
        else:
        	return True

else의 경우, 생략이 가능하다.

def solution(phone_book):

	phone_book.sort()
    
    for a,b in zip(phone_book,phone_book[1:]):
    	if b.startswith(a):
        	return False
        return True

 

 

 

programmers.co.kr/learn/courses/30/lessons/42577?language=python3

 

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

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

programmers.co.kr

 

2021.02.18 - [develop] - [Python] Map, Lambda, Zip

 

[Python] Map, Lambda, Zip

😇 Map Map은 리스트에 있는 모든 아이템에게 어떠한 조치를 내릴 때 (즉, 반복문을 돌릴 때) 쓰는 긴 코드를 확 줄여줄 수 있다. #제곱을 시켜주는 함수가 있다고 치자. def pow(n): return n**2 bts=[1,2,3,4

yiyudesign.tistory.com

 

반응형

댓글