2025. 3. 5. 10:07ㆍ프로그래머스/LV.1
문제링크: 폰켓몬
문제설명
당신은 폰켓몬을 잡기 위한 오랜 여행 끝에, 홍 박사님의 연구실에 도착했습니다. 홍 박사님은 당신에게 자신의 연구실에 있는 총 N 마리의 폰켓몬 중에서 N/2마리를 가져가도 좋다고 했습니다.
홍 박사님 연구실의 폰켓몬은 종류에 따라 번호를 붙여 구분합니다. 따라서 같은 종류의 폰켓몬은 같은 번호를 가지고 있습니다. 예를 들어 연구실에 총 4마리의 폰켓몬이 있고, 각 폰켓몬의 종류 번호가 [3번, 1번, 2번, 3번]이라면 이는 3번 폰켓몬 두 마리, 1번 폰켓몬 한 마리, 2번 폰켓몬 한 마리가 있음을 나타냅니다. 이때, 4마리의 폰켓몬 중 2마리를 고르는 방법은 다음과 같이 6가지가 있습니다.
첫 번째(3번), 두 번째(1번) 폰켓몬을 선택
첫 번째(3번), 세 번째(2번) 폰켓몬을 선택
첫 번째(3번), 네 번째(3번) 폰켓몬을 선택
두 번째(1번), 세 번째(2번) 폰켓몬을 선택
두 번째(1번), 네 번째(3번) 폰켓몬을 선택
세 번째(2번), 네 번째(3번) 폰켓몬을 선택
이때, 첫 번째(3번) 폰켓몬과 네 번째(3번) 폰켓몬을 선택하는 방법은 한 종류(3번 폰켓몬 두 마리)의 폰켓몬만 가질 수 있지만, 다른 방법들은 모두 두 종류의 폰켓몬을 가질 수 있습니다. 따라서 위 예시에서 가질 수 있는 폰켓몬 종류 수의 최댓값은 2가 됩니다.
당신은 최대한 다양한 종류의 폰켓몬을 가지길 원하기 때문에, 최대한 많은 종류의 폰켓몬을 포함해서 N/2마리를 선택하려 합니다. N마리 폰켓몬의 종류 번호가 담긴 배열 nums가 매개변수로 주어질 때, N/2마리의 폰켓몬을 선택하는 방법 중, 가장 많은 종류의 폰켓몬을 선택하는 방법을 찾아, 그때의 폰켓몬 종류 번호의 개수를 return 하도록 solution 함수를 완성해주세요.
제한조건
- nums는 폰켓몬의 종류 번호가 담긴 1차원 배열입니다.
- nums의 길이(N)는 1 이상 10,000 이하의 자연수이며, 항상 짝수로 주어집니다.
- 폰켓몬의 종류 번호는 1 이상 200,000 이하의 자연수로 나타냅니다.
- 가장 많은 종류의 폰켓몬을 선택하는 방법이 여러 가지인 경우에도, 선택할 수 있는 폰켓몬 종류 개수의 최댓값 하나만 return 하면 됩니다.
문제풀이
예전풀이
def solution(nums):
answer = 1
pocket={}
for n in nums:
if n in pocket:
pocket[n]+=1
else:
pocket[n]=1
pocket=list(pocket.items())
if len(pocket)<=(len(nums)//2):
answer=len(pocket)
else:
answer=len(nums)//2
return answer
다시 푼 풀이는 디렉토리에 넣어서 중복제거 하는 과정을 set으로 생략시킨 것.
문제가 원한 풀이는 이쪽에 더 가까울 것 같다. 해시문제라고 했으니.
겹치지 않게 최대로 가질 수 있는 종류의 수를 구하는 것.중복제거한 후의 수를 구해서 가져갈 수 있는 갯수와 크기 비교를 하면 된다.
나의코드
def solution(nums):
n=len(nums)//2
chk=len(set(nums))
if chk>=n:
return n
else:
return chk
참고하기
def solution(ls):
return min(len(ls)/2, len(set(ls)))
더 간단하게 짠 버전.
class ALWAYS_CORRECT(object):
def __eq__(self,other):
return True
def solution(a):
answer = ALWAYS_CORRECT()
return answer;
문제하고 상관없이 푼 풀이 같은데..알아두면 좋을 것 같아서 가지고 옴
이 코드는 Python에서 ALWAYS_CORRECT라는 클래스를 정의하고, solution 함수가 이 클래스를 이용해 항상 True를 반환하는 객체를 반환하도록 구현되어 있습니다. 하나씩 분석해볼게요.
1. ALWAYS_CORRECT 클래스 정의
class ALWAYS_CORRECT(object):
- ALWAYS_CORRECT라는 클래스를 정의하고 있습니다.
- object를 상속받았지만, Python 3에서는 명시적으로 상속하지 않아도 기본적으로 object를 상속받습니다.
- 따라서 class ALWAYS_CORRECT:라고 작성해도 동일하게 동작합니다.
2. __eq__ 메서드 재정의
def __eq__(self, other):
return True
- __eq__는 Python에서 두 객체를 비교할 때 사용하는 특수 메서드입니다.
- 즉, a == b를 실행할 때 a.__eq__(b)가 호출됩니다.
- 이 메서드는 항상 True를 반환하도록 되어 있습니다.
- 즉, ALWAYS_CORRECT 객체는 어떤 값과 비교해도 True가 나옵니다.
예제:
x = ALWAYS_CORRECT()
print(x == 10) # True
print(x == "hello") # True
print(x == None) # True
어떤 값과 비교해도 True가 출력됩니다.
3. solution 함수 정의
def solution(a):
answer = ALWAYS_CORRECT()
return answer
- 함수 solution(a)는 인자로 a를 받지만, a를 전혀 사용하지 않습니다.
- 대신 ALWAYS_CORRECT 클래스의 객체를 하나 생성하고 answer 변수에 저장합니다.
- 마지막으로 answer를 반환합니다.
즉, 이 함수는 어떤 입력값이 들어와도 동일한 ALWAYS_CORRECT 객체를 반환합니다.
4. 동작 방식 예제
result = solution(42) # 아무 숫자나 넣어도 됨
print(result == 100) # True
print(result == "Python") # True
print(result == None) # True
이 코드의 출력 결과는 모두 True입니다.
이는 result가 ALWAYS_CORRECT의 인스턴스이며, __eq__ 메서드가 항상 True를 반환하기 때문입니다.
5. 정리
이 코드는 어떤 값과 비교하더라도 True가 나오는 객체를 반환하는 solution 함수를 구현한 것입니다.
만약 어떤 문제에서 특정 조건을 만족하는지 검사해야 하는데, 항상 "예, 맞습니다!"라고 대답하는 코드가 필요하다면 이런 식으로 만들 수 있습니다.
실제 문제 해결에서는 거의 쓰이지 않지만, 재미있는 트릭성 코드입니다. 😃
'프로그래머스 > LV.1' 카테고리의 다른 글
[프로그래머스][LV.1] 같은 숫자는 싫어 | python3 (0) | 2025.03.07 |
---|---|
[프로그래머스][LV.1] 완주하지 못한 선수 | python3 (0) | 2025.03.05 |
[프로그래머스][LV.1] 숫자 짝꿍 | python3 (0) | 2025.03.02 |
[프로그래머스][LV.1] 체육복 | python3 (0) | 2025.03.02 |
[프로그래머스][LV.1] [PCCE 기출문제] 9번 / 이웃한 칸 | python3 (0) | 2025.03.02 |