Today I Learned

20211006 - 백준 swift - 함수

돌맹이시터 2021. 10. 6. 22:49

 

4673 셀프 넘버, 1065 한수

15596 정수N개의 합 같은 경우에는 언어제한이 있어서 도전해보지 못했다..

 

 

 


4673 셀프 넘버

 

 

// 4673 셀프 넘버
func generate (_ inputNum:Int) -> Int {
	var sum = inputNum
	var num = inputNum
	while num != 0 {
		sum += num % 10
		num /= 10
	}
	return sum
}
var result: Set<Int> = []
for i in 1...10000 {
	result.insert(generate(i))
}
for i in 1...10000 {
	if !result.contains(i) {
		print(i)
	}
}

 

함수 d를 정의하라고 했는데 그냥 generate 이름으로 만들어버렸음

특별히 추가로 사용한 방법은 없고 로직은 다음과 같다.

1부터 10000까지의 수를 이용해 문제에서 제시한 방법으로 수열을 만들면서 Set에 집어넣는다.

Set에 존재하지 않는 수는 어떠한 생성자로부터도 만들어지지 않는 경우이므로 셀프 넘버가 되며,

두번째 for 문을 통해 셀프넘버가 출력된다.

 

 


 

1065 한수

 

 

이 문제가 더 재미있었는데,

딱히 검색의 도움을 받지 않고 스스로 해결할 수 있어서 더 뿌듯함을 느꼈다(...)

처음에는 한수가 무엇인지를 알지 못했고,

1~9까지의 숫자도 한수에 포함된다는게 이해되지 않았지만 그냥 받아들이고 나니 편해졌다.

문제로 주어지는 자연수의 범위는 1~1000까지인데,

생각해보면 1~99까지는 모두 한수이다.

 

각각의 자릿수를 수열이라고 생각했을 때

한자리 수는 그 자체로 한수이며,

두자리 수는 수열간의 차이가 무조건 한개이기 때문에 한수가 된다.

 

따라서 문제를 풀면서 생각해야 하는 범위는 100부터 1000까지라는 것을 감안하여 코드를 작성했다.

 

 

// 1065 한수
let inputNum = Int(readLine()!)!
func generate (_ num:Int) -> Int {
	let n1 : Int = num / 100
	let n2 : Int = num / 10 - (n1 * 10)
	let n3 : Int = num % 10
	if n1 - n2 == n2 - n3 {
		return 1
	} else {
		return 0
	}
}
var count:Int = 0
for i in 1...inputNum {
	if i < 100 {
		count += 1
	} else {
		count += generate(i)
	}
}
print(count)

 

위에서 말한 것과 같이 1부터 99까지는 모두 한수이기 때문에 count를 하나씩 더해주고

그 이후의 숫자를 생각했을 때 1000은 무조건 한수가 될 수 없다. 수열이 1,0,0,0이기 때문에 등차수열이 아니다.

따라서 다루게 될 숫자는 100부터 999까지의 세자리 수밖에 없기 때문에

함수 내에서 각각의 자릿수를 한자리 수로 만들어주고 (n1, n2, n3)

등차수열인지를 확인해서 등차수열이 맞다면 1을 리턴, 등차수열이 아니라면 0을 리턴하여 count에 더해줬다.

 

 

'Today I Learned' 카테고리의 다른 글

백준 swift - 기본 수학1 (1~9단계)  (0) 2021.12.05
백준 swift - 문자열  (0) 2021.10.21
20210930 백준 swift - 1차원 배열  (0) 2021.09.30
20210831 백준 swift - while문  (0) 2021.09.01
20210830 백준 swift - for문 -2  (0) 2021.08.31