알고리즘/프로그래머스

[프로그래머스] 외계어 사전 문제 : sort와 sorted

Ynghan 2024. 4. 18. 22:37

문제 설명

입력 파라미터

spell : 알파벳이 담긴 리스트

dic : 외계어 문자열이 담긴 리스트

→ spell에 담긴 알파벳을 한번씩만 모두 사용한 단어가 dic에 있다면 1 반환, 없다면 2 반환

입출력 예

spell dic result
["p", "o", "s"] ["sod", "eocd", "qixm", "adio", "soo"] 2
["z", "d", "x"] ["def", "dww", "dzx", "loveaw"] 1
["s", "o", "m", "d"] ["moos", "dzx", "smm", "sunmmo", "som"] 2

슈도 코드

# dic의 모든 요소를 조회

# 조회한 문자열 요소를 리스트로 만든다. -> 어떻게?

# 리스트를 sort() 한다.

# spell 리스트도 sort() 한다.

# 비교한다. 있으면 1 리턴


풀이 도출 과정

Q. 문자열을 리스트로 변환한 것과 일반 리스트를 비교 연산자로 비교할 수 있을까?

if spell == list(word)

→ 비교할 수 있다.

spell = ['p', 'y', 't', 'h', 'o', 'n']
word = "python"

# 문자열을 리스트로 변환
word_list = list(word)

# 리스트끼리 비교
if spell == word_list:
    print("두 리스트는 같습니다.")
else:
    print("두 리스트는 다릅니다.")

→ “두 리스트는 같습니다.”가 출력될 것이다.

 

Q. 왜 리스트 spell을 sort() 했을 때는 리스트로 다시 반환이 되는데, 문자열을 리스트로 바꾸고 이를 sort()하면 None이 나올까?

def solution(spell, dic):
    answer = 0
    spell.sort()
    print(spell)
    for word in dic:
        a = list(word).sort()
        print(a)
    return  

 

입력값 ["p", "o", "s"], ["sod", "eocd", "qixm", "adio", "soo"]
기댓값 2
실행 결과 테스트를 통과하였습니다.
출력 ['o', 'p', 's']
None
None
None
None
None

→ 이유는 문자열을 리스트로 변경할 때, 해당 리스트를 담을 변수를 만들어 준 다음에 해당 변수를 통해 sort()를 실행해야 한다. 왜냐하면 sort() 메서드가 리스트 자체를 정렬하고, 정렬된 리스트를 반환하지 않기 때문이다.

명시적으로 리스트를 변경하는 메서드들은 일반적으로 객체 자체를 반환하지 않고 None을 반환함으로써, 메서드가 객체를 직접 변경했다는 것을 분명히 한다.

만약 정렬된 리스트를 얻고 싶다면, 

1. list(word)에 대한 값을 새롭게 담을 변수를 생성한 이후 sort()를 수행하고 해당 변수를 이용하는 방법을 사용하거나

def solution(spell, dic):
    answer = 0
    spell.sort()
    print(spell)
    for word in dic:
        a = list(word)
        a.sort()
        print(a)
    return

2. sorted() 함수를 사용하는 방법이 있다. sorted() 함수는 원본 리스트를 변경하지 않고, 정렬된 새로운 리스트를 반환한다.

word = "sod"
sorted_list = sorted(list(word))
print(sorted_list)

위 코드는 문자열의 각 문자를 개별 요소로 하는 새로운 정렬된 리스트를 출력할 것이다.


해결

sorted 사용

def solution(spell, dic):
    answer = 0
    spell.sort()
    print(spell)
    for word in dic:
        if spell == sorted(list(word)):
            return 1
    return 2

sort 사용

def solution(spell, dic):
    answer = 0
    spell.sort()
    for word in dic:
        li = list(word)
        li.sort()
        if spell == li:
            return 1
    return 2