2023년 1월 1일
08:00 AM
Buffering ...

최근 글 👑

[Swift] Programmers - 자연수 뒤집어 배열로 만들기

2024. 2. 19. 20:21ㆍIOS/Swift-Algorithm (Programmers)
SMALL

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

 

프로그래머스

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

programmers.co.kr

* 자연수 뒤집어 배열로 만들기 *

 

자연수 n을 뒤집어 각 자리 숫자를 원소로 가지는 배열 형태로 리턴해주세요. 

예를들어 n이 12345이면 [5,4,3,2,1]을 리턴합니다.

 

* 제한사항 *

n은 10,000,000,000이하인 자연수입니다.

 

 

문제를 잘 살펴 봅시다.

자연수 n뒤집어 각 자리 숫자 원소로 가지는 배열 형태로 반환

자 이해하셨을까요?

 

문제를 살펴보기만 하면 어렵고 의미를 이해해야 답이 보이겠죠?

 

먼저 자연수 n이 의미하는 것은 무엇일까요?

자연수 n은 우리가 입력으로 받는 수자를 의미 하겠죠?!

 

뒤집는다는게 어떠한 의미 일까요?

자 앞서 자연수 n을 우리가 입력으로 받는 숫자를 거꾸로 뒤집는걸 의미하겠죠?!

예시로 1234를 입력 받으면 4321로 뒤집으라는 의미가 돼죠.

 

각 자리 숫자가 어떤 의미 일까요?

앞서 자연수 n을 입력으로 받은 각각의 숫자를 의미하겠죠?!

예시로 1234를 입력 받으면 각각의 숫자 1,2,3,4를 의미하겠죠.

 

그렇다면 원소는 무엇을 의미 하는 걸까요?!

원소는 생소한 단어일 수 있어요.

원소는 배열이나 리스트 등에서 하나의 값이나 항목을 의미합니다.

여기서의 원소는 각 자리숫자를 원소로 갖는 배열을 의미하겠죠?!

예를 들어, 1234를 뒤집어서 4321 그리고 각 자리숫자를 배열처리 하여 [4,3,2,1]과 같이

"각 자리 숫자를 원소로 갖는 배열을 만들어라" 라는 뜻이죠.

 

정리하자면,

"주어진 숫자를 뒤집고, 각 자리 숫자를 배열에 추가하는 로직을 구현하라" 라는 문제이죠

 

그러면 이제 문제를 해석 했으니까 로직을 구현 해야겠죠.

먼저 함수를 정의 해줍시다.

func solution(_ n: Int64) -> [Int] { //Int64 타입의 입력값 하나를 받고, [Int] 타입의 값을 반환합니다.

 

여기서 이해가 안되는 부분이 있을 수 있는 점은 Int64일 꺼에요.

여기서 Int64를 정의 해주는 이유는 우리가 제한사항이 있었죠?

"n은 10,000,000,000이하인 자연수" (10억이하) 라는 조건입니다.

그렇기 때문에 이 범위를 수용할 수 있는 데이터 타입이 필요한 것이고

int64는 -9,223,372,036,854,775,808부터 

9,223,372,036,854,775,807까지의 범위를 가지며, 

충분히 큰 자연수를 다룰 수 있습니다.

게다가

이렇게 값의 범위를 정의해 준다면 데이터 타입의 일치성도 높아지고

함수의 목적과 사용법을 더 쉽게 이해할 수 있도록 도와주겠죠?

 

정확성도 보장되니 데이터가 손실 되거나 부정확한 결과가 나오는 상황도 방지할 수 있습니다.

예를 들어, Int32나 Int 등의 작은 데이터 타입을 사용할 경우 큰 자연수가 손실될 가능성이 있겠죠.

 

함수를 정의했다면 입력 받아 할당할 변수를 만들어야해요.

    var num = n //입력값으로 받은 n을 변수 num에 할당

 

이후에 num 변수를 변경해도 원본 입력값 n에는 영향을 주지 않게되겠죠?

 

할당할 변수를 만들었다면 이제는 n을 뒤집은 결과를 저장할 공간을 생성해야 합니다.

    var result = [Int]() //빈 배열을 생성하여 결과를 저장할 result 변수를 초기화

 

이 배열에는 n을 뒤집은 결과가 저장될 것이고

다음으로는 우리가 입력된 자연수를 뒤집어야 하기 때문에 조건 반복문이 필요하죠

반복문의 시작으로 입력된 자연수 num이 0보다 큰 동안에는 반복문이 계속해서 실행되게 해줍시다.

    while num > 0 { //num이 0보다 큰 동안에는 반복문을 실행

이 조건은 num이 0이 되면 반복문이 종료가 됩니다.

 

다음으로 우리는 주어진 자연수의 각 자리 숫자를 추출 해야 하니까 

자연수를 몇으로 나누어야 할까요?

 

문제에서 "예를들어 n이 12345이면 [5,4,3,2,1]을 리턴합니다." 라고 명시 되었었죠?

물론 예시일 뿐이지만, 그럼 저는 이를 토대로 주어진 자연수를 10으로 나누어서 각 자리 숫자를 추출 해 봅시다.

        let digit = Int(num % 10) //현재 num의 가장 낮은 자리 숫자를 추출

num을 10으로 나눈 나머지를 구하여

가장 낮은 자리의 숫자를 얻고 이 값을 임의로 선정한 상수 digit(번역:숫자)에 저장합니다.

 

여기서! num을 10으로 나눈 값을 Int로 변환하는 이유는

나머지 연산의 결과가 Int64이므로,

이를 Int로 변환하여 배열에 추가하기 위해서 입니다.

 

그 다음으로 앞서 구한 가장 낮은 자리 숫자 상수 digit을 결과를 저장할 배열 "result"에 추가 해서

각 자리 숫자를 역순 배열에 추가 해주어야 하죠

 

이후, num을 10으로 나눈 몫을 다시 num에 할당해주어야 합니다.

    num /= 10 //현재 num에서 가장 낮은 자리 숫자를 제거
  }

이렇게 함으로써 가장 낮은 자리 숫자가 제거되고

다음 자리 숫자로 이동합니다.

  return result // result에 입력된 결과 도출
}

 

 

총 코드는 아래와 같아요.

func solution(_ n: Int64) -> [Int] {
    var num = n
    var result = [Int]()
    
    while num > 0 {
        let digit = Int(num % 10)
        result.append(digit)
        num /= 10
    }
    return result
}

 

728x90