개발하는 사막여우
개발하는 사막여우
개발하는 사막여우
전체 방문자
오늘
어제
  • All (310)
    • Books (13)
      • 읽기 좋은 코드가 좋은 코드다 (13)
    • Study (6)
      • Blockchain (3)
      • Algorithm (3)
    • Baekjoon (36)
    • Programmers (166)
    • LeetCode (15)
    • Open Source (1)
      • Youtube Popout Player (1)
    • Language (32)
      • Python (9)
      • JS (8)
      • Java (5)
      • HTML (6)
      • CSS (4)
    • Library & Framework (15)
      • React.js (15)
    • IDE (2)
      • IntelliJ (2)
    • Airdrop (9)
    • Tistory (2)
    • etc.. (12)
      • Cozubi (6)
      • lol-chess (0)

블로그 메뉴

  • Github

공지사항

인기 글

태그

  • 코인줍줍
  • Cozubi
  • 백준
  • 읽기 좋은 코드가 좋은 코드다
  • 파이썬
  • Java
  • 카카오 공채
  • 신규 코인 에어드랍
  • 프로그래머스
  • 카카오 코딩테스트
  • programmers
  • 2018 KAKAO BLIND RECRUITMENT
  • 카카오 알고리즘 문제
  • 코딩테스트연습
  • 코주비
  • 클린 코드 작성법
  • Python
  • 알고리즘문제풀이
  • 프로그래머스 위클리 챌린지
  • 클린 코드

최근 댓글

최근 글

티스토리

반응형
hELLO · Designed By 정상우.
개발하는 사막여우

개발하는 사막여우

[프로그래머스] 가장 큰 수 Python (level 2)
Programmers

[프로그래머스] 가장 큰 수 Python (level 2)

2020. 12. 27. 10:24
반응형

TITLE

문제주소 :programmers.co.kr/learn/courses/30/lessons/42746

 

 


<문제 설명>

문제 설명

0 또는 양의 정수가 주어졌을 때, 정수를 이어 붙여 만들 수 있는 가장 큰 수를 알아내 주세요.

예를 들어, 주어진 정수가 [6, 10, 2]라면 [6102, 6210, 1062, 1026, 2610, 2106]를 만들 수 있고, 이중 가장 큰 수는 6210입니다.

0 또는 양의 정수가 담긴 배열 numbers가 매개변수로 주어질 때, 순서를 재배치하여 만들 수 있는 가장 큰 수를 문자열로 바꾸어 return 하도록 solution 함수를 작성해주세요.

제한 사항

  • numbers의 길이는 1 이상 100,000 이하입니다.
  • numbers의 원소는 0 이상 1,000 이하입니다.
  • 정답이 너무 클 수 있으니 문자열로 바꾸어 return 합니다.

 

<풀이법>

▒ 한줄 개념: 원소들 순서 찾기(각 원소 * 3 )▒ 

원소들의 올바른 순서를 찾아서 이어붙여야하는 문제입니다.

그럼 이 ['순서'를 어떻게 찾을 것인가?]를 생각해보아야 합니다.

큰 숫자들이 앞에 위치하고 작은 숫자들이 뒤에 위치하면 될 것입니다.

가장 간단한 방법은 String 원소 * 3을 해서 길이를 늘려주고 정렬하는 것입니다. 왜 그런가?

 

3, 34, 32의 세 숫자를 가지고 순서를 논한다고 해봅시다.

나올 수 있는 순서의 경우는 다음과 같습니다. 

3-34-32, 3-32-34, 34-3-32, 34-32-3, 32-3-34, 32-34-3

가장 큰 수는 34-3-32 순서로 된 34332 일 것입니다.

여기서 중요한 것은 숫자 3은 혼자가 아니라는 것입니다.

34, 32 처럼 3뒤에 어떤 숫자가 붙게 되면 334 또는 332가 될 터이니, 3은 33과 동일하다 볼 수 있다는 것이죠.

따라서 3은 34보다는 뒤에, 32보다는 앞에 위치해야합니다. (34>3>32)

 

쉽게 풀어말하면 다음과 같습니다. 이 문제의 제한 조건에 numbers의 원소는 0~999이므로,

하나의 숫자당 최소 3이상의 길이를 갖도록 동일하게 늘려준다는 것 입니다.

위의 원리에 따라 3 = 333 인 것 처럼 말이죠.

 

파이썬의 자체적인 정렬알고리즘을 사용하면 앞의 숫자부터 차례로 비교하며 정렬해주니,

길이를 3 곱한 원소들(3, 34, 32의 경우 333, 343434, 323232)를 정렬하면 343434 - 333 - 323232 순서로 정렬이됩니다.

 

그럼 원소의 순서를 알게 되었으니, 이 순서대로 original 원소들을 뽑아서 합쳐준다면 원하는 정답을 얻을 수 있게 됩니다.

 

<코드(Python)>

def solution(numbers):
    answer = '' 
    numbers2 = [str(n)*3 for n in numbers] # 한줄 반복문을 통해 모든 원소들의 길이를 3 곱하여 새 배열 생성
    numbers3 = list(enumerate(numbers2)) # 각 원소에 enumerate 함수로 인덱스 붙여줌
    numbers3.sort(key = lambda x:x[1], reverse = True) # 원소들의 값에 따라 정렬
    for index, value in numbers3: # 정렬된 인덱스를 이용해 차례대로 answer 만들기
        answer += str(numbers[index])
        
    return str(int(answer)) # '0000' -> 0 같은 경우를 위하여 int로 한번 바꿔주고 다시 str으로!

 

 

더 많은 코드 보기(GitHub) : github.com/dwkim-97/CodingTest

 

 

반응형

'Programmers' 카테고리의 다른 글

[프로그래머스] 스킬트리 / Python  (0) 2020.12.29
[프로그래머스] 두 개 뽑아서 더하기 / Python  (0) 2020.12.29
[프로그래머스] 위장 Python (Level 2)  (0) 2020.12.24
[프로그래머스] 전화번호 목록 Python (Level 2)  (0) 2020.12.24
[프로그래머스] 완주하지 못한 선수 Python (Level 1)  (0) 2020.08.27
    'Programmers' 카테고리의 다른 글
    • [프로그래머스] 스킬트리 / Python
    • [프로그래머스] 두 개 뽑아서 더하기 / Python
    • [프로그래머스] 위장 Python (Level 2)
    • [프로그래머스] 전화번호 목록 Python (Level 2)
    개발하는 사막여우
    개발하는 사막여우
    개발개발 주저리주저리

    티스토리툴바