TIL(230221)

Youth·2023년 2월 21일
0

1. split과 components의 차이

알고리즘 공부를 하는데 readLine()으로 input을 받아오는데 보통 이런경우 각각의 요소들을 사용하기때문에 인풋을 쪼개줄 필요가 있다. 예를들어 "1 2 3 4"라는 인풋을 [1, 2, 3, 4]로 변환을 해야된다는 뜻이다. 그래서 보통 " "빈칸을 기준으로 요소를 쪼갠다

"1 2 3 4".split(separator: " ")

이렇게 spilt이라는 매서드를 사용해서 쪼개거나

input.components(separatedBy: " ")

이렇게 components라는 매서드를 사용해서 쪼갠다

원래는 split을 사용했었는데 구글링을 하다보니 components를 사용하는 분들도 많길래 이 기회에 한번 차이점을 적어보려고 한다.

1.우선 split은 import를 하지 않아도 되지만 components는 import Foundation을 해줘야한다
2.split의 리턴값은 [subString]이지만 components는 [String]이다
3.split이 components보다 빠르다고 한다
4.components는 seperatedBy에 문자열이나 배열로 여러개의 문자열을 넣을 수 있다
5.split은 seperatedBy에 charactor하나밖에 못넣는다
6.split은 리턴이 subString인데 Int로 바꾸고 싶으면 subString을 바로 Int로 바꾸는거보다 String을 거쳐서 Int로 바꾸는게 더 빠르다

import Foundation
var str = "안녕하세요==split과==components에대해==알아보아요"
var str2 = "1+2*3-4"

가능
str.components(separatedBy: "==")
str.components(seperatedBy: ["+","*","-"])

불가능
str.split(separator: "==")
str.split(seperatedBy: ["+","*","-"])

왠만하면 split을 쓰는게 나을거같다 하지만 요소간에 쪼갤 기준이 많으면 components를 사용하면될듯

2. for문 반대로 도는 방법

이건 알고리즘을 풀다가 알고있다가 맨날 까먹어서 쓰는 메모라고 생각하면된다
우선 배열을 반대로 돌리는방법은 .reverse()나 .reversed()를 사용하면된다
그런데 .reverse()는 기존의 배열 자체를 바꾼다(O(n))하지만 .reversed()는 새로운 배열을 리턴한다(O(1))
그래서 왠만하면 .reversed()를 사용하는게 빠르다

import Foundation

var input = [1, 2, 3, 4]

for i in input.reversed() {
    print(i)
}
결과 : 4 3 2 1

print(input)
결과 : [1, 2, 3, 4]

그리고 이런 배열의 요소를 반대로 돌리는거말고도 이런게 있다 input을 5로 주면 for문에서 12345이렇게 돌지 않고 54321이렇게 돌아야하는 경우가 있다 이럴때는 stride를 사용하면된다

stride(from: "시작숫자", to: "끝숫자(미포함)", by: "몇칸씩띄울래(-1은 작아지게")
stride(from: "시작숫자", through: "끝숫자(포함)", by: "몇칸씩띄울래")

3. 별찍기(백준)

브론즈 4문제는 건너뛰고 브론즈3문제만 기록

[Bronze III] 별 찍기 - 5 - 2442

문제 링크

성능 요약

메모리: 79508 KB, 시간: 12 ms

분류

구현(implementation)

문제 설명

첫째 줄에는 별 1개, 둘째 줄에는 별 3개, ..., N번째 줄에는 별 2×N-1개를 찍는 문제

별은 가운데를 기준으로 대칭이어야 한다.

입력

첫째 줄에 N(1 ≤ N ≤ 100)이 주어진다.

출력

첫째 줄부터 N번째 줄까지 차례대로 별을 출력한다.

제출한답

import Foundation

let input = Int(readLine()!)!

for i in 1...input {
    let maxNum: Int = 2*input-1
    let starNum: Int = 2*i-1
    let emptyNum: Int = maxNum-starNum
    print(String(repeating: " ", count: emptyNum / 2)+String(repeating: "*", count: starNum))
}

[Bronze III] 별 찍기 - 8 - 2445

문제 링크

성능 요약

메모리: 79508 KB, 시간: 16 ms

분류

구현(implementation)

문제 설명

예제를 보고 규칙을 유추한 뒤에 별을 찍어 보세요.

입력

첫째 줄에 N(1 ≤ N ≤ 100)이 주어진다.

출력

첫째 줄부터 2×N-1번째 줄까지 차례대로 별을 출력한다.

제출한답

import Foundation

let input = Int(readLine()!)!
let maxCell = input*2

for i in 1...input {
    printStar(star: i)
}

for i in stride(from: input-1, through: 1, by: -1) {
    printStar(star: i)
}

func printStar(star: Int) {
    print(String(repeating: "*", count: star)+String(repeating: " ", count: maxCell-2*star)+String(repeating: "*", count: star))

[Bronze III] 별 찍기 - 9 - 2446

문제 링크

성능 요약

메모리: 79508 KB, 시간: 12 ms

분류

구현(implementation)

문제 설명

예제를 보고 규칙을 유추한 뒤에 별을 찍어 보세요.

입력

첫째 줄에 N(1 ≤ N ≤ 100)이 주어진다.

출력

첫째 줄부터 2×N-1번째 줄까지 차례대로 별을 출력한다.

제출한답

import Foundation

let input = Int(readLine()!)!
let maxCell = input*2-1


for i in stride(from: input, to: 1, by: -1) {
    let starCell = 2*i-1
    let emptyCell = maxCell - starCell
    print(String(repeating: " ", count: (emptyCell) / 2)+String(repeating: "*", count: starCell))
}

for i in 1...input {
    let starCell = 2*i-1
    let emptyCell = maxCell - starCell
    print(String(repeating: " ", count: (emptyCell) / 2)+String(repeating: "*", count: starCell))
}

[Bronze III] 별 찍기 - 12 - 2522

문제 링크

성능 요약

메모리: 79508 KB, 시간: 12 ms

분류

구현(implementation)

문제 설명

예제를 보고 규칙을 유추한 뒤에 별을 찍어 보세요.

입력

첫째 줄에 N(1 ≤ N ≤ 100)이 주어진다.

출력

첫째 줄부터 2×N-1번째 줄까지 차례대로 별을 출력한다.

제출한답

import Foundation

let input = Int(readLine()!)!

for i in 1...input {
    printStar(star: i)
}

for i in stride(from: input-1, through: 1, by: -1) {
    printStar(star: i)
}

func printStar(star: Int) {
    print(String(repeating: " ", count: input-star)+String(repeating: "*", count: star))

[Bronze III] 별 찍기 - 16 - 10991

문제 링크

성능 요약

메모리: 79508 KB, 시간: 12 ms

분류

구현(implementation)

문제 설명

예제를 보고 규칙을 유추한 뒤에 별을 찍어 보세요.

입력

첫째 줄에 N(1 ≤ N ≤ 100)이 주어진다.

출력

첫째 줄부터 N번째 줄까지 차례대로 별을 출력한다.

제출한답

import Foundation

let input = Int(readLine()!)!


for i in 1...input {
    let result = String(repeating: " ", count: input-i)+String(repeating: "* ", count: i)
    print(result)
}

[Bronze III] 별 찍기 - 17 - 10992

문제 링크

성능 요약

메모리: 79508 KB, 시간: 12 ms

분류

구현(implementation)

문제 설명

예제를 보고 규칙을 유추한 뒤에 별을 찍어 보세요.

입력

첫째 줄에 N(1 ≤ N ≤ 100)이 주어진다.

출력

첫째 줄부터 N번째 줄까지 차례대로 별을 출력한다.

제출한답

import Foundation

let input = Int(readLine()!)!


for i in 1...input {
    if i == 1 {
        print(String(repeating: " ", count: input-i)+String("*"))
    } else if i == input {
        print(String(repeating: "*", count: 2*input-1))
    } else {
        print(String(repeating: " ", count: input-i)+String("*")+String(repeating: " ", count: (i-1)*2-1)+String("*"))
    }
}
profile
AppleDeveloperAcademy@POSTECH 1기 수료, SOPT 32기 iOS파트 수료

0개의 댓글