티스토리 뷰
오늘은 간단한 문자열 문제, 백준 8595번 히든넘버 문제를 풀어보겠습니다. 해당문제의 url은 boj.kr/8595입니다. 문자열 길이 N, 문자열 S가 주어졌을때, 주어진 문자열에 있는 숫자들의 합을 구하는 문제입니다.
단어에 숨어있는 숫자를 찾아서 그 합을 구하는 문제입니다. 각각의 히든넘버 사이에는 글자가 적어도 하나 있습니다. 또한 히든넘버는 6자리를 넘지 않도록 입력됩니다.
입력받는 단어의 길이는 최대 500만입니다. 위 예시를 보면, 주어진 문자열에 있는 히든넘버 합은 13 + 9 + 7 = 29가 됩니다.
swift언어로 풀어보도록 하겠습니다.
1 ~ 2행) 저는 첫줄로 입력받는 문자열 길이값을 사용하지 않아서 _ 언더바로 입력값을 받았습니다. 이어서 입력받은 문자열 + "x" 의 문자열에 대해서 reduce연산으로 히든넘버의 합을 구해줍니다. 각각의 히든넘버를 구분하는 방법은 탐색중인 문자가 숫자가 아닐 경우입니다. 맨 마지막에는 반드시 문자가 되어야 마지막문자로 히든넘버가 있는 경우까지 완벽하게 히든넘버 합을 구할 수 있어서 임의로 입력된 문자열 끝에 "x"를 붙여줍니다. reduce연산으로 축적되는 값은 튜플타입인데, 튜플값에는 각각 (히든넘버의 총합, 임시 히든넘버 연산에 사용될 값) 이 들어갑니다.
3 ~4행) swift에서 특정문자가 숫자값을 가진 Character인지 확인하려면, isNumber를 사용할 수 있고, asciiValue 프로퍼티를 통해 해당 문자의 아스키코드 값을 구할 수 있습니다. 4행에서는 숫자문자의 실제 숫자값을 얻기 위해 Int(char.asciiValue!) - 48 연산을 수행했습니다. 숫자를 탐색중일때마다, 현재 히든넘버의 갑을 tuple.1에 기록합니다. 만약 연속으로 숫자가 나올경우, tuple.1의 자릿수가 한자리 커지고, 1의자리수에 새로운 숫자가 더해지는 방식으로 연산됩니다.
6 ~ 7행) 탐색중에 숫자가 아닌 문자가 나오면, tuple.1의 값을 tuple.0에 더해줍니다. tuple.0에는 최종적으로 모든 히든넘버의 합이 들어가게 됩니다. 그리고 이미 더한 tuple.1은 이미 계산된 히든넘버로 0으로 초기화하여 다음 히든넘버를 기록할 준비를 해줍니다.
위 전체 swift언어 작성코드는 다음과 같습니다. ▼
let _ = readLine()
print((readLine()! + "x").reduce(into: (0, 0)) { (tuple, char) in
if char.isNumber {
tuple.1 = tuple.1 * 10 + Int(char.asciiValue!) - 48
} else {
tuple.0 += tuple.1
tuple.1 = 0
}
}.0)
'알고리즘 정보 > Swift 알고리즘' 카테고리의 다른 글
백준 1043 거짓말, 유니온파인드 swift언어 문제풀이 (0) | 2021.09.22 |
---|---|
코딜리티 Codility easy문제, permCheck swift 풀이 (0) | 2021.08.04 |
카카오인턴십 BFS문제, 거리두기 확인하기 swift풀이 (0) | 2021.07.26 |
프로그래머스 구현문제, 행렬테두리회전하기 swift 풀이 (0) | 2021.07.25 |
카카오 인턴 기출문제, 숫자 문자열과 영단어 swift 풀이 (0) | 2021.07.18 |
- Total
- Today
- Yesterday
- 김프매매
- swift string
- SwiftUI
- swift
- Swift 알고리즘
- 부스트코스
- 컬렉션
- createML
- swift언어
- swift 문자열
- Collection
- 개발자문서
- uikit
- Protocol
- 스위프트
- 백준알고리즘
- publisher
- 프로그래머스
- swift reduce
- swift알고리즘
- swift 기초
- 프로토콜
- 백준swift
- 자연어처리
- 알고리즘
- CoreML
- 프로그래머스swift
- ios
- 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 |