문자열

인생노잼시기·2021년 5월 27일
0

😨코딩테스트

목록 보기
7/18

Foundation 프레임워크의 NSString이 bridge된 타입이기 때문에 NSString의 메소드를 String에서 캐스팅 없이 사용 가능합니다.

들여쓰기

아래 """의 위치에 의해 결정됩니다

값 타입 문자열

Swift의 String은 값 타입(value type)입니다. 그래서 String이 다른 함수 혹은 메소드로 부터 생성되면 String값이 할당 될때, 이전 String의 레퍼런스를 할당하는 것이 아니라 값을 복사해서 생성합니다. 반대로 이야기 하면 다른 메소드에서 할당 받은 문자열은 그 문자열을 수정해도 원본 문자열이 변하지 않기 때문에 편하게 사용하셔도 됩니다.

✂문자열 자르기

💥팁
NSString 활용하기

//String과 NSString은 서로 완전 호환되기 때문에 옵셔널이 아니라 그냥 as로 타입캐스팅
let contents = textView.text as NSString   
let length = (contents.length > 15) ? 15 : contents.length	//15자리까지 자르기
//substring(with: NSRange(location:length:))로 원하는 문자열의 길이만큼 자를 수 있다
contents.substring(with: NSRange(location: 0, length: length))   

문자열 타입에서 인덱스로 Int에 접근이 불가능하다
문자열 타입이 참조타입이 아니라 값타입이기 때문에
Index로 접근해야한다
다시 문자열로 변환하려면 String()을 사용해 변환해야 한다

[(String1), (String2)]으로 저장되어 있는데
배열의 첫번째 String1에 접근하려면 아래와 같이 접근해야 한다.
[arrName][0].0

var timeString:String = "[00:16:200"
var firstIndex = timeString.index(timeString.startIndex, offsetBy: 1)
String(timeString[firstIndex..<timeString.endIndex])  //00:16:200

Substring은 해당 문자열의 원본을 참조하게 됩니다.
더 이상 원본을 사용하지 않는다면 사용하지 않는 메모리를 절감하기 위해서
String()으로 인스턴스를 생성하는 것이 좋습니다.

let greeting = "Hello, World!"
let index = greeting.index(of: ",") ?? greeting.endIndex
let beginning = greeting[..<index]
// beginning : Hello

// SubString인 beginning을 String으로 변환
let newString = String(beginning)

그 외 메소드
hasPrefix(:), hasSuffix(:) 메소드




11654

11654 Character asciiValue UnicodeScalar
아스키코드로 변환하기

let x = readLine()!
let c = Character(x)
let ascii = c.asciiValue
print(ascii!)
import Foundation 
struct Q11654 { 
    static func main() {
        if let read = readLine() {
            if let ascii = UnicodeScalar.init(read)?.value { print(ascii) } 
        } 
    } 
} 
            
Q11654.main()

출처: https://oingbong.tistory.com/198

11720

11720 String을 for문으로 돌렸을 때를 기억하자
문자열에서 출력된 각각의 문자는 Character데이터 타입이라는 것이 주의하자
let hello: String = "it's me"

for i in hello {
    print(i)
}
//결과값
i
t
'
s
 
m
e
_ = readLine()

if let line = readLine() {
    var sum = 0
    for i in line {
        sum += Int(String(i))!
    }
    print(sum)
}

10809

10809

못풀겠다...
var hi = "hello"
hi.index(of:"h")
뭐 이게 안되고
hi.firstIndex(of:"h")로 바뀌었다는데...모르겠다...

2675

2675
QR Code "alphanumeric" 문자는 0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ\$%*+-./:이다.

import Foundation

var n = Int(readLine()!)!

for _ in 1 ... n {
    let stringArr = readLine()!.components(separatedBy: " ").map( {String($0)} )
    let r = Int(stringArr[0])!
    for char in stringArr[1] {
        for _ in 1 ... r {
            print(char, terminator: "")
        }
    }
    print()
}

오류
error: value of type 'String' has no member 'components'
components 메서드를 사용했는데
NSString 메서드여서 import Foundation이 필요했다...
아 맞다... split일 때 import Foundation이 필요없었지...


1157

1157
대문자 스트링값 리턴받기
string.uppercased()
딕셔너리 타입 활용하기

var dic = [String:Int]()
dic.keys
dic.updateValue()
dic.values.max()
if let str = readLine() {
    let upperStr = str.uppercased()
    var dic = [String:Int]()
    for char in upperStr {
        if dic.keys.contains(String(char)) {
            if let value = dic[String(char)] {
                dic.updateValue(value+1, forKey: String(char))
            }
        } else {
            dic.updateValue(1, forKey: String(char))
        }
    }
    
    var result = [String]()
    for key in dic.keys {
        if dic[key] == dic.values.max()! {
            result.append(key)
        }
    }
    
    print(result.count > 1 ? "?" : "\(result[0])")
}

1152

1152
split(separator: " ")는 빈 공간을 없애준다.
components(separatedBy: " ")는 그렇지 않고 Foundation을 import 해야한다.
입력받은 문자열의 처음과 끝에 공백이 있을 수 있어서 split을 사용했다.

let result = readLine()!.split(separator: " ").map{ String($0) }
print(result.count)

18312

18312
contains뒤에 찾을 문자열을 넣으면 될텐데...
Cannot convert value of type 'String' to expected argument type 'String.Element' (aka 'Character')
Int에서 Character으로 변경하는 건 안됐고...
String에서 Character으로 변경해서 넣어줬다...

let nk = readLine()!.split(separator: " ").map { String($0) }
let n = Int(nk[0])! //00시 00분 00초부터 N시 59분 59초까지
let k = nk[1]		//K 포함

var result = 0
for x in 0...n {
    for y in 0..<60 {
        for z in 0..<60 {
            let time = "\(x)\(y)\(z)"
            if time.contains(Character(k)) {
                result += 1
            }
        }
    }
}

print(result)
profile
인생노잼

0개의 댓글