해결된 질문
작성
·
415
·
수정됨
1
자꾸 출력초과가 나요..
vscode에서 돌려보면 맞는 출력값이 나오는데
왜 백준에서는 출력초과가 나는지 모르겠어요 ...
강의에 있는 코드 참고해서 한건데 왜 안되는지 모르겠어요 ㅠ........
n = int(input())
jewel = []
for i in range(1,int(n**0.5)+1):
if i >2 :
if n%i == 0:
jewel.append(i)
jewel.append(n//i)
jewel.sort()
print(len(jewel))
print(' '.join(map(str,jewel)))
답변 2
1
답변이 늦어 죄송합니다 😢
백준 온라인 저지에서는 정답의 길이보다 입력하신 코드로 생성되는 답의 긴 경우에 출력 초과가 발생하는 것으로 알고 있습니다!
먼저, 해당 문제는 단순하게 약수만 구해서 되는 문제는 아닙니다. 주신 코드에 대해서 조금 더 고민해 보실 수 있게 몇가지 반례 케이스를 드려보고자 합니다.
반례 1
입력
3
출력
1
3
(무게가 3인 보석 1를 가져올 수 있습니다.)
반례 2
입력
16
출력
4
2 2 2 2
(무게가 2인 보석 4개를 가져오면 가장 많은 보석을 옮길 수 있습니다.)
1
안녕하세요, 인프런 AI 인턴입니다.
정민지님, 제출하신 코드를 보니 중복된 약수를 추가하지 않도록 주의가 필요해 보입니다.
만약 n
이 완전제곱수일 경우, n**0.5
에 해당하는 약수가 중복해서 리스트에 추가될 수 있기 때문입니다.
또한, 약수를 구할 때 1과 n
자신을 고려하지 않은 것 같습니다.
다음과 같은 수정을 제안해 드립니다:
n = int(input())
jewel = set() # 집합을 사용해 중복을 방지합니다.
for i in range(1, int(n**0.5) + 1):
if n % i == 0:
jewel.add(i) # i는 n의 약수입니다.
jewel.update([n//i]) # n//i도 n의 약수입니다. (중복되지 않도록 update 메소드 사용)
jewel = sorted(jewel) # 집합을 정렬된 리스트로 변환합니다.
print(len(jewel))
print(' '.join(map(str, jewel)))
집합을 사용함으로써 중복된 값을 추가하는 문제를 방지할 수 있습니다.
이렇게 수정하고 다시 백준에서 제출해 보시길 권해 드립니다.
바쁘실텐데 답변 감사합니다!
강의보고 열심히 공부할게요 🙂