Olive Study Room
[백준 알고리즘] #4673번 : 셀프넘버, set.remove 본문
갈수록.. 문제를 이해하는 시간이 오래걸린다... (단계별 풀이니까 당연함..)
해결 방법
암튼 숫자를 1(생성자)부터 넣어서 돌리고 나온 숫자를 모으면 셀프넘버가 아닌 수가 모이고,
1부터 10000을 갖는 배열에서 앞에서 모은 것을 빼면 된다.
하지만 모으지 않고 바로 이 수를 1부터 10000배열에서 remove 해주면 셀프넘버만 담긴 배열로 바꿀 수 있다.
(전체에서 셀프넘버가 아닌 수를 뺀다는 이야기)
필요한 지식
1. 특정 값을 remove를 하려면 배열의 index값이 있어야 하는데,
index값을 받아올 필요 없이 특정 값 요소를 없애려면
배열(array)가 아닌 Set으로 만들어주면 된다.
* Set은 append가 아닌 말 그대로 insert기 때문에 중복을 제외해주고(여기서는 remove하기 때문에 필요는 없음) 순서가 없다. 따라서 마지막에 sort() 해주어야한다.
-> array.remove(index: Int)
-> set.remove(member)
2. for문에서 index로 사용하는 수는 'let'타입이기 때문에 변환하여 사용하려면 받아오는 변수가 필요하다.
헷갈렸던 부분
생성자를 1부터 10000까지 넣어서 함수를 돌리면 결과가 10000을 넘는 경우도 있다. (ex. 9999의 경우 : 9+9+9+9+9999 = 10035)
1부터 10000까지 담긴 배열에서 10035 요소를 뺀다면 에러가 나지 않을까 했는데 나지 않는다.
-> set.remove(member)는 set에 해당 멤버가 없어도 오류가 나지 않는다.
코드
var arr2: Set<Int> = []
for i in 1...10000 {
arr2.insert(i)
}
func d() {
for index in 1...10000 {
var result: Int = 0
var num: [Int] = []
var i = index
result += i
while i != 0 {
num.append(i%10)
i /= 10
}
result += num.reduce(0, {$0+$1})
arr2.remove(result)
}
}
d()
var arr = arr2.sorted()
arr.forEach({
print($0)
})
함수 앞, 뒤 코드를 함수 내에 넣어서 되지만 함수 내에는 result(=sum)를 구하는 코드만 넣고 싶었기에...
(arr2.remove 부분은 바로 빼려면 어쩔 수 없었음..)
'cs > 알고리즘' 카테고리의 다른 글
[백준 알고리즘] 7. 문자열 (0) | 2021.06.27 |
---|---|
[백준 알고리즘] 6. 함수 (0) | 2021.06.26 |
[백준 알고리즘] #8958번 : 가우스 함수, compactMap, reduce (0) | 2021.06.23 |
[백준 알고리즘] 5. 1차원 배열 (0) | 2021.06.20 |
[백준 알고리즘] #2577번 : 정수가 포함하는 숫자 개수 출력 / forEach (0) | 2021.06.19 |