/*
 문제
 2와 5로 나누어 떨어지지 않는 정수 n(1 ≤ n ≤ 10000)가 주어졌을 때, 1로만 이루어진 n의 배수를 찾는 프로그램을 작성하시오.
 
 입력
 입력은 여러 개의 테스트 케이스로 이루어져 있다. 각 테스트 케이스는 한 줄로 이루어져 있고, n이 주어진다.

 출력
1로 이루어진 n의 배수 중 가장 작은 수의 자리수를 출력한다.
 
 */
import Foundation
//while let input = readLine() {
//    var one = "1"
//    while Int(one)! % Int(input)! != 0 {
//        print(one)
//        one.append("1")
//    }
//    print(one.count)
//}

while let input = readLine() {
    var one = 1
    var count = 1
    while one % Int(input)! != 0 {
        one = one * 10 + 1
        one %= Int(input)!
        count += 1
    }
    print(count)
}

 

단순히 문자열에 "1" 을 추가하고, 해당 문자열의 길이를 출력하는 방법으로 풀었으나 Runtime 오류가 발생했다.

실행 할때마다 결과값이 잘 나와서 왜 안되는지 한잘 머리를 굴렸다.. ( 주석처리한 부분! )

 

그리고 11113 같은 큰 수를 넣었더니.. 에러가 발생했다!!

 

이유는 Int 형의 범위를 넘어가서 오류가 발생하는 거였다..

 

그래서 어떻게 하지 고민하다가..

 

input으로 들어온 값으로 나눈 나머지로 계산하는 방식을 고안해 냈다..

 

왜 저렇게 고안했는지는 디버깅 몇번 해보면 알게 될것이당...

저렇게 계산하면 최대 범위를 넘어갈 일도 없을 뿐더러 계산도 차이없이 잘 된다!

/*
 문제
 (A+B)%C는 ((A%C) + (B%C))%C 와 같을까?

 (A×B)%C는 ((A%C) × (B%C))%C 와 같을까?

 세 수 A, B, C가 주어졌을 때, 위의 네 가지 값을 구하는 프로그램을 작성하시오.
 
 입력
 첫째 줄에 A, B, C가 순서대로 주어진다. (2 ≤ A, B, C ≤ 10000)
 
 출력
 첫째 줄에 (A+B)%C, 둘째 줄에 ((A%C) + (B%C))%C, 셋째 줄에 (A×B)%C, 넷째 줄에 ((A%C) × (B%C))%C를 출력한다.
 
 */
import Foundation
let inputArr = readLine()!.components(separatedBy: " ").map{Int($0)!}
let A = inputArr[0], B = inputArr[1], C = inputArr[2]
print((A + B)%C)
print(((A%C) + (B%C))%C)
print((A*B)%C)
print(((A%C) * (B%C))%C)

설명할 사항이 딱이 없는거 같다.

한가지만 알아두자!

 

Swift 에서 readLine() 으로 입력을 받을수 있음

components(separatedBy: " ") 로 " " 기준으로 나누어 저장함

map 함수를 이용하여 Int 형 배열로 저장!

MVC 패턴의 개요

Model - View - Controller 구조로 이루어진 디자인 패턴을 의미한다.

 

Model : 앱의 데이터 또는 비즈니스 로직을 소유 ( 데이터의 변수 및 상수 , 데이터 값의 계산 등을 수행 )

View : 사용자에게 데이터 또는 UI 를 보여주는 역할을 수행 ( Storyboard 가 View 에 포함 )

Controller : Model  View 의 중간에서 View로부터 사용자의 이벤트를 감지하고, 해당 이벤트 처리를 Model에게 지시하며, Model의 계산된 데이터를 받아 View에게 전달하는 역할을 수행 ( TableViewController , ViewController, 등등.. )

 

Model - View - Controller 는 각각 어떻게 소통을 하나?

음식점을 예로 들어보자

1. 손님은 음식을 주문하기 위해 음식점의 홀에 있는 종업원에게 음식을 주문한다.
2. 음식 주문을 받은 종업원은 주방장에게 주문 내역을 보여준다.
3. 주방장은 주문내역을 보며 음식을 조리하여 조리가 완료되면 종업원을 다시 부른다.
4. 종업원은 해당 음식을 손님에게 제공한다.
5. 만약, 음식의 맛이 이상하거나 추가적인 조리를 원한다면 손님은 종업원을 호출한다.
6. 종업원은 손님의 요구사항을 적어 주방장에게 전달한다.
7. 주방장은 손님의 요구사항대로 음식을 재 조리하여 종업원을 부른다.
8. 종업원은 손님에게 재 조리된 음식을 제공한다.

자! 이제 종업원을 Controller로, 손님을 View로, 주방장을 Model 로 생각해보자

손님(View)은 요구사항을 전달하기 위해 종업원(Controller)에게 요구사항을 알려준다.

종업원(Controller)는 해당 요구사항을 주방장(Model)에게 전달한다.

주방장(Model)은 요구사항대로 조리가 되면 종업원(Controller)에게 음식을 전달한다.

종업원(Controller)주방장(Model)로부터 받은 음식을 손님(View)에게 전달한다.

즉, View  Model 은 직접적으로 소통할수 없고, Controller를 통해서만 소통을 할수 있다.

 

아주 간단한 MVC 패턴 적용 예시

TableView 를 사용해 이름들을 나열하는 화면을 그려보자!

 

일단 나 같은 경우, 공부를 해가는 과정이지만 Udemy - 안젤라유님의 강의를 듣고 최대한 습관화 하려고 노력하고있다.

이렇게 Model - View - Controller 를 구분하여 그룹으로 묶어두면 MVC패턴에 익숙해지는데 도움이 될거같아서...


Model

Name 구조체 먼저 선언해주고


View

View는 Storyboard 파일도 포함되지만, 이렇게 일부 Cell을 떼어내어 View로 구성할수 도 있다!


Controller

해당 부분을 보면 알겠지만, Model에 선언된 구조체를 Controller가 그 내용을 담고있으며,
View의 변화 ( TableView의 DataSource ) 에 따라 해당 값을 Controller가 전달한다.

 

이를 실행해보면

이와 같이 TableView 로 각 이름 값 들을 표시하는걸 볼 수 있다!

물론 해당 예시가 완벽한 MVC 패턴을 그리고 있진 않지만 대략적으로 이렇게 사용된다고 이해하면 될 것 같다!

 

 

MVC 패턴의 장점

  • 다른 패턴들에 비해 비교적 적은 코드량을 갖고있다
  • Apple 에서 SwiftUI가 나오기 전, 기본적으로 채택하고 있던 패턴요소이다! ( 하지만,, 현재는 MVVM 패턴을 강조하고 있다... MVVM 패턴은 아직까진 숙지가 되지 않아 이해하게 되면 블로그에 올릴 생각! )

 

MVC 패턴의 단점

  • 모든 일을 Controller가 맡아서 하고있다, 즉 Cotroller가 너무 많은 업무를 담당하게 된다
  • Controller의 코드가 너무 길어질 수 밖에 없는 구조! → Controller의 내부 구조가 복잡해지기 쉽다
  • 프로젝트의 규모가 커질수록 유지보수 하기에 어려움이 있다! ( 사실 아직까지 큰 프로젝트를 한적이 없어서 이 말이 잘 이해가 가지 않는다... 나중에 하게 된다면 몸소 느껴봐야겠다! )

iOS의 ViewControlle의 생명주기는 개발함에 있어 굉장히 중요하다.

해당 View에 컨텐츠가 언제 나타나야 하는지, 컨텐츠의 내용은 무엇인지, 해당 컨텐츠의 내용이 뷰가 사라지면 어떻게 되야하는지 등등 개발함에 있어 반드시 알아야 하는 중요한 사항들이있다.

ViewController의 생명주기에 대해 알아보자!

1. ViewDidLoad()

공식문서에 의하면 뷰 컨트롤러가 메모리에 로드된후 호출되는 메소드이다.

다시말해 뷰가 메모리에 로딩이 완료되면 시스템에 의해 자동으로 호출되는 메소드로, 화면이 처음 생성될때 딱 한번 실행된다.

2. ViewWillAppear()

공식문서에 의하면 뷰가 뷰 계층에 추가될 것임을 뷰 컨트롤러 알려주는 메소드이다.

다시말해 뷰가 화면에 나타나기 직전! 해당 메서드가 호출된다!

그럼, ViewDidLoad 도 화면에 나타나기전, 수행되는데 이 둘의 차이는 무엇일까?

직접 구현해보면 차이를 파악알수 있다.

처음 View를 표시할때 ViewDidLoad() 가 호출되고, 그다음에 ViewWillApear() 가 호출된다,

그리고 다른 뷰로 넘어갈때, 마찬가지로 둘다 호출이 되지만 다시 이전화면으로 돌아갈때

ViewWillAppear() 메소드만 호출됨을 알수있다.

즉, ViewDidLoad() 는 메모리가 해제되기 전까지는 무조건 1번만 호출되며, ViewWillAppear() 메소드는 메모리와 관계없이 해당 뷰를 표시할때 무조건 호출되는 차이가 있다!

3. ViewDidAppear()

공식문서에 의하면 뷰가 뷰 계층에 추가되었음을 뷰 컨트롤러에 알려주는 메소드이다.

다시 말해 ViewWillAppear() 는 뷰가 표시되기 직전 호출되는 메소드라면,

ViewDidAppear() 는 뷰가 표시된 직후!!! 호출되는 메소드이다!

4. ViewWillDisappear()

공식문서에 의하면 뷰가 뷰 계층에서 제거될 것임을 뷰 컨트롤러에 알려주는 메소드이다.

다시말해 뷰가 사라지기 직전 호출되는 메소드 이다!

5. ViewDidDisappear()

공식문서에 의하면 뷰가 뷰 계층에서 제거되었음을 뷰 컨트롤러에 알려주는 메소드이다.

마찬가지로 ViewWillDisappear() 가 사라지기 직전 호출되는 메소드라면, ViewDidDisappear()는 사라진 직후 호출되는 메소드이다.

이와 같이 ViewController의 생명주기는 메소드의 이름만으로도 충분히 어떤일을 수행하는 메소드인지 짐작할수 있다!

이를 직접 구현하여 실제로 어떤 순서로 호출되는지 파악해 보자!

확실히 호출되는 순서를 보면 더욱더 이해하기 쉽다!

이 생명주기를 잘 기억하여 

View 에 표시되는 데이터나 저장해야하는 시점 등등을 적절한 메소드에 적절하게 사용하면 된다!

아주 기본적이면서 아주 중요한 내용이다!

책을 보고있다

꼼꼼한 재은씨 책은 닉값을 한다!

 

엄청 꼼꼼히 설명되어 있다

 

이전에 들었던 강의에서

왜? 이게 왜?

하는 의문이 이책을 보니 다 해결되었다

 

책의 내용을 요약해서 올리고 싶지만 저작권의 문제때문에.

 

최대한 빨리 보고 실 프로젝트를 해봐야겠다

그리고 책을 다 본후 이해한 내용을 바탕으로 기본 개념을 다시 적는 형태로 블로그를 운영해야지

 

+ Recent posts