파이썬 초보 질문. aa != bb != cc != dd 라고 하면 작동이 안되는 이유가 뭔가요?

조회수 533회
while True:
        aa=random.randint(1,10)
        bb=random.randint(1,10)
        cc=random.randint(1,10)
        dd=random.randint(1,10)

        if aa != bb != cc != dd:
            break

여기에서

if aa!=bb and bb!=cc and aa!=cc and aa!=dd and bb!=dd and cc!=dd: 라고 하면 작동이 되는데 if aa != bb != cc != dd: 라고 하면 작동이 안되는 이유가 뭔가요?

3 답변

  • 이유라고 한다면 파이썬에서 허용하지 않는 문법이기 때문입니다.

    아래와 같은 형태로 사용할 순 있습니다.

    if all([aa != bb, bb != cc, cc != dd]):
    
  • 약간의 보충 설명을 해 보자면,

    파이썬의 연산자와 연산자의 우선순위 같은 건 다 아시리라 믿겠습니다.

    마찬가지로 아시겠지만 !=은 비교 연산자 중 하나로, 두 값이 서로 다르다는 것을 의미합니다.

    aa != bb != cc != dd

    위에서는 동일한 비교 연산자를 세 개 사용했으니 우선순위는 모두 동일합니다. 그러면 결국

    ((aa != bb) != cc) != dd 와 같다고 할 수 있겠네요

    편의상 aa = 1, bb= 2라고 해 보겠습니다.

    그러면 aa != bbTrue가 되겠네요

    다시 말해 (True != cc) != dd 가 되는겁니다.

    cc는 숫자이니 boolean값과 != 연산자로 비교하면 무조건 True가 될 테고,

    True != dd도 마찬가지입니다.

    올려주신 예시로 보아 각각의 숫자가 모두 다른지를 확인하려고 하신 것 같은데,

    위의 식으로 돌리면 무조건 True가 나오기 때문에 의도했던 것과는 다른 결과가 나오게 되는겁니다.

  • 모든 쌍의 조합에 대해 비교연산을 해야 하는데, 이게 원소가 많으면 번거롭고, 빠뜨리게 됩니다.

    itertools.combinations 와 all 을 이용할 수도 있는데,

    set 으로 중복을 제거해서 갯수를 비교하면 빠뜨릴 염려는 없습니다.

    >>> s = [ 1,2,3,4,5 ]
    >>> len(s) == len(set(s))
    True
    >>> s = [ 1,2,3,4,1 ]
    >>> len(s) == len(set(s))
    False
    

답변을 하려면 로그인이 필요합니다.

프로그래머스 커뮤니티는 개발자들을 위한 Q&A 서비스입니다. 로그인해야 답변을 작성하실 수 있습니다.

(ಠ_ಠ)
(ಠ‿ಠ)