본문 바로가기
Problem Solving

[Swift] 프로그래머스 숫자 짝꿍(lv. 1)

by DuncanKim 2023. 2. 10.
728x90

[Swift] 프로그래머스 숫자 짝궁(lv. 1)

 

1. 문제

https://school.programmers.co.kr/learn/courses/30/lessons/131128

 

프로그래머스

코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.

programmers.co.kr

 

2. 접근

 

"두 수에서 공통된 숫자를 모아서 가장 큰 수를 만들어라"

요약하면 이렇게 된다.

 

그러면 0~9까지의 수만 하나씩 필터링 하면서 세면 되지 않을까?

그리고 나중에 이 숫자를 다시 내림차순으로 정렬해야 하는데, 그 개수를 index로 활용해서 세면 되지 않을까?

라는 생각이 들었다.

 

정렬의 방식 중 계수 정렬이 떠올랐고, 이를 활용해서 문제를 풀어보았다.

0 ~ 9까지 인덱스를 가지는 빈 배열을 가지고, X.filter 함수를 사용하여 각 숫자 별로 개수를 세주었다.

Y도 똑같은 방법으로 내부의 숫자를 세주었다.

 

그 다음, 그 계수를 활용하여 반복문을 통해 Character배열에 계수만큼 숫자를 append 해주었다.

반복문은 각 조건에 따라 분기하여 실행되게 해주었다.

크게 둘 중 하나가 0인 경우, 같지 않은 경우로 나누고, 같지 않은 경우에는 둘 중 누가 계수가 큰 지에 따라서 로직을 달리 해주었다. 

(둘 중 하나가 0이면, 공통된 숫자가 아니라는 뜻이기 때문에 패스)

 

그런 다음 String으로 배열을 return 해주면 끝.

 

 

3. 코드

import Foundation

func solution(_ X:String, _ Y:String) -> String {
    var innerX = [Int](repeating: 0, count: 10)
    for i in 0 ... innerX.count - 1 {
        var count = X.filter({ $0 == Character(String(i)) }).count
        innerX[i] = count
    }
    var innerY = [Int](repeating: 0, count: 10)
    for i in 0 ... innerY.count - 1 {
        var count = Y.filter({ $0 == Character(String(i)) }).count
        innerY[i] = count
    }
    
    var answer = [Character]()
    
    var j = 0
    for i in innerX {
        if i == 0 || innerY[j] == 0 {
            
        } else if i >= innerY[j] {
            for _ in 1 ... innerY[j] {
                answer.append(Character(String(j)))
            }
        } else {
            for _ in 1 ... i {
                answer.append(Character(String(j)))
            }
        }
        j += 1
    }
    return answer.count == 0 ? "-1" : answer.sorted(by: >)[0] == "0" ? "0" : String(answer.sorted(by: >))
}
728x90

댓글