https://www.acmicpc.net/problem/2960
2960번: 에라토스테네스의 체
2, 4, 6, 8, 10, 3, 9, 5, 7 순서대로 지워진다. 7번째 지워진 수는 9이다.
www.acmicpc.net
안녕하세요~
백준 2960번 에라토스테네스의 체 >>>>>쉬운<<<<< 문제 풀이를 가지고 왔습니다!
먼저 예제 입력 1과 예제 출력 1를 가지고 문제를 이해해보도록 하겠습니다.
저는 그래서 이 문제를 보았을 때 2부터 주어진 N 값까지 있는 리스트를 만들어서
2의 배수를 없애고, 3의 배수 없애고... 그러면서 카운트에 1씩 더하면서
카운트 값과 K 값이 같아질 때 해당 수를 출력하면 되겠구나!
하는 생각을 하면서 문제에 접근을 했는데 잘 안되더라고요...
검색창에 해설을 검색해봐도 저에게는 너무 어려운 풀이들만 나와서 이해가 어려웠습니다ㅠㅠ
그래서 역발상을 하기로 했습니다.
(여기에 도달하기까지 몇 시간 걸렸다는건 안비밀...ㅠ,ㅠ)
리스트에서 제거하는 방식이 아니라,
직접 지워지는 수를 리스트에 채워나가면 어떨까?
이런 방식으로 푼 코드 입니다! 물론 정답이었습니다!
자세히 설명해보자면 이런 느낌입니다.
n, k = map(int,input().split()) #n과 k값을 받기
a = int(n/2) + 1 #두번째 for 문에서 최대 몇으로 할지 결정하기 위한 값
l = [] #리스트 생성
for p in range(2,n+1): #p의 값 조절! 가장 작은 숫자 2부터 시작
for i in range(1,a): #배수를 구하기 위한 부분
if p*i <= n: # n보다는 작을 때
l.append(p*i) # 리스트에 값 추가
#중복 제거용 예) 2의 배수 6이 3의 배수 6과 중복되는 현상 발생
new_list=[]
for num in l:
if num not in new_list:
new_list.append(num)
print(new_list[k-1])
▶ 2번째 줄 코드
어차피 p 값의 가장 작은 수는 2입니다. 2의 배수부터 지워나간다는 뜻입니다.
그러므로 N값을 2로 나눠서 몇 번 반복해야하는지를 계산하기 위한 것입니다.
+1 이 있는 이유는 N값이 홀수인 경우가 있기 때문입니다.
▶ 중복 제거?
중간의 중복 제거용이 필요한 이유는 위 표에서 표시한 숫자처럼 4, 6, 8 등 배수가 겹치는 현상이 발생했기 때문입니다.
사실 검색창에 검색해보시면 이런 풀이가 아닌 Boolean 형을 활용해 문제를 푸시던데..
전 잘 모르겠더라고요...
그래서 수학적으로(?) 접근하여 문제를 해결했습니다!
정말 이 문제 풀고 나서 얼마나 기뻤는지...큽 8ㅅ8
다른 분들께도 도움이 되셨기를 바랍니다!
'코딩(Coding) > 텍스트 코딩(Text Coding)' 카테고리의 다른 글
(파이썬)백준 2745번 : 진법 변환 (Python) 문제 자세한 풀이 (2가지) (0) | 2023.07.17 |
---|