PS/BOJ&Programmers

[백준/5671] 호텔 방 번호 | 중복값 개수 세기(딕셔너리와 SET)

sebinChu 2024. 3. 17. 02:30

 

5671 호텔 방 번호

 

5671번: 호텔 방 번호

선영이는 집 호수에 반복되는 숫자가 있는 경우에는 그 집에 사는 사람에게 불운이 찾아온다고 믿는다. 따라서, 선영이는 838호나 1004호와 같이 한 숫자가 두 번 이상 들어있는 집에는 절대 살지

www.acmicpc.net

 

알고리즘

범위에 해당하는 숫자들이 자릿수마다의 중복되는지 체크하면 된다. 같은 값이 있는지 확인하는 방법으로는 딕셔너리를 떠올렸고 아래와 같이 중복 체크를 해주었다.

 

 for item in hotel:
            d={'0':0, '1':0, '2':0, '3':0, '4':0, '5':0, '6':0, '7':0, '8':0, '9':0}
            flag=True
            for s in str(item):
                if s in d.keys():
                    d[s] += 1
            
            for v in d.values():
                if v >= 2 :
                    flag=False
            
            if flag:
                ans.append(item)

 

 

문제를 다 풀고 다른 사람의 풀이를 보는데 중복 체크를 Set으로 간단하게 하는 경우를 봤다.

set 자료형을 배울 때 중복체크에 유용하다는 내용을 봤었는데, 관련 문제를 통 안풀다보니 완전히 까먹고 있었다..!

 

 for i in range(N, M+1):
            num = str(i)
            numList = list(num)
            numSet = set(numList)
            if len(numList) == len(numSet):
                count += 1

 

내 코드와 비교해서 굳이 딕셔너리나 정답 리스트를 선언하지 않고도 풀 수 있다. 훨씬 간결하고 효율도 좋다.

 

전체 코드

while True:
    try:
        n,m=input().split()
        hotel=list(range(int(n),int(m)+1))
        ans=[]
       
        for item in hotel:
            d={'0':0, '1':0, '2':0, '3':0, '4':0, '5':0, '6':0, '7':0, '8':0, '9':0}
            flag=True
            for s in str(item):
                if s in d.keys():
                    d[s] += 1
            
            for v in d.values():
                if v >= 2 :
                    flag=False
            
            if flag:
                ans.append(item)
        
        print(len(ans))
                
    except EOFError:
        break

 

 

알게된 점

  • SET은 중복 체크에 강하다!