23.08.10 sort & filter 함수 만들어보기 / 알고리즘 문제 - 영어가 싫어요

2023. 8. 11. 00:21IOS [ Swift ]

 

sort 라는 함수는 배열안의 문자나 숫자를 차례대로 오름&내림차순 정렬해주는 함수이다.

이 함수를 자체제작해서 만들어보려고 제작해보았다.


func sort(number:[Int]) -> [Int]{
    
    //    입력자가 입력하는값이 배열 [] < 안에  들어감.
    //    ex ) 입력값 1532 > [1,5,3,2]
    
    var answer:[Int] = [] 
    
    for i in 0...(number.count-1){
        
//        var numminus = (number.count-1)
        var iplus = i + 1
        
        if i > iplus{
            
            answer += [i]
            iplus + 1
            
            
            }else {
                iplus + 1
            }
    }
    
    return answer
}

 

여러가지로 머리를 굴려봤는데 , 이게 맞는지는 테스트 해보지못하였지만

우선 코드설명을 해보자면 , 

 

sort라는 객체명을 지정해주고 

number < 즉 사용자가 입력하는 값은 [Int] 배열의 형태로 입력받게 되며 , 출력시에도 같은 형태로 출력하게 한다.

 

그리고 우리는 오름 내림차순으로 숫자를 재 정렬 해야 하기때문에 

그 새로 정렬할 숫자를 다시 담아줄 그릇을 

 

var answer 로 만들어주었다. ( 빈 괄호로 빈그릇 생성 )

 

자 그럼 이제 for문을 돌려서 , i 값을 0... number.count-1 

 

즉 number 배열안에 있는 숫자의 최대치까지 돌려준다.

 

( index값은 0부터 시작이기때문에 배열안에 숫자가 4개가있다면 count는 4를 뱉지만

index자체는 0 1 2 3 이라 3이 최대기떄문에 -1 해주는것 )

 

그다음 ipuls 라는 객체를 생성해서 i+1로 지정해준다. 

이유는 i의 값이 i+1 즉 다음배열값 보다 크면 answer의 빈배열에 그 i값을 추가해주어야 하기때문.

( 여기서 의문이 예를들어 배열이 [ 1 , 5 , 3 , 2 ] 라고치면

i의 값이 1일때 i+1이 2가되는것인지 , 아니면 5가되는것인지가 의문이지만, 나의 의도로는 후자이다. )

 

자 그다음 그 i 값과 iplus(다음배열값) 을 비교해서 i의 값이 더 크면

 

answer의 빈배열에 i값을 추가함과 동시에 iplus(i+1)의 값에 +1을 더해주어서 ,

i+2를 만들어준다 ( 의도 = 다음배열도 찾아봐~ )

 

그러나 혹은 i 가 iplus 보다 작을 수 있기때문에 , 그런경우에도 else를 써줘서 계속 찾아보라고 iplus + 1을 해준다.

 

그러면 answer에 가장 큰 숫자 순서대로 쌓이게 되..는지는 모르겠지만 일단 여기까지 생각해보았다.

고작 몇줄안되는 코드지만 진짜 썼다지웠다 엄청많이 고민하고 생각했다.

 

 

다음은 filter 함수를 제작해보았다.

func filter(number:[String]) -> [Int]{
    
    var answer = Array<Int>()
    
    for i in number{
        var num = Int(i)
        if num != nil{
        answer.append(num!)
        }
    }
    return answer
    
}

 

이건 비교적 이해가 쉬운코드였는데 , 

우선 filter의 기능이 예를들어 배열안에 숫자와 문자가 섞여있는데 난 숫자만 꺼내고싶어 ! 

한다면 숫자만 필터링해줄 수 있는 코드이다.

 

그래서 만들어보자면 

 

우선 number라는 사용자의 입력값 배열 안에는 뭐든 들어가있는상태라고 쳐보자.

 

ex ) [ "1", "5", "2" , "안녕", "hey", "9" ]

 

그리고 우린 현재 숫자만 꺼내고 싶은상태.

그럼 1,5,2,9 만 꺼내야하는데 그러기위해서는

 

number안의 string 값을 다 int로 출력해버린다.

 

( 여기까지가 (number:[String]) -> [Int])

 

그렇게되면 현재 Int 값으로 출력이 불가능한 

안녕 , hey 문자열들은 nil값으로 추출되는데 ( optional )

 

우린 어차피 이 문자값을 추출해줄필요가없으니까 그걸 역이용해서

nil값으로 추출된 값들을 다 없애버리면 ! 숫자만남는것.

 

고로 for문으로 number 안을 돌면서 , i의 값을

answer에다가 num을 언래핑한 값으로 추가해버려라.

 

왜냐면 언래핑했을때 Int 값이 아니라면 어차피 추가가 안될것이기때문

( 이론 틀렸을 수 있음 . Optional 에 대한 개념 아직 완벽하지가않음 )

고로 저런 코드가 만들어진것이다.

 

( reduce 함수도 만들어보려고 했으나 머리안굴러감, 방식이 생각 잘 안남 )

 

다음은 오늘 못 푼 알고리즘 문제 영어가 싫어요이다.

 

⬆️영어가 싫어요 문제

 

⬆️영어가 싫어요 코드

 

결론부터 말하면 풀지못하였고, 

 

코드를 설명하자면 , 

 

일단 zero one two three 등등의 문자를 0 1 2 3 과 같이 숫자로 바꾸는것이다보니까 ,

 

index가 0부터 시작하는것을 빗대어 어떻게 구현하면 되지않을까? 라는 생각에서 시작된 코드.

 

enumerated 를 사용하면 index값과 value값 모두 활용할 수 있으리라고 장담하고 짜기시작했는데

 

아이디어가 잘 떠오르지않아서 정체되어있다. 다음에 더 고민해보는걸로..

 

 

( 쌓인알고리즘문제 너무많아서 주말에 추가공부를 해야될것같다..)