감자주먹밥

[프로그래머스] 가장 큰 수 (swift) 본문

알고리즘/프로그래머스

[프로그래머스] 가장 큰 수 (swift)

JustHm 2021. 12. 18. 19:36
728x90

문제

코딩테스트 연습 - 가장 큰 수

해결 과정

전혀 어떻게 풀어야 할 지 감이 안 잡혔다.

그냥 모든 경우의 수를 만들고 비교하자니 오래 걸릴 것 같았고, 그 외의 방법은 아무리 생각해도 떠오르지 않았다.

결국은 풀이과정을 검색해서 알아보았다.

  • 받은 수들을 3번 반복하여 저장하고 문자열로 비교 정렬한다.

이 방법을 사용해서 금방 만들어 보았다.

var DictInt: [Int:String] = Dictionary(uniqueKeysWithValues: case3.map({
    var temp: String = String($0)
    temp.append(temp+temp)
    return ($0, temp)
}))

var arr: [Int] = DictInt.sorted(by: {$0.value > $1.value}).map({$0.key})

print(arr.reduce("",{String($0)+String($1)}))

테스트 까지는 완벽했는데 제출만 하면 시간이 오래걸려 실패했다...

결국 답을 찾아보았더니 너무 허무했다.

let sortNum: [Int] = case1.sorted(by: { Int("\\($0)\\($1)")! > Int("\\($1)\\($0)")! })

print(sortNum)

if(sortNum[0] == 0){
    print("0")
}
else{
    print(sortNum.reduce("", {String($0) + String($1)}))
}

사실은 문제에 모두 힌트가 있었습니다!! 바로 문자열과 순서를 재배치하여 라는 말이었죠. 첫 번째 시행착오에서 저는 값을 비교할 수는 있었지만, 제한 사항에 나타난 것처럼 숫자를 키워서 계속 비교를 시도했기 때문에 출력 초과 오류가 발생했었습니다. 그래서 두 번째 방법은, 비교해서 정렬을 하되, "문자열로 합쳐 비교하여 재배치"를 진행하는 방법입니다.

  • 주어진 numbers 배열을 정렬한다. 정렬 방식은 다음과 같다.
  • 첫 번째 정수값($0)과 두 번째 정수값($1)을 String으로 변환시킨다음 두 String을 붙여 하나의 문자열을 만들어 낸다.
  • 첫 번째 정수값을 먼저 배치한 경우와 두 번째 정수값을 먼저 배치한 경우 중 Int로 변환했을 때 어느 값이 더 큰지 비교하여 정렬한다. 예를 들어 0과 9 값이 있다면 "09" 와 "90"을 만들어 Int 로 변환한 뒤 값을 비교한다. 9와 90 중 90이 더 크기 때문에 0이 9의 뒤로 정렬되게 된다.
  • 정렬된 배열의 첫 번째 값이 0인지 확인하여 0 일 경우 "0"을 출력한다.
  • 정렬한 첫 번째 값이 0이라는 것은 모든 배열의 값이 0 일 경우를 의미하게 된다. [0,0,0,0] 이 주어졌을 때 그대로 값을 붙여서 return 하면 "0"이 아니라 "0000" 이 출력되기 때문에 올바르지 않게 된다.
  • 정렬된 배열의 값을 하나씩 꺼내서 하나의 문자열로 합친(reduce) 결과값을 반환한다.

출처 - https://caution-dev.tistory.com/4

 

[알고리즘][Swift] #2. 가장 큰 수

안녕하세요! caution 입니다. '-' 알고리즘 문제 풀이 두 번째 시간입니다. 이번 문제도 카카오 프로그래머스에서 풀어보았습니다! 문제 선정 기준은 따로 없습니다!!!! 재밌을 것 같은 거, 그 중에

caution-dev.tistory.com

 

정렬을 할 때 숫자들을 연결시켜 비교하는 방법이였다.

길이도 짧고, 생각치도 못 했던 방법이다.

문제를 많이 풀고 계속 습득해서 이런 문제정도는 쉽게 풀 수 있게 해야겠다...

728x90
Comments