코테 공부/python

Python 외계어 사전, 요소 제거하면서 for문을 돌리면..

sweet-po 2023. 6. 7. 09:55

https://school.programmers.co.kr/learn/courses/30/lessons/120869

 

remove 로 하려고 했으나 의도한 결과가 나오지 않아서 for문에서 매번 새로운 리스트를 만드는 방법으로 통과는 했으나

타 풀이에서 set으로 차집합을 구해 푸는 기똥찬 풀이가 있었고!

def solution(spell, dic):

    # for ch in spell:
    #     dic = [s for s in dic if ch in s]
    # return 1 if len(dic) != 0 else 2
    
    for s in dic:
        if not set(spell) - set(s):
            return 1
    return 2

 

아까 말한대로 remove로 요소 제거하면서 for문을 돌리면..

def solution(spell, dic):

    # for ch in spell:
    #     dic = [s for s in dic if ch in s]
    
    for ch in spell:
        for s in dic:
            print(dic, s, ch)
            if ch not in s:
                dic.remove(s)
                
    print(dic)
    
    return 1 if len(dic) != 0 else 2

이런식으로 요소를 건너뛰고 for문을 돌리더라.. idx도 아니고 요소로 돌렸는데 좀 의아한 결과였다

테스트 1
입력값 〉	["p", "o", "s"], ["sod", "eocd", "qixm", "adio", "soo"]
기댓값 〉	2
실행 결과 〉	실행한 결괏값 1이 기댓값 2과 다릅니다.
출력 〉	['sod', 'eocd', 'qixm', 'adio', 'soo'] sod p
['eocd', 'qixm', 'adio', 'soo'] qixm p
['eocd', 'adio', 'soo'] soo p
['eocd', 'adio'] eocd o
['eocd', 'adio'] adio o
['eocd', 'adio'] eocd s
최종 ['adio']

테스트 2
입력값 〉	["z", "d", "x"], ["def", "dww", "dzx", "loveaw"]
기댓값 〉	1
실행 결과 〉	테스트를 통과하였습니다.
출력 〉	['def', 'dww', 'dzx', 'loveaw'] def z
['dww', 'dzx', 'loveaw'] dzx z
['dww', 'dzx', 'loveaw'] loveaw z
['dww', 'dzx'] dww d
['dww', 'dzx'] dzx d
['dww', 'dzx'] dww x
최종 ['dzx']

테스트 3
입력값 〉	["s", "o", "m", "d"], ["moos", "dzx", "smm", "sunmmo", "som"]
기댓값 〉	2
실행 결과 〉	실행한 결괏값 1이 기댓값 2과 다릅니다.
출력 〉	['moos', 'dzx', 'smm', 'sunmmo', 'som'] moos s
['moos', 'dzx', 'smm', 'sunmmo', 'som'] dzx s
['moos', 'smm', 'sunmmo', 'som'] sunmmo s
['moos', 'smm', 'sunmmo', 'som'] som s
['moos', 'smm', 'sunmmo', 'som'] moos o
['moos', 'smm', 'sunmmo', 'som'] smm o
['moos', 'sunmmo', 'som'] som o
['moos', 'sunmmo', 'som'] moos m
['moos', 'sunmmo', 'som'] sunmmo m
['moos', 'sunmmo', 'som'] som m
['moos', 'sunmmo', 'som'] moos d
['sunmmo', 'som'] som d
최종 ['sunmmo']

 

보기 쉽게 인덱스를 요소로 하여 돌리면

spell = ['1', '3', '5']
dic = ['0', '1', '2', '3', '4', '5', '6', '7']

for ch in spell:
    for s in dic:
        print(dic, s, '에서', ch,'를 검사')
        if ch not in s:
            dic.remove(s)

print("최종 dic", dic)

아래와 같이 검사하는 대상이 순서대로 진행되지 않고 생략되는 것을 알 수 있다.

['0', '1', '2', '3', '4', '5', '6', '7'] 0 에서 1 
를 검사
['1', '2', '3', '4', '5', '6', '7'] 2 에서 1 를 검 사
['1', '3', '4', '5', '6', '7'] 4 에서 1 를 검사    
['1', '3', '5', '6', '7'] 6 에서 1 를 검사
['1', '3', '5', '7'] 1 에서 3 를 검사
['3', '5', '7'] 5 에서 3 를 검사
['3', '7'] 3 에서 5 를 검사
최종 dic ['7']