Array

-Array는 멤버가 순서(인덱스)를 가진 리스트 형태의 컬렉션 타입입니다.

// 빈 Int Array 생성
var integers: Array<Int> = Array<Int>()

// 같은 표현
// var integers: Array<Int> = [Int]()
// var integers: Array<Int> = []
// var integers: [Int] = Array<Int>()
// var integers: [Int] = [Int]()
// var integers: [Int] = []
// var integers = [Int]()
Array 활용

integers.append(1)
integers.append(100)

// Int 타입이 아니므로 Array에 추가할 수 없습니다
//integers.append(101.1)

print(integers)	// [1, 100]

// 멤버 포함 여부 확인
print(integers.contains(100)) // true
print(integers.contains(99)) // false

// 멤버 교체
integers[0] = 99

// 멤버 삭제
integers.remove(at: 0)
integers.removeLast()
integers.removeAll()

// 멤버 수 확인
print(integers.count)

// 인덱스를 벗어나 접근하려면 익셉션 런타임 오류발생
//integers[0]

let을 이용하여 Array를 선언하면 불변 Array가 됩니다.

let immutableArray = [1, 2, 3]

// 수정이 불가능한 Array이므로 멤버를 추가하거나 삭제할 수 없습니다
//immutableArray.append(4)
//immutableArray.removeAll()

 

Dictionary

-Dictionary는 키 와 값 의 쌍으로 이루어진 컬렉션 타입입니다.

// Key가 String 타입이고 Value가 Any인 빈 Dictionary 생성
var anyDictionary: Dictionary<String, Any> = [String: Any]()

// 같은 표현
// var anyDictionary: Dictionary <String, Any> = Dictionary<String, Any>()
// var anyDictionary: Dictionary <String, Any> = [:]
// var anyDictionary: [String: Any] = Dictionary<String, Any>()
// var anyDictionary: [String: Any] = [String: Any]()
// var anyDictionary: [String: Any] = [:]
// var anyDictionary = [String: Any]()

-Dictionary 활용

// 키에 해당하는 값 할당
anyDictionary["someKey"] = "value"
anyDictionary["anotherKey"] = 100

print(anyDictionary) // ["someKey": "value", "anotherKey": 100]

// 키에 해당하는 값 변경
anyDictionary["someKey"] = "dictionary"
print(anyDictionary) ["someKey": "dictionary", "anotherKey": 100]

// 키에 해당하는 값 제거
anyDictionary.removeValue(forKey: "anotherKey")
anyDictionary["someKey"] = nil
print(anyDictionary)

-let을 사용하여 Dictionary를 선언하면 불변 Dictionary가 됩니다.

let emptyDictionary: [String: String] = [:]
let initalizedDictionary: [String: String] = ["name": "yagom", "gender": "male"]

// 불변 Dictionary이므로 값 변경 불가
//emptyDictionary["key"] = "value"

 

-키의 해당하는 값을 다른 변수나 상수에 할당하고자 할때는 옵셔널 타입 캐스팅 파트에서 다룹니다.

// "name"이라는 키에 해당하는 값이 없을 수 있으므로 
// String 타입의 값이 나올 것이라는 보장이 없습니다.
// 컴파일 오류가 발생합니다
let someValue: String = initalizedDictionary["name"]

Set

-Set은 순서가 없고, 멤버가 유일한 것을 보장하는 컬렉션 타입입니다.

 

-Set의 선언과 생성

// 빈 Int Set 생성
var integerSet: Set<Int> = Set<Int>()
integerSet.insert(1)
integerSet.insert(100)
integerSet.insert(99)
integerSet.insert(99)
integerSet.insert(99)

print(integerSet) // [100, 99, 1]
print(integerSet.contains(1)) // true
print(integerSet.contains(2)) // false

integerSet.remove(100)
integerSet.removeFirst()

print(integerSet.count) // 1
Set는 집합연산에 많이 활용됩니다

// Set는 집합 연산에 꽤 유용합니다
let setA: Set<Int> = [1, 2, 3, 4, 5]
let setB: Set<Int> = [3, 4, 5, 6, 7]

// 합집합
let union: Set<Int> = setA.union(setB)
print(union) // [2, 4, 5, 6, 7, 3, 1]

// 합집합 오름차순 정렬
let sortedUnion: [Int] = union.sorted()
print(sortedUnion) // [1, 2, 3, 4, 5, 6, 7]

// 교집합
let intersection: Set<Int> = setA.intersection(setB)
print(intersection) // [5, 3, 4]

// 차집합
let subtracting: Set<Int> = setA.subtracting(setB)
print(subtracting) // [2, 1]

 

생각해보기!

다음과 같은 경우에는 각각 어떤 컬렉션 타입을, 상수/변수 선언 중 어떤 것을 사용하면 유용할지 생각해 봅시다.

  • 영어 알파벳 소문자를 모아두는 컬렉션 >> Array
  • 책의 제목과 저자 정리를 위한 컬렉션 >> Dictionary
  • 우리반 학생 명부 작성을 위한 컬렉션 >> Set?

 

https://blog.yagom.net/

 

yagom's blog

야곰의 프로그래밍 블로그입니다. iOS, Swift, Objective-C, C에 대해 이야기합니다.

blog.yagom.net

 

- 모든 데이터 타입의 이름은  첫 글자를 대문자로 입력한다. 

- 모든 데이터 타입(IntFloatDoubleBoolStringArrayDictionarySet 등)은 모두 Struct (구조체)를 기반으로 구현되어 있다.

(쉽게 설명하자면, 우리가 숫자를 표현하고 싶을 때 Int 라고 입력해서 바로 사용할 수 있도록 Swift에 미리 구조체 라는 것으로 만들어져 있다는 의미)

<-> Reference Type : class, function, closure 등

- 스위프트는 데이터 타입 엄격하게 관리하므로 암시적으로 이루어지는 데이터 타입의 변형으로부터 일어날 수 있는 예기치 않은 결과를 일으키는 경우를 방지해야 한다.

Bool

- true 와 false 만을 값으로 가지는 타입

var someBool: Bool = true
someBool = false
// someBool = 0 // 컴파일 오류발생
// someBool = 1 // 컴파일 오류발생

 

Int , UInt

- Int : 정수 타입. 현재는 기본적으로 64비트 정수형.

var someInt: Int = -100
// someInt = 100.1 // 컴파일 오류발생

 

-UInt : 양의 정수 타입. 현재는 기본적으로 64비트 양의 정수형

var someUInt: UInt = 100
// someUInt = -100 // 컴파일 오류발생
// someUInt = someInt // 컴파일 오류발생

 

Float, Double

-Float : 실수 타입. 32비트 부동소수형

var someFloat: Float = 3.14
someFloat = 3

-Double : 실수 타입. 64비트 부동소수형

var someDouble: Double = 3.14
someDouble = 3
// someDouble = someFloat // 컴파일 오류발생

 

Character, String

- Character : 문자 타입. 유니코드 사용. 큰따옴표("") 사용.

var someCharacter: Character = "🇰🇷"
someCharacter = "😄"
someCharacter = "가"
someCharacter = "A"
// someCharacter = "하하하" // 컴파일 오류발생
print(someCharacter)

-String : 문자열 타입. 유니코드 사용. 큰따옴표("") 사용.

var someString: String = "하하하 😄 "
someString = someString + "웃으면 복이와요"
print(someString)

// someString = someCharacter // 컴파일 오류발생

여러줄 문자열은 큰따옴표 세 개 사용.

someString = """
여러줄 문자열을
사용할 수 있습니다.
첫 줄에 겹따옴표 세 개,
마지막 줄에 겹따옴표 세 개를
사용하면 됩니다.
"""

someString = """
겹따옴표 세 개인 줄(첫줄, 끝줄)에서
줄 바꿈을 하지 않으면 오류가 발생합니다.
"""

/*
someString = """오류발생
오류발생"""
*/

 

생각해보기

let integer = 100 //정수형 Int Type
let floatingPoint = 12.34 // 실수형 Double Type
let apple = "A" // String

print(type(of: integer)) //Int
print(type(of: floatingPoint)) // Double
print(type(of: apple)) //String

 

Any

-swift의 모든 타입을 지칭하는 키워드

var someAny: Any = 100
someAny = "어떤 타입도 수용 가능합니다"
someAny = 123.12

Any 타입에 Double 자료를 넣어두었더라도 Any는 Double 타입이 아니기 때문에 할당할 수 없습니다.

명시적으로 타입을 변환해 주어야 합니다.

타입 변환은 차후에~

let someDouble: Double = someAny  // 컴파일 오류발생

AnyObject

모든 클래스 타입을 지칭하는 프로토콜(클래스와 프로토콜은 차후에~)

class SomeClass {}

var someAnyObject: AnyObject = SomeClass()

AnyObject는 클래스의 인스턴스만 수용 가능하기 때문에 클래스의 인스턴스가 아니면 할당할 수 없습니다.

someAnyObject = 123.12    // 컴파일 오류발생

nil

없음을 의미하는 키워드

다른 언어의 NULL, Null, null 등과 유사한 표현입니다.

 

아래 코드에서 someAny는 Any타입이고, someAnyObject는 AnyObject타입 이기 때문에

nil을 할당할 수 없습니다.

nil다루기는 옵셔널에서~

someAny = nil         // 컴파일 오류발생
someAnyObject = nil   // 컴파일 오류발생

 

 

 

도움주신 분들!

 

https://docs.swift.org/swift-book/LanguageGuide/TheBasics.html

 

The Basics — The Swift Programming Language (Swift 5.7)

The Basics Swift is a new programming language for iOS, macOS, watchOS, and tvOS app development. Nonetheless, many parts of Swift will be familiar from your experience of developing in C and Objective-C. Swift provides its own versions of all fundamental

docs.swift.org

 

https://lxxyeon.tistory.com/

 

👩🏻‍💻 테크연

 

lxxyeon.tistory.com

https://blog.yagom.net/

 

yagom's blog

야곰의 프로그래밍 블로그입니다. iOS, Swift, Objective-C, C에 대해 이야기합니다.

blog.yagom.net

 

- 상수 선언 키워드 let

- 변수 선언 키워드 var

let 이름 : 타입 = 값
var 이름 : 타입 = 값
let constant: String = "차후에 변경이 불가능한 상수 let" //immutable
var variable: String = "차후에 변경이 가능한 변수 var" //mutable

variable = "변수는 이렇게 차후에 다른 값을 할당할 수 있지만"
// constant = "상수는 차후에 값을 변경할 수 없습니다" // 오류발생

 

상수 선언 후 값 할당하기

-> 나중에 할당하려는 상수나 변수는 타입을 꼭 명시해주어야 합니다.

 

let sum: Int
let inputA: Int = 100
let inputB: Int = 200

// 선언 후 첫 할당
sum = inputA + inputB

// sum = 1 // 그 이후에는 다시 값을 바꿀 수 없습니다, 오류발생

// 변수도 물론 차후에 할당하는 것이 가능합니다
var nickName: String

nickName = "Smith"

// 변수는 차후에 다시 다른 값을 할당해도 문제가 없지요
nickName = "스미스"

 

생각해보기

let name = "smith" //이름은 바뀌지 않으니 상수
var numberToAdd = 5 //더하려는 숫자는 바뀔수 있으니 숫자??
let pi = 3.14195 //파이는 상수
let maxItemCount = 1000  // 최대 아이탬개수는 상수

 

 

 

https://docs.swift.org/swift-book/LanguageGuide/TheBasics.html

 

The Basics — The Swift Programming Language (Swift 5.7)

The Basics Swift is a new programming language for iOS, macOS, watchOS, and tvOS app development. Nonetheless, many parts of Swift will be familiar from your experience of developing in C and Objective-C. Swift provides its own versions of all fundamental

docs.swift.org

https://blog.yagom.net/

 

yagom's blog

야곰의 프로그래밍 블로그입니다. iOS, Swift, Objective-C, C에 대해 이야기합니다.

blog.yagom.net

 

카드2 성공

 
시간 제한메모리 제한제출정답맞힌 사람정답 비율
2 초 (추가 시간 없음) 128 MB 58758 30371 24894 51.921%

문제

N장의 카드가 있다. 각각의 카드는 차례로 1부터 N까지의 번호가 붙어 있으며, 1번 카드가 제일 위에, N번 카드가 제일 아래인 상태로 순서대로 카드가 놓여 있다.

이제 다음과 같은 동작을 카드가 한 장 남을 때까지 반복하게 된다. 우선, 제일 위에 있는 카드를 바닥에 버린다. 그 다음, 제일 위에 있는 카드를 제일 아래에 있는 카드 밑으로 옮긴다.

예를 들어 N=4인 경우를 생각해 보자. 카드는 제일 위에서부터 1234 의 순서로 놓여있다. 1을 버리면 234가 남는다. 여기서 2를 제일 아래로 옮기면 342가 된다. 3을 버리면 42가 되고, 4를 밑으로 옮기면 24가 된다. 마지막으로 2를 버리고 나면, 남는 카드는 4가 된다.

N이 주어졌을 때, 제일 마지막에 남게 되는 카드를 구하는 프로그램을 작성하시오.

입력

첫째 줄에 정수 N(1 ≤ N ≤ 500,000)이 주어진다.

출력

첫째 줄에 남게 되는 카드의 번호를 출력한다.

예제 입력 1 복사

6

예제 출력 1 복사

4

알고리즘 분류

실패코드

import Foundation

struct Queue<T>{
    private var elements = [T]()
    init(_ queue: [T]) {
            self.elements = queue
        }
    
    public mutating func push(_ element: T){
        self.elements.append(element)
    }
    
    public mutating func pop() -> T? {
        if self.elements.isEmpty{
            return ( -1 as! T)
        }else{
            let pop = self.elements.first
            self.elements.remove(at: 0)
            return pop
        }
    }
    
    public func empty() -> Bool {
        return self.elements.isEmpty
    }
    
    public var size: Int {
        return self.elements.count
    }
    
    public mutating func front() -> T? {
        if self.elements.isEmpty{
            return (-1 as! T)
        }else{
            return self.elements.first //맨앞정수
        }
    }
    public mutating func back() -> T? {
        if self.elements.isEmpty{
            return (-1 as! T)
        }else{
            return self.elements.last //맨뒤정수
        }
    }
}

let input = Int(readLine()!)!
var arr = [Int](1...input)
var myQueue = Queue<Int>(arr)


while myQueue.size != 1{
    myQueue.pop()!
    myQueue.push(myQueue.front()!)
    myQueue.pop()!
}
print(myQueue.pop()!)

while문 안쪽 과 큐 선언의 문제가 있어보여 다시하였따...

계속 시간초과야 ㅡ,.ㅡ

 

제출코드

class Queue<T> {
    var enQueue: [T]
    var deQueue: [T] = []
    
    var count: Int {
        return enQueue.count + deQueue.count
    }
    
    var isEmpty: Bool {
        return enQueue.isEmpty && deQueue.isEmpty
    }
    
    init(_ queue: [T]) {
        self.enQueue = queue
    }
    
    func push(_ element: T) {
        enQueue.append(element)
    }
    
    func pop() -> T {
        if deQueue.isEmpty {
            deQueue = enQueue.reversed()
            enQueue.removeAll()
        }
        return deQueue.popLast()!
    }
    
}

let input = Int(readLine()!)!
var arr = [Int](1...input)
var myQueue = Queue<Int>(arr)


for _ in 1 ..< input{
    let _ = myQueue.pop()
    myQueue.push(myQueue.pop())
}
print(myQueue.pop())

 

이름짓기 규칙

Swift는 기본적으로 Camel Case를 사용

 

- Lower Camel Case : function, method, variable, constant

   Ex) someVariableName

- Upper Camel Case : type(class, struct, enum, extension ...)

   Ex) Person, Point, Week

- Swift는 모두 대소문자를 구분함

 

콘솔로그

- print() : 단순 문자열을 출력

- dump() : 인스턴스의 자세한 설명(description 프로퍼티) 까지 출력  -> 기본적으로 콘솔로그에 남기는 동작을함

 

문자열 보간법

- String Interpolation

- 프로그램 실행 중 문자열 내에 변수 또는 상수의 실질적인 값을 표현하기 위해 사용

- \() 사용

let age: Int = 10 //나이 상수를 선언

"안녕하세요! 저는 \(age)살입니다!" // \()을 사용하여 문자열 보간

print("안녕하세요! 저는 \(age)살입니다!") //콘솔로그에서 확인

class Person{
    var name : String = " yagom "
    var age : Int = 10
}

let yagom : Person = Person()

print(yagom) //프로젝트이름.Person
print("----------")
dump(yagom) // 프로젝트이름.Person #0
            // - name: " yagom "
            // - age: 10

 

 

 

 

 

https://blog.yagom.net/

 

yagom's blog

야곰의 프로그래밍 블로그입니다. iOS, Swift, Objective-C, C에 대해 이야기합니다.

blog.yagom.net

 

Swift 문법 공부는 yagom님을 통해 하였습니다.

좋은 강의 감사합니다.

 

 

https://blog.yagom.net/

 

yagom's blog

야곰의 프로그래밍 블로그입니다. iOS, Swift, Objective-C, C에 대해 이야기합니다.

blog.yagom.net

 

수 찾기 성공

 
시간 제한메모리 제한제출정답맞힌 사람정답 비율
1 초 128 MB 154089 45592 30312 29.849%

문제

N개의 정수 A[1], A[2], …, A[N]이 주어져 있을 때, 이 안에 X라는 정수가 존재하는지 알아내는 프로그램을 작성하시오.

입력

첫째 줄에 자연수 N(1 ≤ N ≤ 100,000)이 주어진다. 다음 줄에는 N개의 정수 A[1], A[2], …, A[N]이 주어진다. 다음 줄에는 M(1 ≤ M ≤ 100,000)이 주어진다. 다음 줄에는 M개의 수들이 주어지는데, 이 수들이 A안에 존재하는지 알아내면 된다. 모든 정수의 범위는 -231 보다 크거나 같고 231보다 작다.

출력

M개의 줄에 답을 출력한다. 존재하면 1을, 존재하지 않으면 0을 출력한다.

예제 입력 1 복사

5
4 1 5 2 3
5
1 3 7 9 5

예제 출력 1 복사

1
1
0
0
1

출처

알고리즘 분류

 

코드

import Foundation

//N(1 ≤ N ≤ 100,000)
//M(1 ≤ M ≤ 100,000)

let N = Int(readLine()!)!
var arr_N = readLine()!.split(separator: " ").map{ Int($0)! }

let M = Int(readLine()!)!
var arr_M = readLine()!.split(separator: " ").map{ Int($0)! }

for i in 0..<N{
    let num_m = arr_M[i]
    if arr_N.contains(num_m){
        print(1)
    }else{
        print(0)
    }
}

너무 쉽다고 생각한후 이렇게 코드작성을 하니 당연히 시간 초과가 났다,,,

카테고리에 이진탐색을 발견후 코드를 바꿔줬다.

 

제출코드

import Foundation

//N(1 ≤ N ≤ 100,000)
//M(1 ≤ M ≤ 100,000)

func binarySearch(_ arr: [Int], _ target: Int) -> Int{
    var start = 0
    var end = arr.count - 1

    while start <= end {
        let mid = (start + end) / 2
            if arr_N[mid] == target {
                return 1
            }else if arr_N[mid] > target {
                end = mid - 1
            }else if arr_N[mid] < target {
                start = mid + 1
            }
        }
        return 0
}

let N = Int(readLine()!)!
var arr_N = readLine()!.split(separator: " ").map{ Int($0)! }

let M = Int(readLine()!)!
var arr_M = readLine()!.split(separator: " ").map{ Int($0)! }

arr_N.sort()

for i in 0..<M{
    print(binarySearch(arr_N, arr_M[i]))
}

'iOS > 백준' 카테고리의 다른 글

Swift 백준 10866번) 덱  (0) 2022.08.15
Swift 백준 10854번) 큐  (0) 2022.08.15
Swift 백준 2751번) 수 정렬하기 2  (0) 2022.08.09
Swift 백준 10989번) 수 정렬하기 3  (0) 2022.08.09
Swift 백준 2231번) 분해합  (0) 2022.08.08

수 정렬하기 2 성공

 
시간 제한메모리 제한제출정답맞힌 사람정답 비율
2 초 256 MB 203223 57808 39987 30.397%

문제

N개의 수가 주어졌을 때, 이를 오름차순으로 정렬하는 프로그램을 작성하시오.

입력

첫째 줄에 수의 개수 N(1 ≤ N ≤ 1,000,000)이 주어진다. 둘째 줄부터 N개의 줄에는 수가 주어진다. 이 수는 절댓값이 1,000,000보다 작거나 같은 정수이다. 수는 중복되지 않는다.

출력

첫째 줄부터 N개의 줄에 오름차순으로 정렬한 결과를 한 줄에 하나씩 출력한다.

예제 입력 1 복사

5
5
4
3
2
1

예제 출력 1 복사

1
2
3
4
5

출처

코드

import Foundation

let N = Int(readLine()!)!
var arr = [Int]()

for _ in 0..<N {
    arr.append(Int(readLine()!)!)
}

var resArr = arr.sorted()

for i in 0..<N{
    print(resArr[i])
}

'iOS > 백준' 카테고리의 다른 글

Swift 백준 10854번) 큐  (0) 2022.08.15
Swift 백준 1920번) 수 찾기  (0) 2022.08.10
Swift 백준 10989번) 수 정렬하기 3  (0) 2022.08.09
Swift 백준 2231번) 분해합  (0) 2022.08.08
Swift 백준 10828번) 스택  (0) 2022.08.05

수 정렬하기 3 성공

 
시간 제한메모리 제한제출정답맞힌 사람정답 비율
5 초 (하단 참고) 8 MB (하단 참고) 181655 42018 31577 23.468%

문제

N개의 수가 주어졌을 때, 이를 오름차순으로 정렬하는 프로그램을 작성하시오.

입력

첫째 줄에 수의 개수 N(1 ≤ N ≤ 10,000,000)이 주어진다. 둘째 줄부터 N개의 줄에는 수가 주어진다. 이 수는 10,000보다 작거나 같은 자연수이다.

출력

첫째 줄부터 N개의 줄에 오름차순으로 정렬한 결과를 한 줄에 하나씩 출력한다.

예제 입력 1 복사

10
5
2
3
1
4
2
3
5
1
7

예제 출력 1 복사

1
1
2
2
3
3
4
5
5
7

출처

  • 문제를 만든 사람: baekjoon
  • 데이터를 추가한 사람: cgiosy
  • 문제의 오타를 찾은 사람: joonas

 

코드

import Foundation

let N = Int(readLine()!)!
var arr = [Int]()

for _ in 0..<N {
    arr.append(Int(readLine()!)!)
}

var resArr = arr.sorted()

for i in 0..<N{
    print(resArr[i])
}

당연히 sort를 사용하여 푸는 문제라고 접근하여서 풀었더니 시간초과만 주구장창 나왔다...

N의 범위가 N(1 ≤ N ≤ 10,000,000) 이니 입력을 받을때와 print를 할때 시간이 오래걸리는것을 알았지만~

그다음은 생각을 못하였다..

 

https://gist.github.com/JCSooHwanCho/30be4b669321e7a135b84a1e9b075f88

 

ps할 때 입력을 한꺼번에 받기 위한 유틸리티 클래스. fread의 swift 버전.

ps할 때 입력을 한꺼번에 받기 위한 유틸리티 클래스. fread의 swift 버전. GitHub Gist: instantly share code, notes, and snippets.

gist.github.com

검색후 입력을 야무지게 받을수 있는것을 찾았고..(정말 감사합니다 ㅠㅠ)

새로운 결과 배열을 추가하지않고 String에 줄바꿈을 하며 +하기로 하였다.

 

최종코드

import Foundation

final class FileIO {
    private let buffer:[UInt8]
    private var index: Int = 0

    init(fileHandle: FileHandle = FileHandle.standardInput) {
        
        buffer = Array(try! fileHandle.readToEnd()!)+[UInt8(0)] // 인덱스 범위 넘어가는 것 방지
    }

    @inline(__always) private func read() -> UInt8 {
        defer { index += 1 }

        return buffer[index]
    }

    @inline(__always) func readInt() -> Int {
            var sum = 0
            var now = read()
            var isPositive = true

            while now == 10
                || now == 32 { now = read() } // 공백과 줄바꿈 무시
            if now == 45{ isPositive.toggle(); now = read() } // 음수 처리
            while now >= 48, now <= 57 {
                sum = sum * 10 + Int(now-48)
                now = read()
            }

            return sum * (isPositive ? 1:-1)
        }
}

let file = FileIO()

let N = file.readInt()
var arr = Array(repeating:0,count:10001)

for _ in 0 ..< N {
    let i = file.readInt()
    arr[i] += 1
}

var res = ""

for i in 1...10000 {
    res += String(repeating:"\(i)\n",count:arr[i])
}
print(res)

'iOS > 백준' 카테고리의 다른 글

Swift 백준 1920번) 수 찾기  (0) 2022.08.10
Swift 백준 2751번) 수 정렬하기 2  (0) 2022.08.09
Swift 백준 2231번) 분해합  (0) 2022.08.08
Swift 백준 10828번) 스택  (0) 2022.08.05
Swift 백준 4153번) 직각삼각형  (0) 2022.08.05

분해합 성공다국어

한국어   
시간 제한메모리 제한제출정답맞힌 사람정답 비율
2 초 192 MB 96282 44135 34850 45.436%

문제

어떤 자연수 N이 있을 때, 그 자연수 N의 분해합은 N과 N을 이루는 각 자리수의 합을 의미한다. 어떤 자연수 M의 분해합이 N인 경우, M을 N의 생성자라 한다. 예를 들어, 245의 분해합은 256(=245+2+4+5)이 된다. 따라서 245는 256의 생성자가 된다. 물론, 어떤 자연수의 경우에는 생성자가 없을 수도 있다. 반대로, 생성자가 여러 개인 자연수도 있을 수 있다.

자연수 N이 주어졌을 때, N의 가장 작은 생성자를 구해내는 프로그램을 작성하시오.

입력

첫째 줄에 자연수 N(1 ≤ N ≤ 1,000,000)이 주어진다.

출력

첫째 줄에 답을 출력한다. 생성자가 없는 경우에는 0을 출력한다.

예제 입력 1 복사

216

예제 출력 1 복사

198

코드

import Foundation

let N = Int(readLine()!)!
var res = 1

for i in 0 ..< N{
    var temp = i
    var sum = 0
    while( temp != 0){
        sum += temp % 10
        temp /= 10
    }
    if (sum + i == N){
        res = i
        break
    }
}
print(res)

출처

ICPC > Regionals > Asia Pacific > Korea > Asia Regional - Seoul 2005 B번

https://www.acmicpc.net/

 

Baekjoon Online Judge

Baekjoon Online Judge 프로그래밍 문제를 풀고 온라인으로 채점받을 수 있는 곳입니다.

www.acmicpc.net

 

'iOS > 백준' 카테고리의 다른 글

Swift 백준 2751번) 수 정렬하기 2  (0) 2022.08.09
Swift 백준 10989번) 수 정렬하기 3  (0) 2022.08.09
Swift 백준 10828번) 스택  (0) 2022.08.05
Swift 백준 4153번) 직각삼각형  (0) 2022.08.05
Swift 백준 1259번) 팰린드롬수  (0) 2022.08.05

+ Recent posts