본문 바로가기

프로그래머스 코딩테스트 연습 Lv1

프로그래머스 코딩테스트 연습- 모든문제 Lv1 [소수 만들기]

[문제 설명]

배열 nums이 매개변수로 주어지고 nums에 있는 숫자들 중 서로 다른 3개의 수를 골라 더했을 때 소수가 되는 경우의 개수를 return.

[제한 사항]

- nums에 들어있는 숫자의 개수는 3이상 50이하

- 각 원소는 1이상 1000이하의 자연수. 중복숫자 없음.

[내 풀이]

뭐딱히 새로운게 필요하진 않을것 같음.

- 배열에 있는 원소의 개수를 하나씩 추출한 다음 다 더하는 방법이 제일 빨리 떠오름

 

잘 안된다. i j t 변수를 만들어 t 가 점점 증가하고 len(배열) 보다 1작으면 j를 증가시키고 t를 j 다음번으로 바꾸는 식으로 짯는데 잘 안짜짐.. 그래도 일단 해보기로 했습니다. 이것도 못하고 쩔쩔매는게 너무 짜증나서ㅠㅠㅠ

 

1. 세 가지 수를 뽑아 새로운 배열 만들기

첫번째 while문 까지 입니다.. 결과로 말하면 이 풀이는 틀렸다고 나오네요 ㅠㅠ.. 왜 그런지 모르겠습니다.

***중복 제거한 b=list(set(b)) 때문이였음.. 중복제거 하면 안됨. 조합의 경우가 다르면 결과가 같더라도 카운트 해줘야 하는 문제였음..... 한 3시간 왜안되지? 왜안되지? 한듯..

새로운 배열을 만드는걸 성공 했습니다. 이제 필요한건 배열의 중복을 제거 하는 것이라 생각했습니다. 배열 중복 제거하는 함수가 있던거 같아서 검색 해봤습니다. 집합으로 바꾸면 중복이 제거된 집합으로 바뀌고 이를 다시 리스트로 바꾸는 방법으로 결정!

2. 새로운 배열의 중복 제거

b = list(set(b))
print(b)

를 추가하면 됨.

 

3. 소수 확인 하는 방법

정말 단순하게 1부터 자기자신까지 나누기를 하는데 자기자신까지 왔을때 까지 나누어 떨어진수가 하나라도 있다면 그즉시 다음 수로 넘어가는 거로 만들기로..!

배열 C에 "소수가 아닌것들" 을 넣고 len(b)에서 len(c)를 했음.

이제 다른사람 풀이 공부하러 갑시다!

 

역시 intertools 로 푼게 대다수 네요 itertools를 공부해 봅시다. (지금은 늦었으니 내일..)

 

[itertools] -- 효율적인 루핑을 위헌 이터레이터를 만드는 함수

리스트로 뭔가 할때 여기에 포함된 함수들 쓰면 편할 경우가 많음. 내가 푼 문제는 '조합' 이니까 조합에 필요한 함수를 우선 공부 하기로 합시다.

combinations(리스트, 몇개로할지)

- 한 리스트에서 조합을 알아서 해줌. 반환은 n!/ r!/ (n-r)! 임. 그니까 조합을 구할때 필요한 거 다 반환 해준다는 뜻.

이걸 쓰면 앞의 1번 과정이 매우 간단 해질듯! 다시 해봅시다.

코드가 훨씬 간단해 진걸 볼 수 있다.

나머지는 나랑 비슷하거나 다른 방식이지만 비슷한 실행 파워 일거같아서 생략! 

수고했다 나.