연습장

6. 숫자 짝궁 본문

프로그래머스/1단계

6. 숫자 짝궁

js0616 2023. 12. 12. 00:00

문제 해석

 

 

X, Y  두 수가 있는데 

 

겹치는 숫자를 뽑아서 그걸로 가장 큰수를 만드는 문제라고 볼 수 있다. 

 

12321 -> 1, 2, 3, 2, 1

42531 -> 4, 2, 5, 3, 1

 

각각 1,2,3 이 겹치며 321 로 배치하면 가장 큰 수가된다.


풀이 방법 

 

1. 숫자를 분해

2. 겹치는 숫자를 추출

3. 크게 만들기 (역으로 정렬 , 내림차순으로 정렬)

 

라고 생각했는데

 

제한 사항을 보니 굉장히 긴 수가 나올 것으로 예상된다. 

만약 위의 로직대로 for 문을 이용하면 시간 초과가 날것으로 예상된다. 

 

-> 배열로 풀어야되나 

-> 딕셔너리로 만들어서 {'1' : a개, '2': b개 ... } 로 풀어야될까 

 

1. 각각을 딕셔너리로 만든다.

2. 각 key 에 따라 value 값이 겹치는 정도를 본다.

3. 큰 숫자가 되도록 만든다. 

 

라고 생각하고 진행하였는데 풀이는 조금 다르게 되었다. 

 


# dictionary 로 만드는 함수 -> 9부터 0 순으로 진행하여 큰 수가 먼저 나오도록 함.
def num_dict(N):
    my_dict = {'9':0,'8':0,'7':0,'6':0,'5':0,'4':0,'3':0,'2':0,'1':0,'0':0}

    for i in N:
        my_dict[i] += 1
    return my_dict

 

# 정답 제출용 함수 
def solution(X, Y):
    answer = ''
    ans_list = []
    X = num_dict(X)
    Y = num_dict(Y)
    
    for key in X:
        if X[key] > 0: # X 에 해당 숫자가 있는 경우
            for i in range(min(X[key], Y[key])): # 둘중에 작은 value 만큼 겹친다고 볼 수 있다.
                ans_list.append(key) #  반복문을 이용해서 위의 횟수만큼 공통 배열에 추가한다.
                
    # 짝궁이 없는 경우 -> 겹치는 숫자가 없는 경우
    if len(ans_list) == 0:
        ans_list.append('-1') # -> 빈배열에 '-1' 이 return 되도록 넣어준다.
        
    ## 0만 있는 경우 -> 9부터 0 까지  append 되도록 로직이 짜여져있다. 
    if ans_list[0] == '0': # 즉 ans_list 에 0 번째는 가장 큰 수가 오게되는데 이게 0 이라는 뜻은  0만 들어있다는 뜻  
        ans_list = ['0']  # 따라서 "00" 이 나오지 않도록 배열자체를 "0" 만 return 되도록 함.
    
    answer = ('').join(ans_list) # list 를 string 으로 바꾸어 정답을 제출 
        
    return answer

'프로그래머스 > 1단계' 카테고리의 다른 글

8. 문자열 나누기  (0) 2023.12.12
7. 체육복  (0) 2023.12.12
5. 로또의 최고 순위와 최저 순위  (0) 2023.12.11
4. 옹알이2  (0) 2023.12.11
3. 기사단원의 무기  (0) 2023.12.11