티스토리 뷰

PS/공부

알고리즘 문제풀이 팁(with Swift)

시르베어 2024. 4. 15. 00:57

문자열 만들기

String.reduce("", { (result, str) -> String in
	return result + (넘겨받은 str을 변경)
})
String.map({ str -> String in 
	return (넘겨받은 str을 변경)
}).joined()
String.reduce(""){
	$0 + (변경된 Str)
} //$1로 접근 가능
String.map{(변경된 Str)}.joined()

부분 배열 생성

let origin: [Int] = [1,2,3,4,5,6]
let sub: [Int] = Array(origin[0..2])

문자열 나누기 

String.components(separatedBy: "")
String.split(separator: "")
  • components, split 둘다 String을 잘라 배열에 담아주긴 하지만 둘의 반환값이 다르다
    components의 경우 [String]배열에 담을 수 있는 반면 split은 불가능 하다 split의 반환값이 [String.Subsequence]이기 때문

input 입력

Int(readLine()!)!
readLine()!
  • 알고리즘의 경우 입력이 항상 같은 형식으로 들어오기 때문에 강제추출이 가능하다

Array 배열

let arr: [Int] = [1,2,3,4,5,6]

arr.enumerated().map{
	print($0.offset, $0.element) // {(0,1), (1,2) ,,,}
}
arr.indices.map{ print($0) } // 0,1,2,3,4,5 -> index접근

 

짝 생성 - Sequence 프로토콜을 채택한 컬렉션 한쌍을 생성 

let arr1: [Int] = [1,2,3,4,5,6,7,8]
let arr2: [String] = ["one","two","three","four","five","six","seven"]
for z in zip(arr1,arr2){
    print(z)
}
  • arr1의 경우 0~7번의 인덱스를 가지고 arr2의 경우 0~6번의 인덱스를 가진다. 그럼 zip(arr1,arr2)는 둘중 낮은 인덱스를 따른다
    즉) z는 (1,"one") ~ (7,"seven") 까지만 값을 가진다

SubString - 부분 문자열

let arr: [String] = ["a","b","c","d","e","f"]
print(arr[1...5]) // ["b","c","d","e","f"]

let str = "abcdefg"
//print(str[2]) -> 오류 발생
let idx = str.index(str.startIndex, offsetBy: 2)
print(str[idx]) // "c"

let start = str.index(str.startIndex, offsetBy: 1)
let end = str.index(str.startIndex,offsetBy: 5)
//print(str[1...5]) -> 오류 발생
print(str[start...end]) // "bcdef"
  • 단순 배열의 경우는 arr[1...5] 처럼 범위로 접근이 가능하지만 String의 경우는 불가능하다
    print(str[2])과 같이 접근하려고 하면 'subscript(_:)' is unavailable: cannot subscript String with an Int, use a String.Index instead. 와 같은 경고를 띄운다 그렇기에 직접 접근이 아닌 변상수.index( , offsetBy: ) 메서드를 사용해서 접근해야한다

문자열 속 숫자 걸러내기

let str: String = "fdkoofmdo212352odos"
let numArr: [Int] = str.filter{ $0.isNumber }.map{ Int(String($0))! }
  • str.filter{ $0.isNumber } 까지만 실행할 경우 숫자만 담겨있는 String문자열이 반환된다

String을 배열로 변환하는 법

let str: String = "fdkoofmdo212352odos"
let chaArr: [Character] = Array(str)
let strArr: [String] = str.map{ String($0) }
let strSlice: ArraySlice<Character> = ArraySlice(str)
  • Array(str)의 경우 반환값이 [Character]이므로 String으로 사용 하려면 변환 후 사용해야한다

배열에서 원하는 값이 처음으로 나오는 인덱스 구하기

let arr: Int? = array.firstIndex(of: 원하는 값)
  • 찾는 값이 없을 수 있기 때문에 옵셔널로 반환된다

접미사 / 접두사

let str: String = "123456789"
print(str.prefix(3)) // 123
print(str.suffix(3)) // 789

특정 suffix를 가진 가장 긴 문자열 구하기

let str: String = "123456789"
let ran = str.range(of:"456",options: .backwards)
let sufstr = str.prefix(upTo: ran!.upperBound)
print(sufstr)
  • upTo에서 ran!.lowerBound가 될경우 "456"을 포함하지 않음
  • upTo : 가져올 범위

문자열 A의 순서를 바꿔 문자열 B를 만들 수 있는지 확인

let str1: String = "abcdefghijk"
let str2: String = "kjihgfedcba"
print(str1.sorted() == str2.sorted())

 

문자열이 특정 조건을 만족하는지

let str: String = "apple banana strawberry"
print(str.filter{String($0).allSatisfy{$0=="a" || $0=="b"}}) //abaaaab
  • 여러 조건을 만족하는지 확인하는 용도

튜플 비교 연산자 사용

let num1: (Int,Int) = (3,10)
let num2: (Int,Int) = (2,10)
let num3: (Int,Int) = (3,15)

print(num1 > num2) // true
print(num1 > num3) // false
  • 튜플의 비교는 (n1, n2) 중 n1을 먼저 비교 하고 두 수가 같은 경우에 n2를 비교한다

진수 변환(10진수 -> 2진수 / 2진수 -> 10진수)

let num10: Int = 8
let num2: String = String(num10, radix:2) // 10진수를 2진수로 변환
print(num2) // 1000

let num2: String = "1000"
let num10: Int = Int(num2, radix: 2)! // 2진수를 10진수로 변환
print(num10) // 8
  • 2진수 -> 10진수의 경우 String -> Int 이므로 이때 값은 옵셔널이 된다 ( 반대의 경우 Int는 String이 무조건 되므로 옵셔널이 아님 )

문자의 아스키 코드 값 구하기 

print(Character("A").asciiValue) // 65

특정 문자열 변경

let str1: String = "abcdefg"
let str2: String = str1.replacingOccurrences(of: "cde", with: "****")
print(str2)
  • of: 변경 전 내용 / with: 변경 후 내용

배열 범위를 통한 배열 변경

var arr: [Int] = [1,2,3,4,5,6,7,8,9]
arr.replaceSubrange(Range<Int>(0...3), with: [-1,-1,-1])
print(arr1) // [-1,-1,-1,5,6,7,8,9]
  • [0...3] 을 [-1,-1,-1]로 바꾸었기 때문에 배열 요소의 수가 하나줄음 

조합 알고리즘 관련 팁

  • nCn = 1, nC0 = 1, nC1 = n
  • nCr = nC(n-r)
  • nCr = (n-1)C(r-1) + (n-1)C(r)

기타 알고리즘 팁

  • 종이를 가위로 자를 때 가위를 몇번 써야하는가? = 가로길이 x 세로길이 -1
  • 최대 공약수 구하기 = 유클리드 호제법 사용

'PS > 공부' 카테고리의 다른 글

트리 기초 공부  (0) 2025.02.07
정렬 알고리즘  (0) 2025.02.04
기초 데이터 구조  (0) 2025.02.04
최소공배수(lcm), 최대공약수(gcd)  (0) 2024.05.01
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
«   2026/01   »
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
글 보관함