이 세계에선 내가 개발자?
[1427/Swift] 소트인사이드 본문
*** 언어는 Swift! ***
이번에는 1427번 소트인사이드 라는 문제이다.
이름에서 알 수 있듯이 소트 관련 알고리즘이라는 걸 알 수 있다. 자세한 내용은 이렇다.
으악! 정렬 알고리즘! 이라고 말할 정도로 정렬 알고리즘은 정말 흔한 알고리즘 중 하나다.
이번에는 딱히 하나 씩 문제를 알아볼 필요는 없지만 그래도 한 번 알아보자🐤
1. 첫째 줄에 정렬하려고 하는 수 N이 주어진다.
2. N을 내림차순으로 정렬해라
말 그대로 수를 입력받아 해당 수를 내림차순으로 정렬하는 것이다.😛
거두절미하고 바로 코드로 들어가보자
1. 정렬하려고 하는 수 N이 주어진다.
readLine으로 정렬하려고 하는 수 N을 입력받는다.
let number = readLine()
그리고 N에도 조건이 있는 것을 문제를 보면 알 수 있다. N은 1,000,000,000 보다 작은 수 여야 하기 때문에 이 조건을 위한 코드를 추가해준다.
guard let number = number,
let intNumber = Int(number)
else { return }
if intNumber > 1000000000 {
print("다시 입력해주세요.")
return
}
사실 여기서 마음에 들지 않았던 부분은 number를 언래핑 해주고 난 뒤 intNumber에 Int 형으로 바꿔준 뒤 조건문을 작성하는 것이었다.
intNumber는 조건문 외에 어떤 곳에서도 쓰이지 않았기 때문에 굳이 intNumber가 필요했을까 싶기도 하다.
일단 넘어가보자
2. 첫째 줄의 자리수를 내림차순으로 정렬한 수를 출력한다.
먼저 입력받은 숫자를 정렬하기 위해서는 각각의 숫자를 배열 안에 넣어줘야한다. 이 부분은 Swift 문법 중 하나인 map을 사용하여 쉽게 만들어줄 수 있다.
var numberArray = number.map { String($0) }
다음으로는 for문을 돌면서 이전 값과 다음 값의 차이를 구한 뒤, 다음 값이 더 크면 자리를 바꾸도록 해보자.
먼저 자리를 바꾸기 전에 현재 값을 저장해주기 위한 변수를 하나 만들어주고 본격적으로 코드를 짜보자.
var temp: String = ""
for i in 0..<numberArray.count {
for j in i..<numberArray.count {
if numberArray[i] < numberArray[j] {
temp = numberArray[i]
numberArray[i] = numberArray[j]
numberArray[j] = temp
}
}
}
이제 한 줄 한 줄 씩 살펴보도록 해보자
제일 바깥의 for문은 전체 배열의 대해서 for문을 돌리는 것이다.
그리고 그 안의 for문은 한 숫자 당 한 줄을 다 돌리기 위해서 작성해주었다.
예시로 2143 이라는 숫자가 있으면 i = 0, j = 0번째 부터 numberArray 갯수만큼 돌면서 numberArray의 i보다 큰 값이 있는지 찾게 된다.
만약 i 보다 큰 값이 j를 돌다가 나오게 되면 두 숫자의 자리를 바꿔주게 된다.
2 다음은 1이기 때문에 바꾸지 않고,
2 와 4를 비교했을 때 4가 더 크니 4(2번째 자리)와 2(첫번째 자리) 숫자를 바꿔주게 된다.
이런 식으로 numberArray의 끝까지 돌면 내림차순으로 숫자가 정렬되게 된다!
마지막으로 문제에서는 result가 배열이 모두 문자열로 합쳐져있는 결과물을 원했으니 배열을 하나로 합쳐준다.
print(numberArray.joined())
이렇게 하면 내림 차순 정렬이 완성된다!
'알록리즘 > BAEKLOG' 카테고리의 다른 글
[1457/Swift] 방 번호 (0) | 2023.04.28 |
---|---|
[11656/Swift] 접미사 배열 (0) | 2023.04.24 |
[9093/Swift] 단어 뒤집기 (0) | 2023.04.24 |
[1292/Swift] 쉽게 푸는 문제 (0) | 2023.04.18 |
[9086/Swift] 문자열 (1) | 2023.04.17 |