• 카테고리

    질문 & 답변
  • 세부 분야

    프로그래밍 언어

  • 해결 여부

    미해결

38번,43번 질문입니다

19.11.07 17:39 작성 조회수 105

2

38번
for i in range(3):
    top = max(key)
    count += key.count(top)
    for j in range(key.count(top)): #key.count(top) 이걸 넣는 이유가 무엇인가요? 그냥 리스트 전체 순회해서 지우면 안되나요?
       key.remove(top)
43번
key = int(input())

b = []
while key:
    b.append(str(key % 2)) #int형은 append가 왜 여기서만 오류가 뜨는 거에요?
    key = int(key / 2)  #key는 이미 int인데 왜 int를 한번 더 해주는 건가요? 위에 줄에서 str로 바꿔줬기 때문이라면 int(key / 2)가 아니라 int(key) / 2 이렇게 해야 작동해야 하는거 아닌가요?
b.reverse()
print(int(''.join(b)))
궁금합니다!

답변 2

·

답변을 작성해보세요.

0

우선 아래와 같은 코드로 답지를 변경해놓았어요.(좀 더 보기 쉬운 코드라 생각됩니다.)

주석도 좀 더 쉽게 달았다고 생각이 되는데 또 문의사항이 있으시면 말씀해주세요.^^

질문에 감사드립니다.^^

b = []
while key:
    b.append(str(key % 2)) 
#int형은 append가 왜 여기서만 오류가 뜨는 거에요?
#-> int형으로 하였을 때 append에서 오류가 뜨진 않고,
#아래 join에서 오류가 뜹니다.
    key = int(key / 2)  
#key는 이미 int인데 왜 int를 한번 더 해주는 건가요?
#위에 줄에서 str로 바꿔줬기 때문이라면 int(key / 2)가 아니라 int(key) / 2
#이렇게 해야 작동해야 하는거 아닌가요?
#-> 슬러쉬가 1개(/)일때 반환형이 float형이어서 그렇습니다.
#-> //로 해도 좋을 것 같네요.^^
b.reverse()
print(int(''.join(b)))

0

안녕하세요 난뀨님! :)

먼저 38번 답변을 해드리자면, 맞습니다. 그렇게 하시는 편이 효율면에서도 좋아요.^^

(이해하기 쉽도록 설명한다고 그렇게 설명한 것인데 오히려 비효율적이고 이해하기 어려우셨을 수도 있었겠다는 생각을 했습니다.ㅜㅜ)

아래 예제를 들어드릴게요.

[1, 2, 3, 4, 5, 5, 5, 5, 5, 5, 6, 7, 8, 9, .... 10000000]

여기서 5라는 숫자만 다 지우고 싶으면 6번만 순회를 하면 되는데, 

리스트 전체를 순회할 경우 10000000를 순회해야 한다고 일반적으로 생각합니다.

그러나!

remove의 시간복잡도는 O(N)입니다.

따라서, 오히려 비효율적이에요.

난뀨님이 말씀해주신 것처럼 푸는 것이 옳습니다.^^