티스토리 뷰
안녕하세요. iOS Developer, 멍구입니다!
오늘은 스위프트 언어로 백준 알고리즘 문제 중 한수 1065번 문제를 풀어보도록 하겠습니다.
백준 알고리즘, 한수 1065 문제 설명
백준 알고리즘 문제 중 하나인 한수 1065번 문제는 solved.ac 기준, 실버4의 티어를 갖고있는 문제입니다.
시간 제한은 2초, 약 2억번의 연산이 가능한 시간으로 알고 있습니다. 단계별 문제풀기에 있는 문제라 많은 사람들이 풀었던 문제네요.
문제의 요지는 이렇습니다. 숫자 N이 입력되었을때, 1 ~ N의 숫자 중 "한수"가 몇개인지 찾아라 입니다!
여기에서 "한수" 란 숫자의 각 자리수 차이가 모두 같은 수를 뜻합니다.
가령 한수의 예를 들자면, 한자리 수 인 1, 2, 3도 한수이며, 111, 135, 369 등도 한수가 될 수 있습니다. 각 자리의 차이가 동일하기 때문입니다.
입력받는 N은 1 ~ 1000의 값이 됩니다. 각각의 숫자를 돌면서 한수인지 체크하면 될 것 같습니다.
선형탐색으로 하나하나씩 숫자가 한수인지 체크하면 되고, 각 자리수의 길이는 상수이기때문에 복잡도 O(N)으로 문제를 풀 수 있을 것 같습니다.
이제 해당 백준 문제, 한수 1065번를 스위프트언어로 풀어보도록 하겠습니다.
백준 알고리즘, 한수 스위프트 문제 풀이
2 ~ 3행) 먼저 입력값, N을 받습니다. 입력받을때 readLine()을 사용하며, 반드시 어떠한 수가 입력되기때문에 강제언래핑(!)으로 처리합니다.
4 ~ 5행) 이후 1 ~ N 중 한수의 수를 카운팅하는 변수 cnt를 선언했습니다.
8행) 이제 1 ~ N까지 몇 개의 한수가 존재하는지를 순회하며 체크할 건데요. 이때 순회하는 방식은 본인맘입니다. 저는 Range 연산자에 forEach를 붙여서 순회를 해겠습니다.
11 ~ 12행) prev, now, diff는 각각 이전값, 현재 순회값, 차잇값을 표현합니다. Int.max로 값을 넣어둔 이유는 아직 해당 값이 사용된적없음을 표시하기 위함입니다.
만약 순회중에 break로 빠져나가야하는 상황이 있다면 forEach는 적절하지 않습니다. forEach는 순회도중에 반복문을 빠져나갈 수 없기 때문입니다. 하지만, 해당 문제는 전체 숫자를 확인해봐야하는 문제로 forEach를 써도 무방합니다.
해당 코드는 1 ~ N의 값을 순회하는 반복문 내의 while문입니다. 해당 while문은 현재 탐색중인 수의 각 자리 수를 통해 해당 수가 한수인지 체크할 겁니다.
17 ~ 18행) rem은 각 자리 수를 얻게 됩니다. 가령 123의 수가 한수인지 체크할 때에는 rem이 3 -> 2 -> 1이 됩니다.(각 순회 끝에서 num /= 10 처리를 하면서 끝의 자리수가 점점 잘려나가기 때문에 가능)
23 ~ 24행) 만약 prev값이 Int.max라면, 아직 이전값이 존재하지 않음을 의미하므로, 이후 차잇값 비교를 하기 위해 현재 자릿수를 저장하고 다음 자리수를 확인합니다.
23 ~ 28행) 만약 prev 값이 이미 존재했다면, 현재의 자릿수와 차잇값을 비교합니다. 그런데 만약 차잇값인 diff값이 존재하지 않는다면(아직 Int.max라면) , 아직 차잇값 비교가 불가능하지요. 그럴때는 현재의 차잇값(now - prev)만 diff에 저장하고 다음 자릿수를 봅니다.
29 ~ 34행) 만약 이전 차잇값(diff)가 존재한다면 이제 현재 차잇값(now - prev)과 비교해서 같은 차잇값을 갖는지 확인합니다. 만약 차잇값이 같다면 그대로 이어서 다음 자릿수를 탐색하지만 만약 차잇값이 다르다면, 해당 수는 한수가 아님을 의미하므로 isHansoo를 false로 설정하고, break문으로 내부의 while문을 빠져나갑니다.
앞서 while문을 통해서 현재 탐색 중인 수의 각 자리수 간 차이를 확인하면서 한수여부를 판단했습니다.
39 ~ 40행) 이때 한수 여부를 판단한수 flag변수는 isHansoo였지요. isHansoo가 true라면 현재 탐색했던 수는 한수라는 것입니다. 이때 cnt += 1로 카운팅합니다.
이렇게 forEach문에서 1 ~ N의 숫자를 탐색하고, while문에서 각 탐색하는 숫자의 각 자리수를 판단하는 모양새이네요.
44행) 이렇게 한수의 갯수를 카운팅한 값을 최종적으로 답으로 출력합니다.
지금까지 백준 알고리즘문제, 한수를 스위프트언어로 풀어보았습니다. 그 제출결과는 아래와 같습니다. 👨🏻💻
'알고리즘 정보 > Swift 알고리즘' 카테고리의 다른 글
코드챌린지 두개뽑아서더하기 완전탐색 swift 문제풀이 (0) | 2020.09.21 |
---|---|
백준 swift 알고리즘, 숫자의개수 2577 배열활용 풀이 (2) | 2020.09.16 |
프로그래머스 알고리즘, 기능개발 swift 배열큐 문제풀이 (0) | 2020.09.12 |
프로그래머스 swift 입문, 문자열 다루기 기본 문제풀이 (2) | 2020.09.11 |
프로그래머스 기초, 두 정수 사이의 합 swift reduce 문제풀이 (0) | 2020.09.09 |
- Total
- Today
- Yesterday
- swift 문자열
- SwiftUI
- 프로그래머스swift
- 프로그래머스
- 부스트코스
- publisher
- 프로토콜
- createML
- CoreML
- swift reduce
- 알고리즘
- uikit
- swift string
- swift알고리즘
- swift
- 컬렉션
- 자연어처리
- 백준알고리즘
- Swift 알고리즘
- 알고리즘문제
- ios
- Protocol
- swift문제
- Collection
- 김프매매
- swift 기초
- swift언어
- 스위프트
- 개발자문서
- 백준swift
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | |||||
3 | 4 | 5 | 6 | 7 | 8 | 9 |
10 | 11 | 12 | 13 | 14 | 15 | 16 |
17 | 18 | 19 | 20 | 21 | 22 | 23 |
24 | 25 | 26 | 27 | 28 | 29 | 30 |