[백준 / Swift] 1065 - 한수

박준혁 - Niro·2023년 1월 5일
0

백준

목록 보기
1/16
post-thumbnail

🔗 문제 링크


https://www.acmicpc.net/problem/1065

💡 문제


어떤 양의 정수 X의 각 자리가 등차수열을 이룬다면, 그 수를 한수라고 한다. 등차수열은 연속된 두개의 수의 차이가 일정한 수열을 말한다.

N이 주어졌을 때, 1보다 크거나 같고, N보다 작거나 같은 한수의 개수를 출력하는 프로그램을 작성하시오.

⌨️ 입력


첫째 줄에 1,000보다 작거나 같은 자연수 N이 주어진다.

🖨️ 출력


첫째 줄에 1보다 크거나 같고, N보다 작거나 같은 한수의 개수를 출력한다.

✅ 풀이


한수가 무엇인지 이해하지 못해 문제를 파악하기까지 오랜 시간이 걸렸습니다.
처음엔 1부터 99까지의 수가 한수인지 정확한 해답을 말하기가 너무나 어려웠습니다. ㅠㅠㅠㅠ

문제에서는 각 자리의 수가 등차수열을 이룬다면 한수라고 한다는 것은 각 자리의 수의 차이가 일정하면 한수라고 했습니다.

수열이라면 적어도 2개의 수가 존재해야 수열이라 생각했지만 수 한개만 있어도 길이가 1인 수열이라고 볼 수 있다고 합니다.

예를 들자면 한자리 수는 비교할 대상이 없으므로 그 자체로 한수 이고, 두자리 수는 수의 차이가 1개 밖에 없으므로 한수 입니다.

따라서 입력 대상은 1000보다 작거나 같은 수 이므로 세자리 수인 100부터 999까지 범위 만 찾으면 되는 것 입니다. 1000은 한수가 아니기 때문에 미리 제외를 시켰습니다.

앞서 말한 것처럼 1부터 99까지의 수는 모두 한수이기 때문에 입력한 수의 크기가 한수의 개수이고 100이상의 수 부터는 각 자리로 나누어 각 차이를 계산하게 됩니다.

첫째 자리는 100을 나누어 몫 으로, 둘째 자리는 100을 나눈 나머지에 다시 10으로 나눈 몫 , 셋째 자리는 10으로 나눈 나머지 로 분류하였습니다.

이제 한수인지 판별을 해야하기 때문에 둘째 자리와 첫째 자리의 차이 , 셋째 자리와 둘째 자리의 차이 를 구하였고 같을 시 한수 이므로 count에 1씩 더해주었습니다.

🖥️ 소스 코드


let num = Int(readLine()!)! // 입력받은 수

var count = 0 // 한수의 개수

func cal (_ num: Int) -> Int { // 한수를 찾기 위한 함수
    
    for i in 100...num {
        let firstNum = i/100
        let secondNum = i % 100 / 10
        let thirdNum = i % 10
        
        if secondNum - firstNum == thirdNum - secondNum {
            count += 1
        }
    }
    
    count += 99
    
    return count
}

if num >= 100 {
    print(cal(num))
} else { 
    count += num
    print(count)
}
profile
📱iOS Developer, 🍎 Apple Developer Academy @ POSTECH 1st, 💻 DO SOPT 33th iOS Part

0개의 댓글