[프로그래머스][LV.1] 폰켓몬 | python3

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 함수를 구현한 것입니다.
만약 어떤 문제에서 특정 조건을 만족하는지 검사해야 하는데, 항상 "예, 맞습니다!"라고 대답하는 코드가 필요하다면 이런 식으로 만들 수 있습니다.
실제 문제 해결에서는 거의 쓰이지 않지만, 재미있는 트릭성 코드입니다. 😃