https://app.codility.com/programmers/lessons/2-arrays/cyclic_rotation/

 

CyclicRotation coding task - Learn to Code - Codility

Rotate an array to the right by a given number of steps.

app.codility.com


요약

87점 → 100점.

N == 0인 경우를 체크하지 않았다. 이런 건 기본이기도 하고, 기본 테케에서 보여주지 않으니까 잘 챙기자.

검색한 것

  • 함수의 파라미터 변수에 inout:
    • copy-in-copy-out. 파라미터 변수를 변경할 수 있게 된다.
    • 원리는 변경이 필요할 때, 초기값을 복사해서 복사된 값을 변경한다. return할 때 복사된 값을 return한다.
    • 함수를 호출할 때는 add(&a: 3, b: 4) 이런 식으로 한다.
  • reverse(), reversed():
    • reverse() → void / O(N)
    • reversed() → ReversedCollection<Self> / O(1)

 

나의 풀이

// 배열의 길이가 101이므로 O(n)으로 가능하다.
// 역순으로 된 큐라고 생각하면 쉽다.
    // 6 7 9 8 3 뒤집기
    // 7 9 8 3 6 dequeue -> enqueue
    // 9 8 3 6 7 dequeue -> enqueue
    // 8 3 6 7 9 dequeue -> enqueue
    // 9 7 6 3 8 뒤집기

// 최적화를 위해서는 N을 K로 나눈 나머지 만큼만 움직이면 된다.

import Foundation
import Glibc

public func solution(_ A : inout [Int], _ K : Int) -> [Int] {
    if A.isEmpty {
        return []
    }

    let move = K % A.count
    
    A.reverse()
    for _ in 0..<move {
        let front = A.removeFirst()
        A.append(front)
    }
    A.reverse()

    return A
}

 

더 나은 풀이

public func solution(_ A : inout [Int], _ K : Int) -> [Int] {
    if A.count == K || K == 0 || A.count == 0 { return A }
    let rotation = K % A.count
    let range = 0...(A.count - 1 - rotation)
    let firstPick = A[range]
    A.removeSubrange(range)
    return A + firstPick
}

// https://muizidn.medium.com/codility-cylicrotation-swift-2008877b2a71

https://app.codility.com/programmers/lessons/1-iterations/binary_gap/

 

BinaryGap coding task - Learn to Code - Codility

Find longest sequence of zeros in binary representation of an integer.

app.codility.com


요약

여전히 컴퓨팅 사고가 부족하다고 느낀다.

나의 풀이는 전형적으로 문자열을 만들어서 하나씩 더듬어 가며 탐색하는 풀이. 심지어 틀렸다.

GPT는 이진수를 만들지 않고 나눗셈으로 찾아가는 풀이.

반성하자.

이진수, 3진수, 8진수, 16진수 <-> 10진수의 변환은 자연스럽게 가능해야 한다.

 

나의 풀이 (오답)

import Foundation
import Glibc

// N이 21억이면 2진수인 문자열로 바꿔서 O(n)하면 터지나 ?
// 정수형을 이진수 형태 문자열로 변환
// 투포인터를 활용하면 될 듯 (i, j)
// i로 문자열을 탐색하면서 1을 찾음
// 1을 만나면 j = i + 1. while 문으로 다음 1을 만날 때까지 0을 count
// 1을 만나면 count된 0의 개수가, 최대값인지 확인 후 최대값이면 갱신, i = j + 1에 할당, 그리고 break
// 문자열을 끝까지 탐색하면 종료

public func solution(_ N : Int) -> Int {
let binaryStr = String(N, radix: 2)
let binaryStrSize = binaryStr.count
let firstIdx = binaryStr.startIndex
var i = 0
var maxCnt = 0

while i < binaryStrSize {
    if binaryStr[binaryStr.index(firstIdx, offsetBy: i)] == "1" {
        var j = i + 1
        var cnt = 0
        while j < binaryStrSize && i < j{
            if binaryStr[binaryStr.index(firstIdx, offsetBy: j)] == "0" {
                cnt += 1
                j += 1
            } else {
                maxCnt = cnt > maxCnt ? cnt : maxCnt
                i = j + 1
                break
            }
        }
        // 이 부분을 추가해야 무한 반복을 막을 수 있다
        if j == binaryStrSize {
            i = j
        }
    } else {
        i += 1
    }
}

return maxCnt

 

더 나은 풀이

public func solution(_ N : Int) -> Int {
    var n = N
    var distance = -1
    var maxDistance = 0
    while n > 0 {
        if n % 2 == 1 {
            maxDistance = max(maxDistance, distance)
            distance = 0
        } else if distance != -1 {
            distance += 1
        }
        n /= 2
    }
    return maxDistance
}

주석

크게 single-line comments와 multi-line comments로 나뉜다.

전자는 함수 내부에서, 바로 다음에 오는 코드 라인을 설명한다.

후자는 함수 바깥인 위쪽에서, 함수에 대한 정보를 제공한다.

 

보통 다음과 같은 구조로 사용한다.

parameter, returns, throws 등 형식을 잘 지키면 주석이 알아서 하이라이트 해준다.

/**
 The myAdd function will takes two integers, add them together and return the sum
 
 - parameter first: The first integer to add
 - parameter second: The second integer to add
 - returns: The sum of the two integers
 - throws: Our error
 */

func myAdd(first: Int, second: Int) -> Int {
    // add the two integers together
    let sum: Int = first + second
    return sum
}

myAdd(first: 5, second: 10)

 

함수 부분을 option 키를 누른 채로 클릭하면, 다음과 같이 세부 내용을 확인할 수 있다.

 

세미콜론

문장 끝에 세미콜론을 붙이는 것은 선택사항이다.

그러나 붙이지 않는 것을 강력히 권장한다.

 

괄호 ()

함수의 조건절에 괄호를 붙이는 것은 선택사항이다.

일반적으로 조건이 하나이면 괄호를 사용하지 않고, 조건이 여러 개이면 각각 괄호를 사용하는 것을 권장한다. 보기 좋으니까.

let x = 1
let y = 2

// 조건이 1개
if x == 1 {
    print("x == 1")
}

// 조건이 여러 개
if (x == 1) && (y == 2) {
    print("x == 1 and y == 2")
}

 

중괄호 {}

Swift는 Conditional statement(if, while, switch, guard, ...)를 중괄호로 감싸야 한다.

// Swift
if x == 1 {
  print("x == 1")
}

// Python
if x == 1:
    print("x == 1")

 

안전 장치

조건절에서 변수에 대한 할당이 불가능하다.

시도하면 에러가 발생한다.

 

 

참고

<Mastering Swift 5.3>, Jon Hoffman, 6th Edition

Chapter 1: Taking the First Steps with Swift

탄생

Swift는 애플이 만든 프로그래밍 언어이다.

2014 WWDC에서 최초로 깜짝 발표했다.

애플 생태계 소프트웨어를 위한 언어로 탄생했다.

 

버전

현재 기준(24.01.11) Swift 5.9.2 버전까지 나왔다.

각 버전별 주요 업데이트는 다음과 같다.

Swift 2: 오픈 소스 프로젝트로 전환했다.

Swift 3: 플랫폼 간 호환이 가능케 했다. (예컨대 macOS에서 작성한 코드를 Linux에서 작동시킬 수 있다.)

Swift 5: ABI(Application Binary Interface)의 안정화가 이루어졌다. Swift 5 이후 컴파일러는 ABI를 공유하기 때문에, 어떤 버전에 대해서도 실행 가능하다.

Swift 5.1: LSP(Language Server Protocol)이 도입되었다. 다른 플랫폼의 IDE에서도 구문 하이라이트, 자동완성, 툴팁 등의 기능을 작동케 하는 도구이다.

 

특징

애플은 Swift를 처음 소개할 때 Objective-C without the C 라고 말했다.

그러나 반은 맞고, 반은 틀리다고 한다.

 

장점

- Swift는 Javascript, Python과 같은 스크립트 언어가 아니라, C와 같은 컴파일 언어이다. LLVM 컴파일러를 통해 기계어로 번역된다. 그만큼 빠르다.

- 컴파일 시간에 오류를 잡아내기 때문에, 런타임 오류가 줄고, 앱의 안정성이 높다.

- 동시에 스크립트 언어의 작성 편의성을 최대한 가져왔다.

- 코드 작성에 있어 안전 장치가 많다.

- 함수형, 객체 지향, 프로토콜 지향 프로그래밍이 모두 가능하다.

 

단점

- 오픈 소스 프로젝트이지만, 사용처는 애플 생태계 소프트웨어로 극히 제한된다.

- concurreny에 대한 기능이 부족하다. GCD(Grand Central Dispatch, aysnc/await 등의 도구가 있다.

- 안전 장치가 매우 많다. 학습의 초기라면 작성이 어렵다.

- 빠른 실행 시간과 작성 편의성을 얻은 대신, 컴파일 시간이 길다.

 

참고

<Mastering Swift 5.3>, Jon Hoffman, 6th Edition

Chapter 1: Taking The First Steps with Swift

1. 경제학 전공

밥 먹을 때 경제 뉴스를 탐독하는 것을 좋아합니다.

주식 투자에 5년째 관심이 많습니다. (3년 정도 열심히 했습니다.)

경제 유튜브를 2년간 운영했었습니다.

 

2. 소프트웨어 개발

iOS 신입 개발자로 취업을 준비하고 있습니다.

APPLE 디벨로퍼 아카데미 @POSTECH 2기 수료생입니다.

 

3. 요리

파스타에 능합니다.

생활 요리를 많이 해봤습니다. (커리, 겉절이, 애호박전 ...)

근사한 요리에 관심이 많습니다. (비프 웰링턴, 본 메로우, 브리스킷 ...)

 

4. 그 외

몸 쓰는 것을 좋아합니다. (배드민턴, 클라이밍, 러닝 ...)

음악 듣는 것을 좋아합니다. (팝, 인디, 재즈힙합 ...)

위키를 종종 탐험합니다.

맞춤법을 지키려고 노력합니다. 다만 띄어쓰기에는 너그럽습니다.

+ Recent posts