티스토리 뷰

반응형

 

 

 

오늘은 간단한 문자열 문제, 백준 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)

 

 

 

반응형
댓글
반응형
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
«   2024/05   »
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 31
글 보관함