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
}
'IOS > Swift-Algorithm (Programmers)' 카테고리의 다른 글
[Swift] Programmers - 정수 제곱근 판별 (0) | 2024.02.21 |
---|---|
[Swift]Programmers - 문자열을 정수로 바꾸기 (0) | 2024.02.20 |
[Swift] Programmers - x만큼 간격이 있는 n개의 숫자 (0) | 2024.02.19 |
[Swift] Programmers - 나머지가 1이 되는 수 찾기 (0) | 2024.02.19 |
[Swift] Programmers - 약수의 합 (0) | 2024.02.19 |