From c52316d3ebc6faaf4e8878b01814eb28b3c039c0 Mon Sep 17 00:00:00 2001 From: Wegbereiterin Date: Thu, 21 Sep 2023 16:56:18 +0900 Subject: [PATCH 01/21] =?UTF-8?q?=EB=B0=95=EC=84=A0=EA=B5=AC=209=EC=9B=942?= =?UTF-8?q?1=EC=9D=BC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- lecture/23.09.21 ParkSeonKooswift.swift | 258 ++++++++++++++++++++++++ 1 file changed, 258 insertions(+) create mode 100644 lecture/23.09.21 ParkSeonKooswift.swift diff --git a/lecture/23.09.21 ParkSeonKooswift.swift b/lecture/23.09.21 ParkSeonKooswift.swift new file mode 100644 index 0000000..263e115 --- /dev/null +++ b/lecture/23.09.21 ParkSeonKooswift.swift @@ -0,0 +1,258 @@ +// +// main.swift +// Swift_Sample +// +// Created by 박선구 on 2023/09/21. +// + +//import Foundation +// +//print("아무말 입력: ", terminator: "") +// +//var input = Int(readLine()!)! +//print(input) + +//let orange: Int = 3729 +//let number: Int = 52 +// +//var box: Int = orange / number +//var left: Int = orange % number +//print("김모씨가 귤 박스를 줄 수 있는 박스의 수는? ",box) +//print("박스에 담고 남은 귤의 수는? ", left) + +//let num : Int = 456; +//var numnum : Int? +// +//numnum = ((num / 10) * 10) + 1 +//print(numnum!) + + + +//print("swift", terminator: " ") +//print("ios", terminator: " ") +//print("web: ", terminator: " ") +// +//let swift : Int = Int(readLine()!)! +//let ios : Int = Int(readLine()!)! +//let web : Int = Int(readLine()!)! +//var sum = (swift + ios + web) +//var num = sum / 3 +// +//print("합계: ",sum) +//print("평균: ",num) + +//끔하게 (읽기 쉽게) +//print("swift", terminator: " ") +//let ios = Int(readLine()!)! +//print("ios", terminator: " ") +//let swift = Int(readLine()!)! +//print("web ", terminator: " ") +//let web = Int(readLine()!)! +// +//var sum: Int = ios + swift + web +//var avg = Float(sum) / 3.0 +// +//print("합", sum) +//print("평", avg) + +////연습 +//let x = 10 +//let y = 20 +// +//print("result", x > y ? "안녕" : "잘가") + + + +////시간구하기 +//print("초 입력: ", terminator: " ") +//var stime = Int(readLine()!)! +//var mtime : Int = 0 +//var htime : Int = 0 +// +//mtime = (stime / 60) % 60 +//htime = (stime / 60) / 60 +//stime = stime % 60 +// +//print("시간", htime) +//print("분", mtime) +//print("초", stime) + + +////노동시간 +//print("노동시간: ", terminator: " ") +//var times = Int(readLine()!)! +//var money : Double = 0 +//var overTime = (times - 8) +// +//if times > 8 { +// money = ((Double(overTime) * (5000*1.5)) + (8 * 5000.0)) +//}else{ +// money = Double(times) * 5000.0 +//} +//print("총 임금은", Int(money),"원 입니다.") + + + +////짝수홀수 +//print("정수를 입력하세요: ", terminator: " ") +//let num = Int(readLine()!)! +// +//var num1 = num % 2 +//print(num1 >= 1 ? "홀수입니다." : "짝수입니다.") + +// +////두 개의 정수 +//print("정수를 입력하세요: ", terminator: " ") +//let num1 = Int(readLine()!)! +//print("정수를 입력하세요: ", terminator: " ") +//let num2 = Int(readLine()!)! +// +//print("두 수의 차: ", num1 > num2 ? "\(num1 - num2)":"\(num2-num1)") + + +//func inputLine(_ message: String) -> Int { +// print(message, terminator: " ") +// return Int(readLine()!)! +//} +//// +// +// +//print("초를 입력해주세요: ", terminator: " ") +//let total = Int(readLine()!)! +// +//let m = (total / 60) % 60 //분 구하기 초를 60으로 나누면 나머지가 분이다. +//let h = (total/60)/60 //시간 구하기 초를 60으로 나누고 한번더 60으로 나누면 초가 시간이 된다. +//let s = total % 60 //초는 전체초를 60으로 나누면 나온다. +//print(h , m, s) +//print("시간:",h ,"분:",m ,"초:" ,s) + + +////농구공 상자 문제 +//print("공의 수를 입력해주세요: ", terminator: " ") +//let balls = Int(readLine()!)! +//var leftBall = 0 +//var boxs = 0 +// +//leftBall = balls % 5 +//boxs = balls / 5 +// +//print("공이 들어간 박스: ", boxs) +//print("남은 공: ", leftBall) +// +//if leftBall != 0 { +// boxs = boxs + 1 +// print("필요한 상자의 수: ", boxs) +//}else{ +// +// print("필요한 상자의 수: ", boxs) +//} +// +// +//print("필요한 상자의 수", leftBall != 0 ? "\(boxs = boxs + 1)": boxs) + + + + +//경헌님 도움 +//print("예제 6") +//print("초 입력: ", terminator: "") +//var sec = Int(readLine()!)! +// +//var m = sec / 60 +//sec %= 60 +//let h = m / 60 +//m %= 60 +// +//print("\(h)시 \(m)분 \(sec)초") +//print("----------") + + +////if문 예제 1 +//print("정수 입력: ", terminator: " ") +//let age = Int(readLine()!)! +// +//if age >= 20 { +// print("성인입니다.") +//}else{ +// print("어린이입니다.") +//} + + +////조건문예제 2번 +//print("num 입력: ", terminator: " ") +//var num = Int(readLine()!)! +//var a = 0 ;var b = 0 +//a = num % 3 +//b = num % 5 +// +//if a == 0 && b == 0{ +// print("3과 5의 배수입니다.") +//}else{ +// print("3과 5의 배수가 아닙니다.") +//} + +////조건문예제 3번 +//print("grade 입력: ", terminator: " ") +//let grade = Int(readLine()!)! +// +//if grade >= 60{ +// print("합격입니다.") +//}else{ +// print("불합격입니다.") +//} + +////조건문예제 4번 +//print("정수 입력: ", terminator: " ") +//let num = Int(readLine()!)! +// +//if num > 0{ +// print(num, "양수입니다.") +//}else if num < 0{ +// print(num, "음수입니다.") +//}else { +// print(0,"입니다.") +//} + +//조건문예제 5번 +print("정수 num1 입력: ", terminator: " ") +let num1 = Int(readLine()!)! +print("정수 num2 입력: ", terminator: " ") +let num2 = Int(readLine()!)! + +if num1 > num2 { + print(num1) +}else if num1 < num2 { + print(num2) +}else{} + +////조건문예제 6번 +//print("1과목 소프트웨어 설계: ", terminator: " ") +//let num1 = Int(readLine()!)! +//print("2과목 소프트웨어 개발: ", terminator: " ") +//let num2 = Int(readLine()!)! +//print("3과목 데이터베이스 구축: ", terminator: " ") +//let num3 = Int(readLine()!)! +//print("4과목 프로그래밍 언어 활용: ", terminator: " ") +//let num4 = Int(readLine()!)! +//print("5과목 정보시스템 구축관리: ", terminator: " ") +//let num5 = Int(readLine()!)! +// +//var score = num1 + num2 + num3 + num4 + num5 +// +//if num1 < 8 { +// print("불합격입니다.") +//}else if num2 < 8 { +// print("불합격입니다.") +//}else if num3 < 8 { +// print("불합격입니다.") +//}else if num4 < 8 { +// print("불합격입니다.") +//}else if num5 < 8 { +// print("불합격입니다.") +//}else if score < 60 { +// print("불합격입니다.") +//}else{ +// print("합격입니다.") +//} + + From 75fd3f5f03da5ba11c071f2c6b276d433707c870 Mon Sep 17 00:00:00 2001 From: Wegbereiterin Date: Fri, 22 Sep 2023 02:09:22 +0900 Subject: [PATCH 02/21] =?UTF-8?q?=EB=B0=95=EC=84=A0=EA=B5=AC=2023.09.21=20?= =?UTF-8?q?=EC=88=98=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ParkSeonKoo | 1 - ... ParkSeonKooswift.swift => 23.09.21.swift} | 145 +++++++++++++++--- 2 files changed, 126 insertions(+), 20 deletions(-) delete mode 160000 ParkSeonKoo rename lecture/{23.09.21 ParkSeonKooswift.swift => 23.09.21.swift} (69%) diff --git a/ParkSeonKoo b/ParkSeonKoo deleted file mode 160000 index 07f35d1..0000000 --- a/ParkSeonKoo +++ /dev/null @@ -1 +0,0 @@ -Subproject commit 07f35d142e5773f68a24002dc3135a2f75d5de33 diff --git a/lecture/23.09.21 ParkSeonKooswift.swift b/lecture/23.09.21.swift similarity index 69% rename from lecture/23.09.21 ParkSeonKooswift.swift rename to lecture/23.09.21.swift index 263e115..b3e80a1 100644 --- a/lecture/23.09.21 ParkSeonKooswift.swift +++ b/lecture/23.09.21.swift @@ -1,17 +1,16 @@ -// -// main.swift -// Swift_Sample -// // Created by 박선구 on 2023/09/21. -// -//import Foundation -// +import Foundation + +//MARK: - + //print("아무말 입력: ", terminator: "") // //var input = Int(readLine()!)! //print(input) +//MARK: - + //let orange: Int = 3729 //let number: Int = 52 // @@ -20,6 +19,8 @@ //print("김모씨가 귤 박스를 줄 수 있는 박스의 수는? ",box) //print("박스에 담고 남은 귤의 수는? ", left) +//MARK: - + //let num : Int = 456; //var numnum : Int? // @@ -27,6 +28,7 @@ //print(numnum!) +//MARK: - //print("swift", terminator: " ") //print("ios", terminator: " ") @@ -41,6 +43,8 @@ //print("합계: ",sum) //print("평균: ",num) +//MARK: - + //끔하게 (읽기 쉽게) //print("swift", terminator: " ") //let ios = Int(readLine()!)! @@ -55,6 +59,8 @@ //print("합", sum) //print("평", avg) +//MARK: - + ////연습 //let x = 10 //let y = 20 @@ -62,6 +68,7 @@ //print("result", x > y ? "안녕" : "잘가") +//MARK: - ////시간구하기 //print("초 입력: ", terminator: " ") @@ -77,6 +84,7 @@ //print("분", mtime) //print("초", stime) +//MARK: - ////노동시간 //print("노동시간: ", terminator: " ") @@ -92,6 +100,7 @@ //print("총 임금은", Int(money),"원 입니다.") +//MARK: - ////짝수홀수 //print("정수를 입력하세요: ", terminator: " ") @@ -99,6 +108,7 @@ // //var num1 = num % 2 //print(num1 >= 1 ? "홀수입니다." : "짝수입니다.") +//MARK: - // ////두 개의 정수 @@ -109,6 +119,7 @@ // //print("두 수의 차: ", num1 > num2 ? "\(num1 - num2)":"\(num2-num1)") +//MARK: - //func inputLine(_ message: String) -> Int { // print(message, terminator: " ") @@ -126,6 +137,7 @@ //print(h , m, s) //print("시간:",h ,"분:",m ,"초:" ,s) +//MARK: - ////농구공 상자 문제 //print("공의 수를 입력해주세요: ", terminator: " ") @@ -152,6 +164,7 @@ +//MARK: - //경헌님 도움 //print("예제 6") @@ -166,6 +179,7 @@ //print("\(h)시 \(m)분 \(sec)초") //print("----------") +//MARK: - ////if문 예제 1 //print("정수 입력: ", terminator: " ") @@ -177,6 +191,7 @@ // print("어린이입니다.") //} +//MARK: - ////조건문예제 2번 //print("num 입력: ", terminator: " ") @@ -191,6 +206,8 @@ // print("3과 5의 배수가 아닙니다.") //} +//MARK: - + ////조건문예제 3번 //print("grade 입력: ", terminator: " ") //let grade = Int(readLine()!)! @@ -201,6 +218,8 @@ // print("불합격입니다.") //} +//MARK: - + ////조건문예제 4번 //print("정수 입력: ", terminator: " ") //let num = Int(readLine()!)! @@ -213,19 +232,25 @@ // print(0,"입니다.") //} +//MARK: - + //조건문예제 5번 -print("정수 num1 입력: ", terminator: " ") -let num1 = Int(readLine()!)! -print("정수 num2 입력: ", terminator: " ") -let num2 = Int(readLine()!)! - -if num1 > num2 { - print(num1) -}else if num1 < num2 { - print(num2) -}else{} - -////조건문예제 6번 +//print("정수 num1 입력: ", terminator: " ") +//let num1 = Int(readLine()!)! +//print("정수 num2 입력: ", terminator: " ") +//let num2 = Int(readLine()!)! +// +//if num1 > num2 { +// print(num1) +//}else if num1 < num2 { +// print(num2) +//}else{} + +//MARK: - +// # again + + +//////조건문예제 6번 //print("1과목 소프트웨어 설계: ", terminator: " ") //let num1 = Int(readLine()!)! //print("2과목 소프트웨어 개발: ", terminator: " ") @@ -255,4 +280,86 @@ if num1 > num2 { // print("합격입니다.") //} +//MARK: - + +/////디즈니랜드 입장료 +//print("나이를 입력해주세요: " , terminator: " ") +//let age = Int(readLine()!)! +//print("인원 수를 입력해주세요: " , terminator: " ") +//let num = Int(readLine()!)! +// +//var price : Int = 5000 +// +//if num > 1 { +// price = num * price +// print(price) +//}else if age < 18{ +// price = (price / 2) * num +// print(price) +//}else{} + +//MARK: - + +/////마트 계산대 +//print("구매하려는 상품 개수를 입력해주세요: ", terminator: " ") +//let num = Int(readLine()!)! +// +//var price = 10000 +// +//if num >= 11 { +// price = (num * price) - ((num * price)/10) //0.9를 곱해도 가능 +//// price = Int(Double(price)*0.9) * num +// print(price) +//}else { +// price = price * num +// print(price) +//} + +//MARK: - + +////input 함수 +//func inputLine(_ message: String) -> Int{ +// print(message, terminator: " ") +// return Int(readLine()!)! +//} +// + +//MARK: - + +////조건문 예제 9 학점출력 +// +//let grade = inputLine("grade를 입력해주세요 ") +// +//if grade > 90 { +// print("A학점입니다.") +//}else if grade > 80 && grade < 90{ +// print("B학점입니다.") +//}else{ +// print("C학점입니다.")} + + + + +//MARK: --- + +////지훈님 풀이 +//func inputLine(_ message: String) -> Int{ +// print(message,terminator: " ") +// return Int(readLine()!)! +//} +// var flag:Bool = true +// +// var A = inputLine("1과목 소프트웨어 설계") +// if A <= 8 && flag {flag=false} +// A = inputLine("2과목 소프트웨어 개발") +// if A <= 8 && flag {flag=false} +// A = inputLine("3과목 데이터베이스 구축") +// if A <= 8 && flag {flag=false} +// A = inputLine("4과목 프로그래밍 언어 활용") +// if A <= 8 && flag {flag=false} +// A = inputLine("5과목 정보시스템 구축관리") +// if A <= 8 && flag {flag=false} +// +// flag ? print("합격입니다."):print("불합격입니다.") + From 65449d909deacacddfcea6b77a2f5de80f798346 Mon Sep 17 00:00:00 2001 From: Wegbereiterin Date: Sat, 23 Sep 2023 02:02:26 +0900 Subject: [PATCH 03/21] =?UTF-8?q?=EB=B0=95=EC=84=A0=EA=B5=AC23.09.22?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- lecture/23.09.22.swift | 341 +++++++++++++++++++++++++++++++++++++++++ 1 file changed, 341 insertions(+) create mode 100644 lecture/23.09.22.swift diff --git a/lecture/23.09.22.swift b/lecture/23.09.22.swift new file mode 100644 index 0000000..aba43ee --- /dev/null +++ b/lecture/23.09.22.swift @@ -0,0 +1,341 @@ +// Created by 박선구 on 2023/09/23. +// 23.09.22 수업예제 + +import Foundation + +//MARK: - + +//// 조건문 예제 12번 +//// 월을 입력받아 봄, 여름, 가을, 겨울 중 맞는 계절을 알려주는 프로그램을 만드세요 +// +//print("월 입력: ", terminator: " ") +//let month = Int(readLine()!)! +// +//if month == 12 || month == 1 || month == 2{ +// print("\(month)월은 겨울입니다") +//}else if month == 3 || month == 4 || month == 5 { +// print("\(month)월은 봄입니다.") +//}else if month == 6 || month == 7 || month == 8 { +// print("\(month)월은 여름입니다.") +//}else if month == 9 || month == 10 || month == 11{ +// print("\(month)월은 가을입니다.") +//}else{ +// print("!!월을 적어주세요!!") +//} + +//MARK: - + +//// 조건문 예제 13번, 14번 +//// 금액을 입력하고 메뉴를 고른 뒤 잔돈을 출력 +//// 입력한 금액이 선택한 메뉴의 가격보다 부족하면 돈이 부족하다는 문장을 출력하세요. + +//print("금액을 입력해주세요: ", terminator: " ") +//let pay = Int(readLine()!)! +//var money = 0 +// +//if pay < 500 { +// print("구매가능한 메뉴가 없습니다.") +//}else{ +// print("메뉴를 입력해주세요.", "1. 콜라(800원)", "2. 생수(500원)", "3. 비타민워터(1500원)") +// let menu = Int(readLine()!)! +// +// switch menu { +// case 1: +// if pay > 800 { +// money = pay - 800 +// print("잔돈: \(money)원") +// }else{ +// print("구매하실 수 없습니다.") +// } +// case 2: +// print("잔돈: \(pay - 500)원") +// case 3: +// if pay > 1500 { +// money = pay - 1500 +// print("잔돈: \(money)원") +// }else{ +// print("구매하실 수 없습니다.") +// } +// default: +// print("오류") +// } +//} + +//MARK: - + +//// 조건문 예제 15 +//// 잔돈을 줄때 천원, 오백원, 백원을 몇 개 줘야 하는지 계산해보세요 + +//print("금액을 입력해주세요: ", terminator: " ") +//let pay = Int(readLine()!)! +//var money = 0 +// +//if pay < 500 { +// print("구매가능한 메뉴가 없습니다.") +//}else{ +// print("메뉴를 입력해주세요.", "1. 콜라(800원)", "2. 생수(500원)", "3. 비타민워터(1500원)") +// let menu = Int(readLine()!)! +// +// switch menu { +// case 1: +// if pay > 800 { +// money = pay - 800 +// var m1000 = money / 1000 +// var x = money % 1000 +// var m500 = x / 500 +// var y = x % 500 +// var m100 = y / 100 +// print("잔돈: \(money)") +// print("천원지폐: \(m1000)장, 500원: \(m500)개, 100원: \(m100)개") +// }else{ +// print("구매하실 수 없습니다.") +// } +// case 2: +// if pay > 500 { +// money = pay - 500 +// var m1000 = money / 1000 +// var x = money % 1000 +// var m500 = x / 500 +// var y = x % 500 +// var m100 = y / 100 +// print("잔돈: \(money)") +// print("천원지폐: \(m1000)장, 500원: \(m500)개, 100원: \(m100)개") +// }else{ +// print("구매하실 수 없습니다.") +// } +// case 3: +// if pay > 1500 { +// money = pay - 1500 +// var m1000 = money / 1000 +// var x = money % 1000 +// var m500 = x / 500 +// var y = x % 500 +// var m100 = y / 100 +// print("잔돈: \(money)") +// print("천원지폐: \(m1000)장, 500원: \(m500)개, 100원: \(m100)개") +// }else{ +// print("구매하실 수 없습니다.") +// } +// default: +// print("오류") +// } +//} + + +//MARK: - +// +//// 조건문 예제 15, 16 자판기 문제 +//// 추가본 + +//print("금액을 입력해주세요: ", terminator: " ") +//let pay = Int(readLine()!)! +// +//func getchange(_ money: Int) -> (Int, Int, Int){ +// var t = money / 1000 +// var fh = money % 1000 / 500 +// var h = money % 1000 % 500 / 100 +// print("천원: \(t)장, 오백원: \(fh)개, 백원: \(h)개") +// return (t, fh, h) +//} +// +// +//var money = 0 +// +//if pay < 500 { +// print("구매가능한 메뉴가 없습니다.") +//}else{ +// print("메뉴를 입력해주세요.", "1. 콜라(800원)", "2. 생수(500원)", "3. 비타민워터(1500원)") +// let menu = Int(readLine()!)! +// +// switch menu { +// case 1: +// if pay > 800 { +// money = pay - 800 +// getchange(money) +// print("잔돈: \(money)") +// }else{ +// print("구매하실 수 없습니다.") +// } +// case 2: +// if pay > 500 { +// money = pay - 500 +// getchange(money) +// print("잔돈: \(money)") +// }else{ +// print("구매하실 수 없습니다.") +// } +// case 3: +// if pay > 1500 { +// money = pay - 1500 +// getchange(money) +// print("잔돈: \(money)") +// }else{ +// print("구매하실 수 없습니다.") +// } +// default: +// print("오류") +// } +//} + +//MARK: - + +//// Sring 타입의 변수 data를 선언하고 키보드로 값을 입력 받으세요 +//// switch ~ case 문 사용 + +//(다시 해보기) +//대답하는 기계 (경헌님 코드) + +//func inputLineString(_ message: String) -> String{ +// print(message, terminator: " ") +// return String(readLine()!) +//} + +////let hi = inputLineString("user:") + +//print("입력: ",terminator: "") +//let greeting = (readLine()) +// +//switch greeting { +//case "hello": +// print("mac: 네, 안녕하세요!") +//case "nice meet you.": +// print("mac: 네, 반가워요!") +//case "bye": +// print("mac: 네, 수고하세요.") +//default: +// print("mac: ?") +//} + +//MARK: - + +//// while 예제 1 +//// while문을 사용하여 키보드로부터 입력 받은 수가 10보다 작을 때만 계속 정수를 입력 받으세요. + +//var numIn = 0 +// +//while numIn < 10 { +// print("정수입력: ", terminator: "") +// numIn = Int(readLine()!)! +//} +//print("종료되었습니다.") + +//MARK: - + +//// while 에졔 2 +//// 다이어트 관리 프로그램 +//// 현재 몸무게와 목표 몸무게를 입력 받고 주차 별 감량 몸무게를 입력 받으세요 +//// 목표 몸무게를 달성하면 축하한다는 문구를 출력 하고 입력을 멈추세요! + +//print("현재 몸무게: ", terminator: "") +//var pWeight = Int(readLine()!)! +// +//print("목표 몸무게: ", terminator: "") +//let fWeight = Int(readLine()!)! +// +//var weak = 0 +// +//while pWeight > fWeight { +// weak += 1; +// print("\(weak)주차 감량 몸무게: ", terminator: "") +// var mWeight = Int(readLine()!)! +// +// pWeight = pWeight - mWeight +// +// if pWeight <= fWeight { +// break +// } +// +//} +//print("\(pWeight)kg 달성! 축하합니다!") + +//MARK: - + +//// while문 예제 3, 4번 +//// 로그인이 실패했을 경우에 계속 입력, 성공하면 종료 +//// +// +//let userID : String = "Hello" +//let password : Int = 1234 +// +//while true{ +// print("userID: ", terminator: "") +// let inputUserID = (readLine()!) +// print("password: ", terminator: "") +// let inputPassword = Int(readLine()!)! +// +// if inputUserID == userID && inputPassword == password { +// print("로그인 성공!") +// break +// }else{ +// print("아이디 또는 비밀번호가 잘못되었습니다.") +// } +//} + +//MARK: - + +////while 예제5 LOGIN 프로그램 +//// (아이디와 비밀번호가 틀렸을 경우 "계속 하시겠습니까?" 라는 문장을 출력) +// +//let userID : String = "Hello" +//let password : Int = 1234 +// +//while true{ +// print("ID를 입력해 주세요: ", terminator: "") +// let inputUserID = (readLine()!) +// print("비밀번호를 입력해 주세요: ", terminator: "") +// let inputPassword = Int(readLine()!)! +// +// if inputUserID == userID && inputPassword == password { +// print("로그인 성공!") +// break +// }else{ +// print("아이디 또는 비밀번호가 잘못되었습니다.") +// print("계속 하시겠습니까? (Y/N) : ", terminator: "") +// let answer = (readLine()!) +// if answer == "Y" { +// continue +// }else if answer == "N"{ +// break +// } +// } +//} + +//MARK: - + +//// while문 예제 6번 계산기 프로그램 +////두 정수를 입력받고 연산하기, 결과 출력 후 "계속 하시겠습니까?"를 출력 +////Yes 와 No 중, Yes면 반복문 다시실행 +// +//while true { +// print("첫 번째 정수를 입력하세요: ", terminator: "") +// let num1 = Int(readLine()!)! +// print("두 번째 정수를 입력하세요: ", terminator: "") +// let num2 = Int(readLine()!)! +// +// print("1.더하기 2.빼기 : ", terminator: "") +// let sm = Int(readLine()!)! +// +// switch sm { +// case 1: +// var sum : Int = 0 +// sum = num1 + num2 +// print("더하기 연산 결과는 \(sum)입니다.") +// case 2: +// var minus : Int = 0 +// minus = num1 - num2 +// print("빼기 연산 결과는 \(minus)입니다.") +// default: +// print("종료되었습니다.") +// } +// print("다시 실행 하시겠습니까? (Y/N) : ", terminator: "") +// let answer = String(readLine()!) +// if answer == "Y" { +// print("\n"); continue +// }else if answer == "N"{ +// break +// }else{ +// break +// } +//} + + From c3a924353aafb549ddf1d18ba7c83d063c2675dc Mon Sep 17 00:00:00 2001 From: Wegbereiterin Date: Tue, 26 Sep 2023 00:28:47 +0900 Subject: [PATCH 04/21] =?UTF-8?q?=EB=B0=95=EC=84=A0=EA=B5=AC=2023.09.25?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- lecture/23.09.25.swift | 506 +++++++++++++++++++++++++++++++++++++++++ 1 file changed, 506 insertions(+) create mode 100644 lecture/23.09.25.swift diff --git a/lecture/23.09.25.swift b/lecture/23.09.25.swift new file mode 100644 index 0000000..7b79837 --- /dev/null +++ b/lecture/23.09.25.swift @@ -0,0 +1,506 @@ +// Created by 박선구 on 2023/09/25. + +import Foundation + +//MARK: - + +//MARK: 랜덤숫자게임 + +//var fn = Int.random(in: 0...20) +//var sn = Int.random(in: 0...20) +//var sum = fn + sn +// +//print("== Plus Game ==") +// +//print("\(fn) + \(sn) = ", terminator: "") +//let num = Int(readLine()!)! +// +//if sum == num { +// print("Success!") +//}else{ +// print("Fail!") +//} + +//MARK: - + +//MARK: 랜덤숫자 게임 7-1 + + + +// var fn = Int.random(in: 0...20) +// var sn = Int.random(in: 0...20) +// var sum = fn + sn +// +// print("== Plus Game ==") +// +//while true{ +// print("\(fn) + \(sn) = ", terminator: "") +// let num = Int(readLine()!)! +// +// if sum == num { +// print("Success!") +// print("계속 하시겠습니까? (Y/N): ", terminator: "") +// let play = readLine() +// if play == "N" { +// break +// } +// }else{ +// print("Fail!") +// print("계속 하시겠습니까? (Y/N): ", terminator: "") +// let play = readLine() +// if play == "N" { +// break +// } +// } +//} +//MARK: - + +//MARK: 랜덤숫자게임 7-2 (다시하기) + +//while true { +// var fn = Int.random(in: 0...20) +// var sn = Int.random(in: 0...20) +// var sum = fn + sn +// +// print("== Plus Game ==") +// +// print("\(fn) + \(sn) = ", terminator: "") +// let num = Int(readLine()!)! +// +// switch sum == num { +// case true : print("Success!") +// print("계속 하시겠습니까? (Y/N): ", terminator: "") +// let play = readLine() +// if play == "Y" { +// break +// } +// case false : print("Fail!") +// print("계속 하시겠습니까? (Y/N): ", terminator: "") +// let play = readLine() +// if play == "Y" { +// print("\(fn) + \(sn) = ", terminator: "") +// let num = Int(readLine()!)! +// }else { +// break +// } +// } + +// if sum == num { +// print("Success!") +// }else{ +// print("Fail!") +// } +// print("계속 하시겠습니까? (Y/N): ", terminator: "") +// let play = readLine() +// +// if play == "Y" { +// print("\n") +// continue +// }else{ +// break +// } +//} + + +//MARK: - + +//MARK: 랜덤숫자게임 7-2 + +//while true { +// var fn = Int.random(in: 0...20) +// var sn = Int.random(in: 0...20) +// var sum = fn + sn +// +// print("== Plus Game ==") +// +// print("\(fn) + \(sn) = ", terminator: "") +// let num = Int(readLine()!)! +// +// if sum == num { +// print("Success!") +// }else{ +// print("Fail!") +// } +// print("계속 하시겠습니까? (Y/N): ", terminator: "") +// let play = readLine() +// +// if play == "Y" { +// print("\n") +// continue +// }else{ +// break +// } +//} + +//MARK: - + +//MARK: for 문 00 +// +//for i in 53...96 { +// print(i) +//} + +//for 문 00-1 + +//let j = 21...57 +// +//for a in j where a % 2 != 0{ //where를 이용하여 조건을 넣는다. +// print(a) +//} +// + +//for 문 00-2 + + +//1~100까지 3의 배수의 합을 출력하세요. (1683) +//var num = 0 +//for i in 1...100 { +// if i % 3 == 0 { +// num += i +// } +//} +//print(num) + + +//MARK: - + + +//MARK: for 문 3 + +//for i in 1...9 { +// print("2 * \(i) = \(2 * i)") +//} + +//MARK: - + +//MARK: for 문 한 개의 자연수를 입력 받아 그 수의 배수를 차례로 10개 출력하는 프로그램을 작성하시오. + +//print("정수 입력: ", terminator: "") +//let num = Int(readLine()!)! +// +//var a = 1...10 +// +//for i in 1...10 { +// print("\(num * i)") +//} + +//MARK: - + +//let j = 21...57 +// +//for a in j where a % 2 != 0{ //where를 이용하여 조건을 넣는다. +// print(a) +//} +// +//for i in 21...57 { +// if i % 2 != 0 { +// print(i) +// } +//} + +//MARK: - + +//print("정수입력: ", terminator: "") +//let num = Int(readLine()!)! +// +//for i in 1...num { +// print(i) +//} + +//MARK: - + +//MARK: for문 예제 4 + +//print("정수 입력: ", terminator: "") +//let number = Int(readLine()!)! +// +//for a in 1...9{ +// print("\(number) * \(a) = \(number * a)") +//} + + +//MARK: - + +//MARK: for문 예제 5 + +//for a in 2...9{ +// print("\n===\(a)단===") +// for i in 1...9 { +// print("\(a) * \(i) = \(a * i)") +// } +//} + +//MARK: - + +//MARK: for문 예제 6 +// +//for a in 2...9{ +// print("\n\(a)단: ", terminator: "") +// for i in 1...9 { +// print("\(a) * \(i) = \(a * i) ", terminator: " ") +// } +//} + +//MARK: - + +//MARK: for문 예제 7 + +//print("정수입력: ", terminator: "") +//let number = Int(readLine()!)! +// +//print("\(number)의 약수 : ", terminator: "") +//for q in 1...number { +// if number % q == 0 { +// print("\(q)", terminator: " ") +// if q == number { +// print("\n") +// } +// } +//} + +//MARK: - + +//MARK: for문 예제 8 + +//for i in 2...30 { +// print("\n\(i)의 약수: ", terminator: "") +// for a in 1...30 { +// if i % a == 0 { +// print(a ,terminator: " ") +// if a == 30 { +// print("\n") +// } +// } +// } +//} + +//MARK: - + +//MARK: for 예제 9-1 +// +//var p = 0 +// +//for _ in 1...5{ +// print("") +// p += 1 +// for i in 1...p { +// print("*", terminator: "") +// if i == 5 { +// print("\n") +// } +// } +//} + +//MARK: - + +//MARK: for문 예제 9-2 +// +//var p = 5 +// +//for some in 1...5{ +// print("") +// p -= 1 +// for _ in 0...p { +// print("*", terminator: "") +// if some == 5 { +// print("\n") +// } +// } +//} + +//MARK: - + +//MARK: for문 예제 9-3 +// +//var o = 5 +//var p = 0 +//var k = 1...6 +// +//for some in k{ +// print("") +// p += 1 +// o -= 1 +// for _ in 0...o { +// print(" ", terminator: "") +// } +// for _ in 1...p { +// print("*", terminator: "") +//// if some == 5 { +//// print("\n") +//// } +// } +//} + + +//MARK: - +//MARK: 별찍기 1 (수정) + +// +//for i in (1...5).reversed() { +// print("") +// for _ in 1...i{ +// print("*", terminator: "") +// } +// for _ in 1...i{ +// print(" ", terminator: "") +// } +//} +//MARK: - +//MARK: 별찍기 2 (수정) + +//for i in (1...5).reversed() { +// print("") +// for _ in 1...i{ +// print("*", terminator: "") +// } +// for _ in 1...i{ +// print(" ", terminator: "") +// } +//} + +//MARK: - +//MARK: 별찍기3 (수정) + +//for i in (1...5).reversed() { +// print("") +// for _ in 1...i{ +// print(" ", terminator: "") +// } +// for _ in i...5{ +// print("*", terminator: "") +// } +//} + +//MARK: - +//MARK: 별찍기 다이아 (수정) + +//for i in (1...5).reversed(){ +// print("") +// for _ in 1...i{ +// print(" ", terminator: "") +// } +// for _ in i...5{ +// print("*", terminator: "") +// } +// for _ in i...5{ +// print("*", terminator: "") +// } +//} +// +//for i in 1...5 { +// print("") +// for _ in 1...i{ +// print(" ", terminator: "") +// } +// for _ in (i...5).reversed() { +// print("*", terminator: "") +// } +// for _ in i...5 { +// print("*", terminator: "") +// } +// +//} +//print("\n") + + +//MARK: - + +//MARK: 369 게임 (다시하기) + +//for i in 0...99{ +// print(i) +// while i % 3 == 0 { +// print("*") +// }break +//} + +//MARK: - +// 창준님 코드 + +//func forExercise10() { +// for num in 0...99 { +// var strNum = String(format: "%02d", num) +// var tmp = "" +// for s in strNum { +// if let intS = Int(String(s)), intS != 0, intS % 3 == 0 { +// tmp += "*" +// } +// } +// strNum += tmp +// tmp = "" +// print(strNum) +// } +//} + +//MARK: - + +// 경헌님 코드 + +for i in 0...9 { + for j in 0...9 { + // 여기서 부터 + print("\(i)\(j)", terminator: "") + var cnt = 0 + if (i != 0 && i % 3 == 0) { + cnt += 1 + } + + if (j != 0 && j % 3 == 0) { + cnt += 1 + } + + for _ in 0.. Date: Tue, 26 Sep 2023 22:17:59 +0900 Subject: [PATCH 05/21] :memo:230926 --- lecture/23.09.26.swift | 320 +++++++++++++++++++++++++++++++++++++++++ 1 file changed, 320 insertions(+) create mode 100644 lecture/23.09.26.swift diff --git a/lecture/23.09.26.swift b/lecture/23.09.26.swift new file mode 100644 index 0000000..14e2dc5 --- /dev/null +++ b/lecture/23.09.26.swift @@ -0,0 +1,320 @@ +// Created by 박선구 on 2023/09/25. + +import Foundation + + +//MARK: - +//MARK: 09/26 +//MARK: 369게임 + +//for cnt in 0..<100 { //cnt는 count의 줄임말 +// let a = cnt / 10 //10의 자리 +// let b = cnt % 10 //1의 자리 +// print("\(a)\(b)", terminator: "") +// +// if (a % 3 == 0) && (a != 0){ //10의 자리 a가 3의 배수일 경우 +// print("*", terminator: "") +// } +// if (b % 3 == 0) && (b != 0){ //1의 자리 b가 3의 배수일 경우 +// print("*", terminator: "") +// } +// print() +//} + +//MARK: - +//MARK: 함수예제 1 + +//func addNumber(fm : Int, sm : Int) -> Int { +// fm + sm +//} +// +// +//print("1번째 수: ", terminator: "") +//var a = Int(readLine()!)! +//print("2번째 수: ", terminator: "") +//var b = Int(readLine()!)! +// +//print("연산결과: \(addNumber(fm: a, sm: b))") + +//MARK: - +//MARK: 함수예제 2 + +//func largerNumbers(fm : Int, sm : Int) { +// if fm > sm { +// return print("결과확인: ",fm) +// }else if fm == sm{ +// return print("0") +// }else { +// return print("결과확인: ",sm) +// } +//} +// +//print("1번째 수: ", terminator: "") +//let a = Int(readLine()!)! +//print("2번째 수: ", terminator: "") +//let b = Int(readLine()!)! +// +//largerNumbers(fm: a, sm: b) + +//MARK: - +//MARK: 함수예제 2 (강사님ver) + +//func largerNumbers (a: Int , b: Int) -> Int{ +// if a == b { +// return 0 +// } +// return a > b ? a : b +//} +// +//print("1번째 수: ", terminator: "") +//let a = Int(readLine()!)! +//print("2번째 수: ", terminator: "") +//let b = Int(readLine()!)! +// +//let c = largerNumbers(a: a, b: b) +//print("큰 수 확인: \(c)") + +//MARK: - +//MARK: 함수예제 3 + +//func close10(num1 : Int, num2 : Int) { +// if abs(10 - num1) > abs(10 - num2) { +// return print("10에 가까운 수: \(num2)") +// }else if abs(10 - num1) == abs(10 - num2) { +// return print("10에 가까운 수: 0") +// }else{ +// return print("10에 가까운 수: \(num1)") +// } +//} +// +//print("1번째 수: ", terminator: "") +//let a = Int(readLine()!)! +//print("2번째 수: ", terminator: "") +//let b = Int(readLine()!)! +// +//close10(num1: a, num2: b) + +//MARK: - +//MARK: 함수예제 4 + +//func powerN(base: Int, n: Int) { +// var result = 0 +// +// result = Int(pow(Float(base), Float(n))) //pow = 제곱 +// return print("결과 확인: \(result)") +//} +// +//print("1번째 수: ", terminator: "") +//let a = Int(readLine()!)! +//print("2번째 수: ", terminator: "") +//let b = Int(readLine()!)! +// +//powerN(base: a, n: b) + +//MARK: - +//MARK: 함수예제 5 + +//func getAbsoluteValue(num1 : Int, num2 : Int) { +// var result = 0 +// result = num1 - num2 +// return print("결과 확인: \(abs(result))") +//} +// +//print("1번째 수: ", terminator: "") +//let a = Int(readLine()!)! +//print("2번째 수: ", terminator: "") +//let b = Int(readLine()!)! +// +//getAbsoluteValue(num1: a, num2: b) + +//MARK: - +//MARK: 함수예제: 6 +//두 개의 정수를 인자(매개변수)로 넘겨받아 앞의 정수가 뒤의 정수로 나누어지는지를 판별하는 isDivide( ) 를 작성하세요. + +//func isDivide(a : Int, b : Int) -> Bool{ +// if b == 0{ +// return false +// } +// return (a % b == 0) +//} +//print("1번째 수: ", terminator: "") +//let a = Int(readLine()!)! +//print("2번째 수: ", terminator: "") +//let b = Int(readLine()!)! +// +//let c : Bool = isDivide(a: a, b: b) + + +//MARK: - +//MARK: 함수예제 7 (보충필요) +//약수를 구하는 getDivisor() 를 구현하세요 + +//func getDivisor(num : Int) { +// print("\(num)의 약수: ", terminator: "") +// for q in 1...num { +// if num % q == 0 { +// print("\(q)", terminator: " ") +// if q == num { +// print("\n") +// } +// } +// } +//} +// print("정수입력: ", terminator: "") +// let a = Int(readLine()!)! +// +// getDivisor(num: a) +// +// +// +//MARK: - +//MARK: 함수예제 7 (강사님ver) + +//func getDivisor (a: Int) -> String { +// var str = "\(a)의 약수: " +// for i in 1...a { +// if isDivide(a: a, b: i) { +// str += "\(i) " +// } +// } +// return str +//} +// +//print("정수 입력: ", terminator: "") +//let a = Int(readLine()!)! +// +//let c: String = getDivisor(a: a) +//print(c) + +//MARK: - +//MARK: 함수예제 8 (강사님Ver) +//func getSumofDivisors(a: Int) -> Int { +// var sum = 0 +// for i in 1...a { +// if isDivide(a: a, b: i) { +// sum += i +// } +// } +// return sum +//} + +//let a: Int = 10 +// +//let c: Int = getSumofDivisors(a: a) +//print("\(a)의 약수의 합: \(c)") + +//MARK: - +//MARK: 함수예제 9 (보충필요) +//startValue...endValue까지의 숫자 중 완전수를 출력하는 getPerfectNumber() 를 구현하세요 +//완전수 = 자신을 제외한 약수들의 합이 자신인 것 +// +//let a: Int = 100 +//let b: Int = 41 +// +//var str = "" +//for i in 2...1000{ +// let c: Int = getSumofDivisors(a: i) +// if c - a == a{ +// str += "\(i) " +// } +//} +//print(str) + +//MARK: - +//MARK: 함수예제 10 + +//권지원님 코드 +//func getPrimeNumber(first: Int, last: Int) { +// print("\(first)~\(last)까지의 소수: " ,terminator: "") +// for i in first...last { +// var result = "F" +// if i == 2 { +// +// } else { +// for j in 2...(i-1) { +// if i % j == 0 { +// result = "T" +// break +// } +// } +// } +// if result == "F" { +// print(i, terminator: " ") +// } +// } +// print() +//} +// +//getPrimeNumber(first: 2, last: 30) + +//MARK: - +//MARK: 클래스 + +//class piggbank { +// var bank = 0 +// func inputMoney(money: Int) -> Int { //입금 +// showMoney() +// if money > 0 { +// bank += money +// return bank +// }else{ +// return bank +// } +// } +// func outputMoney(bMoney: Int) -> String { //출금 +// showMoney() +// if bMoney > 0 && bank > bMoney{ +// bank -= bMoney +// return String(bank) +// }else if bank < bMoney{ +// return "잔액이 부족합니다." +// }else{ +// return String(0) +// } +// } +// func showMoney(){ //현재 잔액 +// print("현재 잔액: \(bank)") +// } +//} +// +//let a : Int = 15000 +//let b : Int = 9000 +// +//let myBank = piggbank() +//print("입금:\(a), 현재잔액: \(myBank.inputMoney(money: a))\n") +//print("출금:\(b), 현재잔액: \(myBank.outputMoney(bMoney: b))\n") + +//MARK: - +//MARK: 객체를 이용하여 입력된 학생의 정보를 출력하기 + +//let student1 = Student(name: "홍길동", number: "20200677", age: 22, scoreSwift: 50, scoreiOS: 89, scoreWeb: 77) +//let student2 = Student(name: "김영희", number: "20190541", age: 26, scoreSwift: 90, scoreiOS: 85, scoreWeb: 70) +// +//class Student { +// var name: String +// var number: String +// var age: Int +// var scoreSwift: Int +// var scoreiOS: Int +// var scoreWeb: Int +// +// init(name: String, number: String, age: Int, scoreSwift: Int, scoreiOS: Int, scoreWeb: Int) { +// self.name = name +// self.number = number +// self.age = age +// self.scoreSwift = scoreSwift +// self.scoreiOS = scoreiOS +// self.scoreWeb = scoreWeb +// } +// func show() { +// print("\(name)님 안녕하세요") +// print("[ \(number), \(age)살 ]") +// print("\(name)님의 Swift 점수는 \(scoreSwift)점 입니다.") +// print("\(name)님의 iOS 점수는 \(scoreiOS)점 입니다.") +// print("\(name)님의 Web 점수는 \(scoreWeb)점 입니다.") +// print("=======================================\n") +// } +//} +// +//student1.show() +//student2.show() From 58d1dcbd8da3d1265951f338c4c5933abf10f9fa Mon Sep 17 00:00:00 2001 From: SeonKoo Date: Thu, 28 Sep 2023 03:15:22 +0900 Subject: [PATCH 06/21] =?UTF-8?q?:memo:=200927=20=EC=98=A4=EB=8A=98?= =?UTF-8?q?=EA=B9=8C=EC=A7=80=20=ED=95=9C=EA=B2=83?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- lecture/23.09.27.swift | 383 +++++++++++++++++++++++++++++++++++++++++ 1 file changed, 383 insertions(+) create mode 100644 lecture/23.09.27.swift diff --git a/lecture/23.09.27.swift b/lecture/23.09.27.swift new file mode 100644 index 0000000..02b30f6 --- /dev/null +++ b/lecture/23.09.27.swift @@ -0,0 +1,383 @@ +// Created by 박선구 on 2023/09/27. + +import Foundation + + +//MARK: - +//MARK: 0927 +//MARK: 객체지향 class 예제 1 (강사님 ver) +// 예제 1번 + +class Student { + var name: String = "" + var number: String = "" + var age: Int = 0 + var scoreSwift: Int = 0 + var scoreiOS: Int = 0 + var scoreWeb: Int = 0 + + func show() -> String{ + return "\(name)" + } +} + +//예제 2번 +let student1: Student = Student() +student1.name = "홍길동" +student1.number = "20200677" +student1.age = 22 +student1.scoreSwift = 50 +student1.scoreiOS = 89 +student1.scoreWeb = 77 + +let student2: Student = Student() +student2.name = "김영희" +student2.number = "20190541" +student2.age = 26 +student2.scoreSwift = 90 +student2.scoreiOS = 85 +student2.scoreWeb = 70 + +//예제 3번 +//print(student1.show()) +//print("=============") +//print(student2.show()) + + +//MARK: - +//MARK: class 예제 4 (강사님 ver) + +class Person { + private var name : String //private 외부에서 변수에 접근하는것을 방지 (접근제한자) + private var age : Int + + init() { //default값을 만들어보기 (오버로딩) + name = "이름없음" + age = 0 + } + + init(name: String, age: Int) { + self.name = name + self.age = age + } + + func getName() -> String { + return name + } + + func setName(name: String) { + self.name = name + } + func getAge() -> Int{ + return age + } + func setAge(age: Int) { + self.age = age + } + func show() -> String{ + return "이름: \(name), 나이: \(age)" + } +} + +//예제 4-1 +let st0 = Person() //Default값 (오버로딩) +let st1 = Person(name: "홍길동", age: 25) //init을 사용했기 때문에 따로 초기화를 해줘야 한다. +let st2 = Person(name: "김영희", age: 27) + +//print("(st1 객체 학생) \(st1.show())") +//print("(st2 객체 학생) \(st2.show())") +//print("(st 객체 학생) \(st0.show())") + +//MARK: - +//예제 5 + + + +//MARK: class 예제 5-1 (강사님 ver) + +class Calculator { + var num1 : Int + var num2 : Int + init() { + num1 = 0 + num2 = 0 + } + init(num1: Int, num2: Int) { + self.num1 = num1 + self.num2 = num2 + } + func sum() -> Int { + return num1 + num2 + } + func sub() -> Int{ + return num1 - num2 + } + func div() -> Int{ + return num1 / num2 + } + func mul() -> Int{ + return num1 * num2 + } + func setNum1(num1: Int) { + self.num1 = num1 + } + func setNum2(num2: Int) { + self.num2 = num2 + } +} + +let cal = Calculator(num1: 2, num2: 7) +cal.setNum1(num1: 10) +cal.setNum2(num2: 20) +let sum : Int = cal.sum() +let c = cal.sub() +//print(sum, c, cal.mul(), cal.div()) + +//MARK: - +//MARK: class 예제 06 + +class TV { + var name: String + var year: Int + var size: Int + + init(name: String, year: Int, size: Int) { + self.name = name + self.year = year + self.size = size + } + + func show() -> String{ + return "\(name)에서 만든 \(year)년형 \(size)인치 TV" + } +} + +let myTv = TV(name: "LG", year: 2023, size: 48) +//print(myTv.show()) + +//MARK: - +//MARK: class 별찍기 + +class makeStar { + func reverStar() { + for i in (1...10).reversed(){ + print("") + for _ in 1...i{ + print(" ", terminator: "") + } + for _ in i...10{ + print("*", terminator: "") + } + for _ in i...10{ + print("*", terminator: "") + } + } + } + func Star() { + for i in 1...10 { + print("") + for _ in 1...i{ + print(" ", terminator: "") + } + for _ in i...10 { + print("*", terminator: "") + } + for _ in i...10 { + print("*", terminator: "") + } + + } + } +} + +let star = makeStar() +//star.reverStar() +//star.Star() +//print("\n") + +//MARK: - +//MARK: class 별찍기 (강사님 ver) +class Shape { + var size : Int = 1 + + init(size: Int) { + self.size = size + } + + func printShape(start: Int, end: Int, shape: String) -> String{ + var result: String = "" + for _ in start...end { + result += shape + } + return result + } + func drawShape() -> String{ + var str = "" + for i in 1...size { + str = printShape(start: 1, end: i, shape: "*") + "\n" + } + return str + } + + func invdrawShape() -> String { + var str = "" + for i in (1...size).reversed() { + str = printShape(start: 1, end: i, shape: "*") + "\n" + } + return str + } +} + +let shape = Shape(size: 10); +//print(shape.drawShape() + shape.invdrawShape()) + +//MARK: - +//MARK: 배열 + +var items = [8,9,10,11,12,15] //배열 생성 + +var sumItems = 0 +for i in items { //items의 전체 합 + sumItems += i +} + +print(sumItems) + +//배열 인덱스의 항목위치를 참조하여 접근 +items[0] = 10 //0번째 배열에 10넣기 +print("0번째 인덱스의 값은: ",items[0]) //0번째 + +//문자열을 갖는 배열 +var strArray: [String] = ["nice", "to", "meet", "you"] + + +//빈배열 생성 +//var 변수명: [타입] = [] +//var 변수명 = [타입]() + + +//기본값과 크기를 미리 설정하여 초기화 +var nameArray = [String](repeating: "no Name", count: 10 ) +print("nameArray 배열 항목 개수: ",nameArray.count) +print("nameArray 빈배열인가?: ",nameArray.isEmpty) + +// 배열을 결합하여 새로운 배열 생성 : 같은 타입이라고 가정 +print(strArray + nameArray) + +// 배열 항목 섞기 +let shuffledArray = strArray.shuffled() +print(strArray) //섞기 전 +print(shuffledArray) //섞은 후 + +//배열 항목 무작위 접근 +print(strArray.randomElement()!) + +//배열에 항목 추가하기 +strArray.append("PLEASE") +print(strArray) + +strArray += ["HEY", "What"] +print(strArray) + +// 배열 항목을 특정 위치에 추가 +strArray.insert("jkl", at: 0) +print("strArray의 0번째 위치에 jkl 추가:", strArray) + +// 배열 항목 삭제 +// 배열 인덱스 위치에서 삭제 +print( strArray.remove(at: 0) ) +print("strArray의 0번째 위치 항목 삭제:", strArray) + +// 배열 마지막 항목 삭제 +print( strArray.removeLast() ) + +// 배열 모두 삭제 +print( strArray.removeAll() ) +print( strArray ) +print("=====================\n") + + +//MARK: - +//MARK: 배열예제 1 +var array : [Int] = [1,2,3,4,5,6,7,8,9,10] + +for _ in 1...10 { + let a = Int.random(in: 0...9) + let b = Int.random(in: 1...20) + array[a] = b +} +print(array) //4번째와 9번째의 합 +print(array[4] + array[9]) + +var sumArray = 0 +for i in array { //array의 전체 합 + sumArray += i +} +print(sumArray) + +var avg: Float = Float(sumArray) / 10 +print(avg) + +//MARK: - +//MARK: 배열 예제 2 +//배열의 값 중 짝수인 값이 몇 개인지 출력하는 프로그램을 작성하세요 + +//var p = array[0] % 2 +//var result = [Int]() +// +//for i in 0...9{ +// p = array[i] % 2 +// if p == 0 { +// result.append(array[i]) +// } +//} +//print("array에 들어있는 짝수는 \(result)입니다.") + +//MARK: - +//MARK: 배열 예제 3 +//배열의 값 중 홀수인 값이 몇 개인지 출력하는 프로그램을 작성하세요 + +var p = array[0] % 2 +var result = [Int]() + +for i in 0...9{ + p = array[i] % 2 + if p != 0 { + result.append(array[i]) + } +} +print("array에 들어있는 홀수는 \(result)이며, 총 \(result.count)개 입니다.") + + +//MARK: - +//MARK: 배열 예제 4 +//배열의 값 중 가장 큰 값을 찾아 출력하는 프로그램을 작성하세요 + +let maxArray = array.max()! //max는 배열안에 있는 값중 최댓값을 찾는다. +print("가장 큰 값은 \(maxArray)입니다.") + +//MARK: - +//MARK: 배열 예제 5 +//배열의 값 중 가장 작은 값을 찾아 출력하는 프로그램을 작성하세요 + +let minArray = array.min()! //min은 배열안에 있는 값중 최솟값을 찾는다. +print("가장 작은 값은 \(minArray)입니다.") + +//MARK: - +//MARK: 배열 예제 6 (다시하기) +//숫자를 입력받아 짝수인 4의 경우 “수박수박”, 홀수인 3의 경우 “수박수“ 를 출력하는 프로그램을 작성하세요 + +//var stArray : [String] = ["수","박"] +// +//print("숫자를 입력해주세요: ", terminator: "") +//let number = Int(readLine()!)! +// +////number == 4, stArray[0] +// +// +//for _ in 1...number { +// if number % 2 == 0 { +// var stArraySum = stArray[2] + strArray[1] +// print(stArraySum) +// } +//} From 9a017b3f790d7137de1355073cc042e713641800 Mon Sep 17 00:00:00 2001 From: SeonKoo Date: Thu, 28 Sep 2023 03:24:40 +0900 Subject: [PATCH 07/21] :wrench: clean --- {cv => resume/cv}/codelion.css | 0 {cv => resume/cv}/index.html | 0 {ds => resume/ds}/codelion.css | 0 {ds => resume/ds}/index.html | 0 index.html.rtf => resume/index.html.rtf | 0 5 files changed, 0 insertions(+), 0 deletions(-) rename {cv => resume/cv}/codelion.css (100%) rename {cv => resume/cv}/index.html (100%) rename {ds => resume/ds}/codelion.css (100%) rename {ds => resume/ds}/index.html (100%) rename index.html.rtf => resume/index.html.rtf (100%) diff --git a/cv/codelion.css b/resume/cv/codelion.css similarity index 100% rename from cv/codelion.css rename to resume/cv/codelion.css diff --git a/cv/index.html b/resume/cv/index.html similarity index 100% rename from cv/index.html rename to resume/cv/index.html diff --git a/ds/codelion.css b/resume/ds/codelion.css similarity index 100% rename from ds/codelion.css rename to resume/ds/codelion.css diff --git a/ds/index.html b/resume/ds/index.html similarity index 100% rename from ds/index.html rename to resume/ds/index.html diff --git a/index.html.rtf b/resume/index.html.rtf similarity index 100% rename from index.html.rtf rename to resume/index.html.rtf From 693ee2a26253ab4c8e4daa3f63e31cff42096d38 Mon Sep 17 00:00:00 2001 From: SeonKoo Date: Fri, 29 Sep 2023 02:47:04 +0900 Subject: [PATCH 08/21] :hammer: update 0929 --- lecture/23.09.27.swift | 118 +++++++++++++++++++++++++++++++++++------ 1 file changed, 103 insertions(+), 15 deletions(-) diff --git a/lecture/23.09.27.swift b/lecture/23.09.27.swift index 02b30f6..4954c01 100644 --- a/lecture/23.09.27.swift +++ b/lecture/23.09.27.swift @@ -298,24 +298,33 @@ print("=====================\n") //MARK: - -//MARK: 배열예제 1 -var array : [Int] = [1,2,3,4,5,6,7,8,9,10] +//MARK: 배열 예제 1 -for _ in 1...10 { +// 1.정수형 데이터를 담을 수 있는 배열 array를 선언하세요 +// 2.정수형 데이터 10개를 담을 수 있도록 array배열을 생성하세요 +// 3.각각의 인덱스에 1~20까지의 랜덤수를 초기화하세요 +// 4.배열array의 각각에 인덱스에 들어있는 모든 데이터를 출력하세요. +// 5.4번째 인덱스에 들어있는 값과 9번째 인덱스에 들어있는 값을 더하여 결과 값을 출력하세요 +// 6.각각의 인덱스에 들어있는 데이터를 모두 더하여 결과 값을 출력하세요 +// 7.배열 안에 있는 수의 평균을 구하여 출력하세요 + +var array : [Int] = [1,2,3,4,5,6,7,8,9,10] //1,2 + +for _ in 1...10 { //3 let a = Int.random(in: 0...9) let b = Int.random(in: 1...20) array[a] = b } -print(array) //4번째와 9번째의 합 -print(array[4] + array[9]) +print(array) //4 +print(array[4] + array[9]) //4번째와 9번째의 합 //5 var sumArray = 0 -for i in array { //array의 전체 합 +for i in array { //array의 전체 합 //6 sumArray += i } print(sumArray) -var avg: Float = Float(sumArray) / 10 +var avg: Float = Float(sumArray) / 10 //7 print(avg) //MARK: - @@ -328,7 +337,7 @@ print(avg) //for i in 0...9{ // p = array[i] % 2 // if p == 0 { -// result.append(array[i]) +// result.append(array[i]) //append = 배열 항목 추가 // } //} //print("array에 들어있는 짝수는 \(result)입니다.") @@ -364,20 +373,99 @@ let minArray = array.min()! //min은 배열안에 있는 값중 최솟값을 찾 print("가장 작은 값은 \(minArray)입니다.") //MARK: - -//MARK: 배열 예제 6 (다시하기) +//MARK: 배열 예제 6 (다시해보기) //숫자를 입력받아 짝수인 4의 경우 “수박수박”, 홀수인 3의 경우 “수박수“ 를 출력하는 프로그램을 작성하세요 //var stArray : [String] = ["수","박"] -// +//print("=== 수박 게임 시작! ===") //print("숫자를 입력해주세요: ", terminator: "") //let number = Int(readLine()!)! // -////number == 4, stArray[0] +//var resArr = "" +// +//for i in 1...number { +// let indexArray = (i - 1) % 2 // 짝수면 0 홀수면 1 저장 +// resArr += stArray[indexArray] // +//} +//print(resArr) + +//MARK: - +//MARK: 배열 예제 7 +//1차원 정수형 배열을 선언한 후 10개의 공간으로 생성합니다 +//숫자를 입력 받아 3의 배수인 숫자를 출력하는 프로그램을 작성하세요 + +//var array7 = [Int](repeating: 0, count: 10) +//var result7 = [Int]() +// // +//for i in 1...10{ +// print("\(i)번째 정수 입력: ", terminator: "") +// let inputNum = Int(readLine()!)! +// array7.remove(at: i-1) +// array7.insert(inputNum, at: i-1) // -//for _ in 1...number { -// if number % 2 == 0 { -// var stArraySum = stArray[2] + strArray[1] -// print(stArraySum) +// var num7 = array7[i-1] % 3 +// if num7 == 0{ +// result7.append(array7[i-1]) // } //} +// +//print("3의 배수:", terminator:" ") +//for j in result7 { +// print(j, terminator:" ") +//} +////print("3의 배수: \(result7.map {String($0)}.joined(separator: " "))") //또 다른 방법 + +//MARK: - +//MARK: 배열 예제 8 +//다음과 같이 정답이 있을 때 사용자로부터 답을 입력받아 결과를 출력하고 총점을 출력하는 프로그램을 작성하세요 + +//var answer8 : [Int] = [1, 1, 4, 2, 3] +//var myAnswer = [Int]() +//var point = 0 +// +//for i in 1...5{ +// print("\(i)번답: ", terminator: "") +// myAnswer.insert(Int(readLine()!)!, at: i-1) +//} +// +//for j in 1...5{ +// if answer8[j-1] == myAnswer[j-1] { +// print("O", terminator: " ") +// point += 20 +// }else{ +// print("X", terminator: " ") +// } +// if j == 5{ +// print("총점: \(point)") +// } +//} + +//MARK: - +//MARK: 배열 예제 9 +//배열의 (인덱스) 값 만큼 별을 출력해보세요 + +//var array9 : [Int] = [1,2,3,2,1] +var array9 = [Int]() + +print("입력 횟수: ", terminator: "") +let inputNum = Int(readLine()!)! + +for _ in 1...inputNum{ + print("별의 갯수 입력: ", terminator: "") + let stars = Int(readLine()!)! + array9.append(stars) +} + +for i in 1...array9.count { + print("") + print("\(array9[i-1]): ", terminator: "") + if array9[i-1] != 0 { + for _ in 1...array9[i-1] { + print("*", terminator: "") + } + } + if i >= array9.count { + print("\n") + } +} From eae59f6b12c8a45e9907173f948df2b2d89dad9b Mon Sep 17 00:00:00 2001 From: SeonKoo Date: Sat, 30 Sep 2023 02:11:00 +0900 Subject: [PATCH 09/21] :rewind: 0929 --- studyReview/main.swift | 82 ++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 82 insertions(+) create mode 100644 studyReview/main.swift diff --git a/studyReview/main.swift b/studyReview/main.swift new file mode 100644 index 0000000..99b4739 --- /dev/null +++ b/studyReview/main.swift @@ -0,0 +1,82 @@ +// +// main.swift +// studyReview +// +// Created by 박선구 on 2023/09/30. +// + +import Foundation + +//연산자 예제 1번 + +//let num1 = 7 +//let num2 = 3 +// +//print("더하기 결과: \(num1 + num2)") +//print("빼기 결과: \(num1 - num2)") +//print("곱하기 결과: \(num1 * num2)") +//print("나누기 결과: \(num1 / num2)") +//print("나머지 구하기: \(num1 % num2)") //+ + +//MARK: - +//MARK: 연산자 예제 2 +//변수 num 값 중에서 백의 자리 이하를 버리는 코드이다. 만일 변수 num의 값이 456이라며 400이 되고, 111이라면 100이 된다. + +//let num1: Int = 925 +// +//var result = (num1 / 100) * 100 +//print(result) + +//MARK: - +//MARK: 연산자 예제 3 +//제주도에 다녀온 김모 씨는 3,729개의 귤을 샀다. 김모 씨는 주위 사람들에게 귤을 나눠주려고 하는데 너무 많아서 문제가 생겼습니다. +//김모씨는 귤을 한 사람당 52개씩 박스에 담아서 나눠주려고 합니다. +//김모씨가 사람들에게 줄 수 있는 박스의 수와 남은 귤 갯수를 구해보세요. + +//let orange = 3729 +//let box = 52 +// +//var result = orange / box +//print("나누어 줄 수 있는 박스의 수: ",result) +//result = orange % box +//print("남은 귤 갯수: ",result) + +//MARK: - +//MARK: 연산자 예제 4 +//변수 num 값 중에서 일의 자리를 1로 바꾸는 코드이다. 만일 변수 num의 값이 456 이라면 451이 되고, 777이라면 771이 된다. + +//print("정수를 입력해주세요: ",terminator: "") +//let num = Int(readLine()!)! +// +//var result1 = ((num / 10) * 10) + 1 +//print("\(result1)") + +//MARK: - +//MARK: 연산자 예제 5 +//Swift, iOS, Web 점수를 키보드로 부터 입력 받아 합계와 평균을 출력하세요 + +//print("Swift 점수: ",terminator: "") +//let swiftScore = Int(readLine()!)! +//print("iOS 점수: ",terminator: "") +//let iOSScore = Int(readLine()!)! +//print("Web 점수: ",terminator: "") +//let WebScore = Int(readLine()!)! +// +//var sum = swiftScore + iOSScore + WebScore +//var avg = Float(sum) / 3 +//print("점수 합계: \(sum)\n평균: \(avg)") + +//MARK: - +//MARK: 연산자 예제 6 +//초를 입력 받아 [시, 분, 초] 형태로 출력하세요. + +print("초 입력: ", terminator: "") +let t = Int(readLine()!)! + +var m = (t/60) % 60 +var h = (t/60)/60 +var s = (t%60) +print("\(h)시간 \(m)분 \(s)초") + +//MARK: - +//MARK: 연산자 예제 7 From c612bd5b7797fed4449ce10fe53e423df7a3ce28 Mon Sep 17 00:00:00 2001 From: SeonKoo Date: Mon, 2 Oct 2023 03:35:38 +0900 Subject: [PATCH 10/21] :rewind: 1001 --- studyReview/main.swift | 732 ++++++++++++++++++++++++++++++++++++++++- 1 file changed, 725 insertions(+), 7 deletions(-) diff --git a/studyReview/main.swift b/studyReview/main.swift index 99b4739..da60dcb 100644 --- a/studyReview/main.swift +++ b/studyReview/main.swift @@ -70,13 +70,731 @@ import Foundation //MARK: 연산자 예제 6 //초를 입력 받아 [시, 분, 초] 형태로 출력하세요. -print("초 입력: ", terminator: "") -let t = Int(readLine()!)! - -var m = (t/60) % 60 -var h = (t/60)/60 -var s = (t%60) -print("\(h)시간 \(m)분 \(s)초") +//print("초 입력: ", terminator: "") +//let t = Int(readLine()!)! +// +//var m = (t/60) % 60 +//var h = (t/60)/60 +//var s = (t%60) +//print("\(h)시간 \(m)분 \(s)초") //MARK: - //MARK: 연산자 예제 7 +//시급계산기 입니다. 기본시급은 5,000원이고, 8시간이 넘을 경우 초과된 시간은 시급의 1.5배를 책정해줍니다. (하루 13시간 이하 근무) + +//var num = 5000 +//var hour = 5000 * 1.5 +// +//print("노동시간 입력: ", terminator: "") +//let time = Int(readLine()!)! +// +// +//if time >= 8 { +// var overtime = (Double(time-8) * hour) +// var money = (Double(time) - Double(time - 8)) * Double(num) +// print("총 입금은 \(Int(overtime + money))원 입니다.") +//} + +//MARK: - +//MARK: 연산자 예제 8 +//정수를 입력받아 홀수인지 짝수인지 판별하세요.(삼항연산자 이용) + +//print("정수를 입력하세요: ", terminator: "") +//let num = Int(readLine()!)! +// +//print(num % 2 == 0 ? "\(num)은 짝수입니다." : "\(num)은 홀수입니다.") + +//MARK: - +//MARK: 연산자 예제 9 +//두 개의 정수를 입력 받아 큰 수에서 작은 수를 뺀 결과값을 출력하세요. .(삼항연산자 이용) +//func inputLine (_ message: String) -> Int { +// print(message, terminator: " ") +// return Int(readLine()!)! +// } +// +//let num1 = inputLine("첫 번째 정수 입력: ") +//let num2 = inputLine("두 번째 정수 입력: ") +// +//print(num1 > num2 ? "두 수의 차: \(num1 - num2)" : "두 수의 차: \(num2 - num1)") + +//MARK: - +//MARK: 연산자 예제 10 +//농구공을 담기 위해 필요한 상자의 개수를 구하세요. +//상자 하나에는 농구공이 5개 들어갈 수 있습니다. 만일 농구공이 ‘23’개라면 필요한 상자의 개수는 ‘5’개입니다. + +func inputLine (_ message : String) -> Int{ + print(message, terminator: "") + return Int(readLine()!)! +} + +//let balls = inputLine("농구공의 갯수를 입력하세요: ") +//var box = balls / 5 +//var left = balls % 5 +// +//print(left != 0 ? "필요한 상자의 수: \(box + 1)" : "필요한 상자의 수: \(box)") + +//MARK: - +//MARK: 조건문 예제 1 +//Int 타입의 변수 age를 선언하고 키보드로 값을 입력받으세요. +//만약 age가 20보다 크거나 같다면 “성인입니다.” 라고 +//출력하는 프로그램을 만들어 보세요. + +//let age = inputLine("정수를 입력하세요: ") +// +//if age >= 20 { +// print("성인입니다.") +//}else{ +// print("성인이 아닙니다.") +//} + +//MARK: - +//MARK: 조건문 예제 2 +//변수 num를 선언하고 키보드로 값을 입력받으세요. +//만약 num이 3의 배수이면서 5의 배수라면 “3과 5의 배수입니다”라고 출력하는 +//프로그램을 만들어보세요. + +//let num = inputLine("정수를 입력하세요: ") +// +//if num % 3 == 0 && num % 5 == 0 { +// print("3과 5의 배수입니다.") +//}else{ +// print("3과 5의 배수가 아닙니다.") +//} +//MARK: - +//MARK: 조건문 예제 3 +//Int 타입의 변수 grade 를 선언하고 키보드로 값을 입력받으세요. +//만약 grade 가 60점이상이면 “합격입니다.” grade 가 60점 미만이면 “불합격입니다.” 를 출력하는 프로그램을 작성해보세요. + +//let grade = inputLine("정수를 입력하세요: ") +// +//if grade >= 60 { +// print("합격입니다.") +//}else{ +// print("불합격입니다.") +//} +//MARK: - +//MARK: 조건문 예제 4 +//정수를 입력 받아 양수, 음수, 0을 판별하여 다음과 같이 출력하세요. + +//let num = inputLine("정수를 입력하세요: ") +// +//if num > 0 { +// print("양수입니다.") +//}else if num < 0 { +// print("음수입니다.") +//}else{ +// print("0 입니다.") +//} + +//MARK: - +//MARK: 조건문 예제 5 +//Int 타입의 변수 num1, num2를 선언하고 키보드로 값을 입력받으세요. +//입력받은 num1과 num2 중 큰 수를 출력하는 프로그램을 만들어보세요. + +//let num1 = inputLine("첫 번째 정수를 입력하세요: ") +//let num2 = inputLine("두 번째 정수를 입력하세요: ") +// +//switch num1 > num2{ +// +//case true: +// print("더 큰 수: \(num1)") +//case false: +// print("더 큰 수: \(num2)") +//} + +//MARK: - +//MARK: 조건문 예제 6 +//정보처리기사의 각 과목의 정답개수를 Int형 타입의 변수 5개를 선언하고 입력받으세요. +//한 과목이라도 8개 미만인 경우, “불합격입니다!”를 출력하고 총 개수가 60개 이상이면 “합격입니다!”를 출력하는 프로그램을 만들어보세요. + +//let num1 = inputLine("1과목 소프트웨어 설계: ") +//let num2 = inputLine("2과목 소프트웨어 개발: ") +//let num3 = inputLine("3과목 데이터베이스 구축: ") +//let num4 = inputLine("4과목 프로그래밍 언어 활용: ") +//let num5 = inputLine("5과목 정보시스템 구축관리: ") +// +//if num1 < 8 || num2 < 8 || num3 < 8 || num4 < 8 || num5 < 8 { +// print("불합격입니다.") +//}else if num1+num2+num3+num4+num5 < 60 { +// print("불합격입니다.") +//}else{ +// print("합격입니다!") +//} + +//MARK: - +//MARK: 조건문 예제 7 +//다음은 디즈니랜드 입장료 계산 프로그램입니다. +//기본료는 5000원이며 인원수에 따라 지불해야하는 프로그램을 만들어보세요. +//단, 미성년자인 경우 50%할인이 적용됩니다! + +//let money = 5000 +//let age = inputLine("나이를 말씀해주세요: ") +//let people = inputLine("인원수를 말씀해주세요: ") +// +//if age < 20 { +// print("총 \(people * (money/2))원 입니다.") +//}else{ +// print("총 \(people * money)원 입니다.") +//} +//MARK: - +//MARK: 조건문 예제 7 (더 해보기) + +//let money = 5000 +//var pay = 0 +// +//let people = inputLine("인원수를 말씀해주세요: ") +// +//for i in 1...people{ +// let age = inputLine("\(i)나이를 입력해주세요: ") +// +// if age <= 20{ +// pay += (money/2) +// }else{ +// pay += money +// } +//} +// +//print("총 \(pay)원 입니다.") + +//MARK: - +//MARK: 조건문 예제 8 +//마트 계산대 프로그램입니다. +//10000원짜리 추석선물셋트를 구입했을 때 지불해야하는 금액을 계산해 보세요. +//단, 11개 이상 구매시에는 10%할인이 됩니다! + +//let set = 10000 +//let num = inputLine("구매하려는 상품 갯수를 입력하세요: ") +// +//if num >= 11 { +// print("가격은 \(Int(Double(set)*0.9) * num)원 입니다.") +//}else{ +// print("가격은 \(set * num)원 입니다.") +//} + +//MARK: - +//MARK: 조건문 예제 9 +//Int 타입의 변수 grade 를 선언하고 키보드로 값을 입력받으세요. +//Grade가 +//90이상이면 “A학점입니다.”, +//80점 이상 90점 미만일 경우 “B학점입니다.” +//70점이상 80점 미만일 경우 “C학점입니다.” 를 출력하세요. + +//let grade = inputLine("점수를 입력하세요: ") +// +//if grade > 90 { +// print("A학점입니다.") +//}else if grade > 80 && grade < 90 { +// print("B학점입니다.") +//}else{ +// print("C학점입니다.") +//} + +//MARK: - +//MARK: 조건문 예제 10 +//switch ~ case 문을 사용하여, +//data가 "hello" 일 때, "네, 안녕하세요!" 출력, +//data 가 "nice to meet you" 일 때, "네, 반가워요!" 출력, +//data가 "take care" 일 때, "네, 수고하세요!" 출력, +//그 외 다른 문장일 때는 "잘못 입력하셨습니다." 라고 출력하는 프로그램을 작성하세요. + +func inputString(_ message: String) -> String{ + print(message, terminator: "") + return readLine()! +} + +//let data = inputString("") +// +//switch data { +//case "hello": +// print("네, 안녕하세요.") +//case "nice to meet you": +// print("네, 반가워요!") +//case "take care": +// print("네, 수고하세요") +//default: +// print("잘못 입력하셨습니다.") +//} + +//MARK: - +//MARK: 조건문 예제 12 +//월을 입력받아 봄, 여름, 가을, 겨울 중 맞는 계절을 알려주는 프로그램을 만드세요. +//12, 1, 2월 → 겨울 +//3, 4, 5월 → 봄 +//6, 7, 8월 → 여름 +//9, 10, 11월 →가을 + +//let month = inputLine("월을 입력하세요: ") +// +//switch month { +//case 12, 1 ,2 : +// print("겨울") +//case 3, 4, 5: +// print("봄") +//case 6, 7, 8: +// print("여름") +//case 9, 10, 11: +// print("가을") +//default: +// print("다시 입력해주세요.") +//} + +//MARK: - +//MARK: 조건문 예제 13 +//자판기 프로그램을 만들어 봅시다. +//금액을 입력하고 메뉴를 고른 뒤 잔돈을 출력해 보세요! + +//let money = inputLine("금액을 입력하세요: ") +//let menu = inputLine("메뉴를 고르세요\n1.콜라(800원) 2.생수(500원) 3.비타민워터(1500원): ") +// +//switch menu { +//case 1: +// print("잔돈: \(money - 800)") +//case 2: +// print("잔돈: \(money - 500)") +//case 3: +// print("잔돈: \(money - 1500)") +//default: break +//} + +//MARK: - +//MARK: 조건문 예제 14 +//입력한 금액이 선택한 메뉴의 가격보다 부족하면 +//돈이 부족하다는 문장을 출력하세요! + +//let money = inputLine("금액을 입력하세요: ") +//let menu = inputLine("메뉴를 고르세요\n1.콜라(800원) 2.생수(500원) 3.비타민워터(1500원): ") +// +//switch menu { +//case 1: +// if money < 800 { +// print("돈이 부족해요 ㅠㅠ") +// }else{ +// print("잔돈: \(money - 800)") +// } +//case 2: +// if money < 500 { +// print("돈이 부족해요 ㅠㅠ") +// }else{ +// print("잔돈: \(money - 500)") +// } +//case 3: +// if money < 1500 { +// print("돈이 부족해요 ㅠㅠ") +// }else{ +// print("잔돈: \(money - 1500)") +// } +//default: break +//} + +//MARK: - +//MARK: 조건문 예제 15 +//잔돈을 줄 때 천원을 몇 개 줘야 하는지 계산해 보세요! + +//let money = inputLine("금액을 입력하세요: ") +//let menu = inputLine("메뉴를 고르세요\n1.콜라(800원) 2.생수(500원) 3.비타민워터(1500원): ") +// +//switch menu { +//case 1: +// if money < 800 { +// print("돈이 부족해요 ㅠㅠ") +// }else{ +// print("잔돈: \(money - 800)") +// print("천원: \((money - 800)/1000)") +// } +//case 2: +// if money < 500 { +// print("돈이 부족해요 ㅠㅠ") +// }else{ +// print("잔돈: \(money - 500)") +// print("천원: \((money - 500)/1000)") +// } +//case 3: +// if money < 1500 { +// print("돈이 부족해요 ㅠㅠ") +// }else{ +// print("잔돈: \(money - 1500)") +// print("천원: \((money - 1500)/1000)") +// } +//default: break +//} + +//MARK: - +//MARK: 조건문 예제 16 +//잔돈을 줄 때 천원, 오백원, 백원짜리를 몇 개 줘야하는지 계산해 보세요! + +//let money = inputLine("금액을 입력하세요: ") +//let menu = inputLine("메뉴를 고르세요\n1.콜라(800원) 2.생수(500원) 3.비타민워터(1500원): ") +// +//switch menu { +//case 1: +// if money < 800 { +// print("돈이 부족해요 ㅠㅠ") +// }else{ +// print("잔돈: \(money - 800)") +// print("천원: \((money - 800)/1000)") +// print("오백원: \((money - 800)%1000/500)") +// print("백원: \((money - 800)%1000%500/100)") +// } +//case 2: +// if money < 500 { +// print("돈이 부족해요 ㅠㅠ") +// }else{ +// print("잔돈: \(money - 500)") +// print("천원: \((money - 500)/1000)") +// print("오백원: \((money - 500)%1000/500)") +// print("백원: \((money - 500)%1000%500/100)") +// } +//case 3: +// if money < 1500 { +// print("돈이 부족해요 ㅠㅠ") +// }else{ +// print("잔돈: \(money - 1500)") +// print("천원: \((money - 1500)/1000)") +// print("오백원: \((money - 1500)%1000/500)") +// print("백원: \((money - 1500)%1000%500/100)") +// } +//default: break +//} + +//MARK: - +//MARK: while문 예제 1 + +//var result = 0 +// +//while result < 10 { +// let num = inputLine("정수 입력: ") +// result = num +//} +//print("종료되었습니다.") + +//MARK: - +//MARK: while문 예제 2 +//다이어트 관리 프로그램 +//현재 몸무게와 목표몸무게를 입력 받고 주차 별 감량 몸무게를 입력 받으세요. +//목표 몸무게를 달성하면 축하한다는 문구를 출력 하고 입력을 멈추세요! + +//var nowWeight = inputLine("현재 몸무게: ") +//let target = inputLine("목표 몸무게: ") +//var i = 0 +// +//while nowWeight > target { +// i = i + 1 +// var weight = inputLine("\(i)주차 몸무게: ") +// nowWeight -= weight +//} +//if nowWeight < target { +// print("\(nowWeight)kg 달성! 축하합니다.") +//} + +//MARK: - +//MARK: while문 예제 3 +//로그인 프로그램을 만들어 보자. +//아이디와 비밀번호를 각각 입력 받고 일치할 경우 “로그인성공!” +//일치하지 않은 경우에는 “로그인 실패!” + +//let setId = "hello" +//let setPassword = 1234 +//let id = inputString("아이디를 입력해주세요: ") +//let password = inputLine("비밀번호를 입력해주세요: ") +// +//if id == setId && password == setPassword { +// print("로그인 성공!") +//}else{ +// print("id 또는 비밀번호가 틀렸습니다.") +//} + +//MARK: - +//MARK: while문 예제 4 +//로그인이 실패했을 경우에 계속 입력 +//로그인이 성공하면 프로그램 종료 + +//let setId = "hello" +//let setPassword = 1234 +// +//while true { +// let id = inputString("아이디를 입력해주세요: ") +// let password = inputLine("비밀번호를 입력해주세요: ") +// +// if id == setId && password == setPassword { +// print("로그인 성공!") +// break +// }else{ +// print("id 또는 비밀번호가 틀렸습니다.\n") +// continue +// } +//} + +//MARK: - +//MARK: while문 예제 5 +//Login프로그램 +//아이디와 비밀번호가 틀렸을 경우 "계속 하시겠습니까?" 라는 문장을 출력하세요. +//Y를 입력하면 아이디 비밀번호 입력 계속, +//N을 입력하면 종료 +//로그인 성공 시 종료 + + +//let setId = "hello" +//let setPassword = 1234 +// +//while true { +// let id = inputString("아이디를 입력해주세요: ") +// let password = inputLine("비밀번호를 입력해주세요: ") +// +// if id == setId && password == setPassword { +// print("로그인 성공!") +// break +// }else{ +// print("id 또는 비밀번호가 틀렸습니다.\n") +// let again = inputString("다시 하시겠습니까? (Y/N): ") +// if again == "Y"{ +// continue +// }else if again == "N"{ +// break +// } +// } +//} + +//MARK: - +//MARK: while문 예제 6 +//아이디와 비밀번호가 틀렸을 경우 "계속 하시겠습니까?" 라는 문장을 출력하세요. +//첫 번째 정수를 입력 받는다. +//두 번째 정수를 입력 받는다. +//연산자를 선택한다. +//선택한 연산자에 따라 연산결과를 출력한다. +//다시 실행할 것인가를 물어본다. +//“Y” 를 입력하면 다시 실행. +//“N”을 입력하면 반복문 종료. + + +//var a = true +//while a { +//let num1 = inputLine("첫 번째 정수 입력: ") +//let num2 = inputLine("두 번째 정수 입력: ") +//var result = 0 +// +//let sellect1 = inputLine("1.더하기 2.빼기: ") +// switch sellect1 { +// case 1: +// result = num1 + num2 +// print(result) +// let sellect2 = inputString("다시(Y/N): ") +// if sellect2 == "Y"{ +// continue +// }else if sellect2 == "N"{ +// a = false +// } +// case 2: +// result = num1 - num2 +// print(result) +// let sellect2 = inputString("다시(Y/N): ") +// if sellect2 == "Y"{ +// continue +// }else if sellect2 == "N"{ +// a = false +// } +// default: +// print("다시 입력해주세요.") +// continue +// } +//} + +//MARK: - +//MARK: while문 예제 7 + +//let num1 = Int.random(in: 0...100) +//let num2 = Int.random(in: 0...100) +//var result = num1 + num2 +// +//let answer = inputLine("\(num1) + \(num2) = ? ") +// +//if answer == result { +// print("SUCCESS") +//}else{ +// print("FAIL") +//} + +//MARK: - +//MARK: while문 예제 7 - 1 +//사용자가 원할 때까지 반복 +//Fail 후 계속하기를 선택할 시 기존 숫자를 출력 + +//var again = true +//let num1 = Int.random(in: 0...100) +//let num2 = Int.random(in: 0...100) +//var result = num1 + num2 +// +//while again { +// let answer = inputLine("\(num1) + \(num2) = ? ") +// +// if answer == result { +// print("SUCCESS") +// again = false +// }else{ +// print("FAIL") +// let failAgain = inputString("다시 하시겠습니까? (Y/N): ") +// if failAgain == "Y"{ +// again = true +// }else{ +// again = false +// } +// } +//} + +//MARK: - +//MARK: while문 예제 7-2 * +//Success 후 계속하기를 선택할 시 새로운 숫자를 뽑아서 출력 + +//var again = true +//var again2 = true +// +//while again2 { +// let num1 = Int.random(in: 0...100) +// let num2 = Int.random(in: 0...100) +// let result = num1 + num2 +// +// while again { +// let answer = inputLine("\(num1) + \(num2) = ? ") +// +// if answer == result { +// print("SUCCESS") +// let successAgain = inputString("다시 하시겠습니까? (Y/N): ") +// if successAgain == "Y"{ +// break +// }else{ +// again2 = false +// again = false +// } +// }else{ +// print("FAIL") +// let failAgain = inputString("재도전 하시겠습니까? (Y/N): ") +// if failAgain == "Y"{ +// again = true +// again2 = true +// }else{ +// again2 = false +// again = false +// } +// } +// } +//} + +//MARK: - +//MARK: for문 예제 00 +//for문을 사용하여 96에서 53까지 출력하시오. + +//for i in (53...96).reversed(){ +// print(i) +//} + +//for문을 사용하여 21에서 57까지의 수 중 홀수만 출력하시오. + +//for i in 21...57 { +// if i % 2 == 1{ +// print(i) +// } +//} + +//정수를 입력 받아 1부터 입력 받은 정수까지 차례대로 출력하는 프로그램을 작성하시오. + +//let num1 = inputLine("정수 입력: ") +//for i in 1...num1{ +// print(i) +//} + +//한 개의 자연수를 입력 받아 그 수의 배수를 차례로 10개 출력하는 프로그램을 작성하시오. + +//let num1 = inputLine("자연수 입력: ") +//for i in 1...10{ +// print("\(num1 * i)") +//} + +//1~100까지 3의 배수의 합을 출력하세요. (1683) + +//var sum = 0 +// +//for i in 1...33 { +// var result = 3 * i +// sum += result +//} +//print(sum) + +//MARK: - +//MARK: for문 예제 3 +//2단 출력 + +//for i in 1...9{ +// print("2 * \(i) = \(i * 2)") +//} + +//MARK: - +//MARK: for문 예제 4 +//원하는 단을 입력받아 구구단을 출력하세요. + +//let num = inputLine("단 입력: ") +//for i in 1...9 { +// print("\(num) * \(i) = \(num * i)") +//} + +//MARK: - +//MARK: for문 예제 5 +//구구단 1단~9단까지 출력 + +//for i in 2...9{ +// print("=== \(i)단 ===") +// for j in 1...9{ +// print("\(i) * \(j) = \(i * j)") +// if j == 9{ +// print("\n") +// } +// } +//} + +//MARK: - +//MARK: for문 예제 6 + +//for i in 2...9{ +// print("\(i)단: ", terminator: "") +// for j in 1...9{ +// if (i * j) < 10{ +// print("\(i) * \(j) = \(i * j)", terminator: " ") +// }else{ +// print("\(i) * \(j) = \(i * j)", terminator: " ") +// } +// if j == 9{ +// print("\n") +// } +// } +//} + +//MARK: - +//MARK: for문 예제 7 +//입력 받은 정수의 약수를 구하세요 + +//print("정수 입력: ",terminator: "") +//let num = Int(readLine()!)! +// +//print("\(num)의 약수: ",terminator: "") +//for i in 1...num{ +// if num % i == 0{ +// print(i, terminator: " ") +// } +//} + +//MARK: - +//MARK: for문 예제 8 +//2~30까지의 약수를 구하세요 + +for i in 2...30{ + print("\(i)의 약수: ", terminator: "") + for j in 1...i{ + if i % j == 0{ + print("\(j)", terminator: " ") + if j == i { + print("\n") + } + } + } +} + +//MARK: - + From 707b4299391011fb37d4657e1a994884215b9776 Mon Sep 17 00:00:00 2001 From: SeonKoo Date: Wed, 4 Oct 2023 00:26:15 +0900 Subject: [PATCH 11/21] :rewind:1004 --- studyReview/main.swift | 426 +++++++++++++++++++++++++++++++++++++++-- 1 file changed, 415 insertions(+), 11 deletions(-) diff --git a/studyReview/main.swift b/studyReview/main.swift index da60dcb..3de9d37 100644 --- a/studyReview/main.swift +++ b/studyReview/main.swift @@ -784,17 +784,421 @@ func inputString(_ message: String) -> String{ //MARK: for문 예제 8 //2~30까지의 약수를 구하세요 -for i in 2...30{ - print("\(i)의 약수: ", terminator: "") - for j in 1...i{ - if i % j == 0{ - print("\(j)", terminator: " ") - if j == i { - print("\n") - } - } - } -} +//for i in 2...30{ +// print("\(i)의 약수: ", terminator: "") +// for j in 1...i{ +// if i % j == 0{ +// print("\(j)", terminator: " ") +// if j == i { +// print("\n") +// } +// } +// } +//} + +//MARK: - +//MARK: for문 에제 9 +//별찍기 + +//for i in 1...5{ +// print(" ") +// for j in 1...i{ +// print("*",terminator: "") +// } +//} + +//MARK: - +//MARK: 별찍기 거꾸로 + +//for i in (1...5).reversed(){ +// print(" ") +// for j in 1...i{ +// print("*",terminator: "") +// } +//} + +//MARK: - +//MARK: 별찍기 반대로 + +//for i in 1...5{ +// print("") +// for k in i...5{ +// print(" ",terminator: "") +// } +// for j in 1...i{ +// print("*",terminator: "") +// } +//} + +//MARK: - +//MARK: 별찍기 다이아 + +//for i in 1...5{ +// print("") +// for _ in i...5{ +// print(" ",terminator: "") +// } +// for _ in 1...i{ +// print("*",terminator: "") +// } +// for _ in 1...i{ +// print("*", terminator: "") +// } +//} +//for p in (1...5).reversed(){ +// print("") +// for _ in p...5{ +// print(" ",terminator: "") +// } +// for _ in 1...p{ +// print("*",terminator: "") +// } +// for _ in 1...p{ +// print("*", terminator: "") +// } +//} + +//MARK: - +//MARK: 함수 예제 1 +//두 수의 합을 받아 아래와 같은 결과가 나올 수 있도록 addNumber() 를 작성하시오 + +//func addNumber(_ num1: Int,_ num2: Int) -> Int { +// return num1 + num2 +//} +// +//let firstnum = inputLine("첫번째 수: ") +//let seccondnum = inputLine("두번째 수: ") +// +//let result = addNumber(firstnum, seccondnum) +//print("연산결과: \(result)") + +//MARK: - +//MARK: 함수 예제 2 +//2개의 정수를 받아 2개의 숫자 중 더 큰 수를 반환하는 largerNumbers() 을 만들어보세요 + +//func largerNumbers(_ num1: Int,_ num2: Int) -> Int{ +// if num1 > num2{ +// return num1 +// }else if num2 > num1{ +// return num2 +// }else{ +// return 0 +// } +//} +// +//let inputNum1 = inputLine("첫번째 수: ") +//let inputNum2 = inputLine("두번째 수: ") +// +//let result = largerNumbers(inputNum1, inputNum2) +//print("큰 수 확인: \(result)") + +//MARK: - +//MARK: 함수 예제 3 * +//2개의 정수를 받아 2개의 숫자 중 10에 더 가까운 수를 반환하는 close10() 을 만들어보세요 + +//func close10(num1: Int, num2: Int) -> Int{ +// if 10 - abs(num1) < 10 - abs(num2) { +// return num1 +// }else if 10 - abs(num2) < 10 - abs(num1) { +// return num2 +// }else{ +// return 0 +// } +// +//} +// +//let inputNum1 = inputLine("첫번째 수: ") +//let inputNum2 = inputLine("두번째 수: ") +// +//let result = close10(num1: inputNum1, num2: inputNum2) +//print("10에 가까운 수: \(result)") + +//MARK: - +//MARK: 함수 예제 4 +//2개의 정수 base, n을 받아 base의 n제곱 만큼 값을 반환하는 powerN() 를 작성하세요 + +//func powerN(base : Float, n : Float) -> Float{ +// return pow(base, n) +//} +// +//let inputNum1 = inputLine("첫번째 수: ") +//let inputNum2 = inputLine("두번째 수: ") +// +//let result = powerN(base: Float(inputNum1), n: Float(inputNum2)) +//print("결과 확인: \(Int(result))") + +//MARK: - +//MARK: 함수 예제 5 +//키보드로부터 입력받은 두 개의 정수를 인자(매개변수)로 넘겨받아 num1에서 num2를 뺀 결과값을 절대값으로 바꾸어 출력하는 getAbsoluteValue( ) 를 구현하세요 + + +//func getAbsoluteValue(num1 : Int, num2 : Int) -> Int{ +// return abs(num1 - num2) +//} +// +//let inputNum1 = inputLine("첫번째 수: ") +//let inputNum2 = inputLine("두번째 수: ") +// +//let result = getAbsoluteValue(num1: inputNum1, num2: inputNum2) +//print("결과 확인: \(result)") + +//MARK: - +//MARK: 함수 예제 6 +//두 개의 정수를 인자(매개변수)로 넘겨받아 앞의 정수가 뒤의 정수로 나누어지는지를 판별하는 isDivide( ) 를 작성하세요. +//(이때 나누어지면 true, 나누어지지 않으면 false을 반환) + +//func isDivide(num1: Int, num2: Int) -> Bool{ +// if num1 % num2 == 0 { +// return true +// }else if num1 % num2 != 0{ +// return false +// }else{ +// return false +// } +//} +// +//let inputNum1 = inputLine("첫번째 수: ") +//let inputNum2 = inputLine("두번째 수: ") +// +//let result = isDivide(num1: inputNum1, num2: inputNum2) +//print("결과 확인: \(result)") + +//MARK: - +//MARK: 함수 예제 7 +//약수를 구하는 getDivisor() 를 구현하세요 + +//func getDivisior(num1: Int) { +// for i in 1...num1{ +// if num1 % i == 0{ +// print(i, terminator: " ") +// } +// } +//} +//let inputNum = inputLine("약수: ") +//let divi = getDivisior(num1: inputNum) +//print(divi) + +//MARK: - +//MARK: 함수 예제 8 +//약수의 합을 구하여 반환하는 getSumOfDivisors() 를 구현하세요 + +//func getSumOfDivisiors(num1: Int) -> Int{ +// var result = 0 +// for i in 1...num1{ +// if num1 % i == 0{ +// result += i +// } +// } +// return result +//} +// +//let inputNum = inputLine("약수: ") +//let result = getSumOfDivisiors(num1: inputNum) +//print("\(inputNum)의 약수의 합: \(result)") //MARK: - +//MARK: 함수 예제 9 * +//startValue...endValue까지의 숫자 중 완전수를 출력하는 getPerfectNumber() 를 구현하세요 + +//MARK: - +//MARK: 함수 예제 10 * +//startValue~endValue까지의 숫자 중 소수를 출력하는 getPrimeNumber() 를 구현하세요 +//func getPrimeNumber(num1: Int, num2: Int) { +// for i in num1...num2{ +// for j in 1...i { +// if i % j == 0{ +// print(i, terminator: " ") +// } +// } +// } +//} +// +//let inputNum1 = inputLine("첫번째 수: ") +//let inputNum2 = inputLine("두번째 수: ") +// +//getPrimeNumber(num1: inputNum1, num2: inputNum2) +//print("결과 확인: \(result)") + +//MARK: - +//MARK: 클래스 예제 0 + +//class Pigbank { +// var mybank = 0 +// +// func moneyIn (num: Int) { +// mybank += num +// show() +// } +// func moneyOut (num: Int){ +// if mybank == 0 || mybank < 0{ +// print("잔액이 부족합니다.") +// }else{ +// mybank -= num +// } +// show() +// } +// func show() { +// print("현재 잔액: \(mybank)") +// } +//} +// +//let bank = Pigbank() +//bank.show() +//bank.moneyIn(num: inputLine("입금: ")) +//bank.moneyOut(num: inputLine("출금: ")) + +//MARK: - +//MARK: 클래스 예제 1 ~ 3 + +//class Student { +// var name : String +// var number : String +// var age : Int +// var scoreSwift : Int +// var scoreiOS : Int +// var scoreWeb : Int +// +// init(name: String, number: String, age: Int, scoreSwift: Int, scoreiOS: Int, scoreWeb: Int) { +// self.name = name +// self.number = number +// self.age = age +// self.scoreSwift = scoreSwift +// self.scoreiOS = scoreiOS +// self.scoreWeb = scoreWeb +// } +// func show(){ +// print("\(name)님 안녕하세요.\n[ \(number), \(age)살 ]\n\(name)님의 Swift 점수는 \(scoreSwift)점 입니다.\n\(name)님의 iOS 점수는 \(scoreiOS)점 입니다.\n\(name)님의 Web 점수는 \(scoreWeb)점 입니다.") +// } +//} +// +//var student1 = Student.init(name: "홍길동", number: "20200677", age: 22, scoreSwift: 50, scoreiOS: 89, scoreWeb: 77) +//var student2 = Student.init(name: "김영희", number: "20190541", age: 26, scoreSwift: 90, scoreiOS: 85, scoreWeb: 70) +// +//student1.show() +//print("===============") +//student2.show() + +//MARK: - +//MARK: 클래스 예제 4 + +//class Person { +// var name: String +// var age: Int +// +// init(name: String, age: Int) { +// self.name = name +// self.age = age +// } +// func getName () -> String { +// return name +// } +// func setName (change: String) -> String{ +// name = change +// return name +// } +// func getAge() -> Int { +// return age +// } +// func setAge(changeAge: Int) -> Int { +// age = changeAge +// return age +// } +//} +// +//var st1 = Person(name: "홍길동", age: 25) +//var st2 = Person(name: "김영희", age: 27) +//print("이름: \(st1.name), 나이: \(st2.age)") +//print("이름: \(st2.name), 나이: \(st2.age)") + +//MARK: - +//MARK: 클래스 예제 5 + +//class Caculator { +// var num1: Int +// var num2: Int +// +// init(num1: Int, num2: Int) { +// self.num1 = num1 +// self.num2 = num2 +// } +// func setNum1 (num: Int) -> Int { +// num1 = num +// return num1 +// } +// func setNum2 (num: Int) -> Int { +// num2 = num +// return num2 +// } +// func sum () -> Int{ +// return num1 + num2 +// } +// func sub () -> Int{ +// return num1 - num2 +// } +// func mul () -> Int{ +// return num1 * num2 +// } +// func div () -> Int{ +// return num1 / num2 +// } +//} +// +//var cal = Caculator(num1: inputLine("1번째 수: "), num2: inputLine("2번째 수: ")) +// +//print(cal.sum(), cal.setNum1(num: 75), cal.setNum2(num: 5), cal.sub(), cal.mul(), cal.div()) + +//MARK: - +//MARK: 클래스 예제 6 + +//class TV { +// var name: String +// var year: Int +// var size: Int +// +// init(name: String, year: Int, size: Int) { +// self.name = name +// self.year = year +// self.size = size +// } +// func show() { +// print("\(name)에서 만든 \(year)년형 \(size)인치 TV") +// } +//} +// +//let myTV = TV(name: "LG", year: 2023, size: 48) +//myTV.show() + +//MARK: - +//MARK: 별그리기 클래스 + +//MARK: - +//MARK: 배열 예제 1 + +//var array : [Int] = [] +//for i in 1...10{ +// array.insert(Int.random(in: 1...20), at: i-1) +//} +//print(array) +//print(array[4] + array[9]) +//var sum = 0 +//for j in 1...10{ +// sum += array[j-1] +//} +//print(sum) +//print(Float(sum) / 10.0) + +//MARK: - +//MARK: 배열 예제 2 + +var array : [Int] = [] +for i in 1...10{ + array.insert(Int.random(in: 1...20), at: i-1) +} +var result : [Int] = [] +for j in 1...10{ + if array[j-1] % 2 == 0{ + result.append(array[j-1]) + } +} +print(result) From a8af3a1dab6f9af38c5a84452ad22c7dbb3d6ff3 Mon Sep 17 00:00:00 2001 From: SeonKoo Date: Thu, 5 Oct 2023 13:10:28 +0900 Subject: [PATCH 12/21] :memo: 1004 --- lecture/{23.09.27.swift => 23.10.04.swift} | 67 ++++++++++++++++++++++ 1 file changed, 67 insertions(+) rename lecture/{23.09.27.swift => 23.10.04.swift} (85%) diff --git a/lecture/23.09.27.swift b/lecture/23.10.04.swift similarity index 85% rename from lecture/23.09.27.swift rename to lecture/23.10.04.swift index 4954c01..3e9d392 100644 --- a/lecture/23.09.27.swift +++ b/lecture/23.10.04.swift @@ -469,3 +469,70 @@ for i in 1...array9.count { print("\n") } } + +//MARK: - +//MARK: 스택 예제 1 (강사님 ver) +//func checkParentheses(_ input: String) -> Bool { +// +// var stack: [Character] = [] +// for char in input { +// if char == "(" || char == "{" || char == "["{ +// stack.append(char) +// } else if char == ")" || char == "}" || char == "]"{ +// if stack.isEmpty { +// return false +// } +// +// let top = stack.popLast() +// if (char == ")" && top != "(") || (char == "}" && top != "{") || (char == "]" && top != "[") { +// return false +// } +// } +// } +// +// return stack.isEmpty +//} +// +//print( checkParentheses("()()") ) +//print( checkParentheses("({[}])") ) +//print( checkParentheses("())(") ) +//print( checkParentheses("({}[()]())") ) + +//MARK: - +//MARK: 스택 예제 2 (강사님 ver) + +//func postFix(expression: String) -> Int{ +// +// +// let tokens = expression.split(separator: " ") //문자열을 잘라서 나눠주기 +// +// var stack = [String]() +// +// for token in tokens { +// if "+-*/".contains(token) { +// let right = Int(stack.popLast()!)! //꺼낸 것중 숫자 하나를 오른쪽에 배정 +// let left = Int(stack.popLast()!)! //꺼낸 것중 숫자 하나를 왼쪽에 배정 +// +// switch token { +// case "+": +// stack.append(String(right + left)) +// case "*": +// stack.append(String(right * left)) +// case "-": +// stack.append(String(right - left)) +// case "/": +// stack.append(String(right / left)) +// default: +// break +// } +// +// } else { +// stack.append(String(token)) +// } +// +// } +// +// return (Int(stack.popLast()!)!) +//} +// +//print(postFix(expression: "2 3 + 4 *")) From cd7676ae212a000cae4061d60f2fcea99e0261fc Mon Sep 17 00:00:00 2001 From: SeonKoo Date: Mon, 30 Oct 2023 00:41:51 +0900 Subject: [PATCH 13/21] :construction_worker: 1029 --- lecture/23.10.30.swift | 277 +++++++++++++++++++++++++++++++++++++++++ 1 file changed, 277 insertions(+) create mode 100644 lecture/23.10.30.swift diff --git a/lecture/23.10.30.swift b/lecture/23.10.30.swift new file mode 100644 index 0000000..8a3db5d --- /dev/null +++ b/lecture/23.10.30.swift @@ -0,0 +1,277 @@ +// Created by 박선구 on 2023/09/27. + +import SwiftUI + +struct ContentView: View { + + @State private var email : String = "" + @State private var password : String = "" + @State private var showPassword : Bool = false + @State private var validEmail : Bool = false + @State private var checkButton : Bool = true + @State private var isDisabled : Bool = false + @State private var loginFail : Bool = false + +// @State private var currectEmail : String = "s1111@apple.com" +// @State private var currectPassword : String = "happyswift1!" + + var body: some View { + ZStack{ + ColorManager.BackgroundColor + .cornerRadius(40) + .padding(.bottom, -100) + .padding(.top, 50) + .shadow(radius: /*@START_MENU_TOKEN@*/10/*@END_MENU_TOKEN@*/) + VStack { + Spacer() + HStack{ + Text("Hello\nWorld !") + Spacer() + Text("") + } + .font(.system(size: 50)) + .fontWeight(.heavy) + .padding(.horizontal) +// Spacer() + + VStack{ //이메일 + HStack{ + Text("이메일") + Spacer() + Text("") + } + ZStack(alignment: .trailing){ + TextField(" 이메일을 입력해주세요", text: $email) + .keyboardType(.emailAddress) + .padding() + .background(Color.white) + .cornerRadius(15) + .overlay( + RoundedRectangle(cornerRadius: 15) + .stroke(FieldColor().fieldcheck(checkButton, email), lineWidth: 2) + ) + if !email.isEmpty { + Image(systemName: checkButton == true ? "xmark" : "exclamationmark.circle") + .resizable() + .frame(width: 15, height: 15) + .padding() + .foregroundColor(checkButton == true ? .black : .red) + .symbolEffect(.bounce, value: checkButton) + .onTapGesture { + email = "" + } + } + } +// .onAppear { +// UITextField.appearance().clearButtonMode = .whileEditing +// } //텍스트 필드 클리어 버튼 + HStack{ + if email.isEmpty { + Text("Helper text") + .foregroundColor(checkButton == true ? .black : .red) + }else{ + Text(checkEmail(str: email) == true ? "Helper text" : "이메일을 올바르게 입력해주세요") + .foregroundColor(checkButton == true ? .black : .red) + } + Spacer() + Text("") + } + } + .padding() +// Spacer() + + VStack{ //비밀번호 + HStack{ + Text("비밀번호") + Spacer() + Text("") + } + + ZStack(alignment: .trailing){ + + if showPassword == false{ + + SecureField(" 비밀번호를 입력해주세요", text: $password) + .padding() + .background(Color.white) + .cornerRadius(15) + .overlay( + RoundedRectangle(cornerRadius: 15) + .stroke(FieldColor().fieldcheck2(checkButton, password), lineWidth: 2) + ) + + }else{ + + TextField(" 비밀번호를 입력해 주세요", text: $password) + .padding() + .background(Color.white) + .cornerRadius(15) + .overlay( + RoundedRectangle(cornerRadius: 15) + .stroke(FieldColor().fieldcheck2(checkButton, password), lineWidth: 2) + ) + } + Image(systemName: showPassword == false ? "eye.slash" : "eye") + .resizable() + .frame(width: 20, height: 17) + .padding() + .onTapGesture { + if showPassword == false{ + showPassword = true + }else{ + showPassword = false + } + } + } + + HStack{ + Text(" ") + .frame(minWidth: 82, maxHeight: 2.5) + .background(CheckPassword().pwcheck4(password)) + Text(" ") + .frame(minWidth: 82, maxHeight: 2.5) + .background(CheckPassword().pwcheck3(password)) + Text(" ") + .frame(minWidth: 82, maxHeight: 2.5) + .background(CheckPassword().pwcheck2(password)) + Text(" ") + .frame(minWidth: 82, maxHeight: 2.5) + .background(CheckPassword().pwcheck1(password)) + } + .shadow(radius: 1) + + HStack{ + Text("Helper text") + .foregroundColor(checkButton == true ? .black : .red) + Spacer() + Text("") + } + } + .padding() +// Spacer() + Button(action: onButton, label: { + Text("로그인") + .font(.title2) + .fontWeight(/*@START_MENU_TOKEN@*/.bold/*@END_MENU_TOKEN@*/) + .frame(maxWidth: 350, maxHeight: 50) + }) +// .padding() + .foregroundColor(.white) + .background(!email.isEmpty && CheckPassword().pwcheck2(password) == .orange && checkEmail(str: email) == true ? Color.blue : Color.gray) + .cornerRadius(10) + .disabled(CheckPassword().pwcheck2(password) == .orange && checkEmail(str: email) == true ? false : true) + .alert(isPresented: $loginFail){ + Alert(title: Text("로그인 실패"), + message: Text("아이디 혹은 비밀번호가 맞지 않습니다"), + dismissButton: .default(Text("확인"))) + } + + Spacer() + Spacer() + + } + .frame(maxWidth: .infinity, maxHeight: .infinity) + } +// .padding() + } + + func onButton() { + + let currectEmail : String = "s1111@apple.com" + let currectPassword : String = "happyswift1!" + + if email == currectEmail && password == currectPassword{ + loginFail = false + return checkButton = true + }else{ + loginFail = true + return checkButton = false + } + } +} + +func checkEmail(str: String) -> Bool { + let check = "[A-Z0-9a-z._%+-]+@[A-Za-z0-9.-]+\\.[A-Za-z]{2,64}" + let test = NSPredicate(format: "SELF MATCHES %@", check) + return test.evaluate(with: str) +} + +struct CheckPassword{ + let check = "^(?=.*[A-Za-z])(?=.*[0-9])(?=.*[!@#$%^&*()_+=-]).{8,64}" + let test : NSPredicate + + init(){ + test = NSPredicate(format: "SELF MATCHES %@", check) + } + + func pwcheck1(_ str: String) -> Color{ + let strcount = str.reduce(0) {$0 + ("!@#$%^&*()_+=-".contains($1) ? 1 : 0)} + if strcount >= 2 && test.evaluate(with: str){ + return .green + }else{ + return .gray + } + } + func pwcheck2(_ str: String) -> Color{ + if str.count >= 8 && str.rangeOfCharacter(from: .decimalDigits) != nil && str.rangeOfCharacter(from: CharacterSet(charactersIn: "!@#$%^&*()_+=-")) != nil { + return .orange + }else{ + return .gray + } + } + func pwcheck3(_ str: String) -> Color{ + if str.count >= 8 && str.rangeOfCharacter(from: .decimalDigits) != nil { + return .orange + }else{ + return .gray + } + } + func pwcheck4(_ str: String) -> Color{ + if !str.isEmpty { + return .red + }else if str.count >= 8{ + return .red + }else{ + return .gray + } + } +} + + + +//커스텀 컬러 +struct ColorManager { + static let BackgroundColor = Color("pickColor") +} + +struct FieldColor { + + func fieldcheck(_ checkButton : Bool, _ email : String) -> Color{ + + if checkButton == false { + return Color.red + }else if !email.isEmpty { + return Color.black + }else{ + return Color.gray + } + } + func fieldcheck2(_ checkButton : Bool, _ password : String) -> Color{ + + if checkButton == false { + return Color.red + }else if !password.isEmpty { + return Color.black + }else{ + return Color.gray + } + } +} + + + + + +#Preview { + ContentView() +} From fdcda3ec60e60f357b2b4f30c31b0f761d97c7be Mon Sep 17 00:00:00 2001 From: SeonKoo Date: Tue, 31 Oct 2023 01:27:18 +0900 Subject: [PATCH 14/21] Metoring update --- lecture/{23.10.30.swift => Mentoring.swift} | 130 +++++++++++++++----- 1 file changed, 97 insertions(+), 33 deletions(-) rename lecture/{23.10.30.swift => Mentoring.swift} (77%) diff --git a/lecture/23.10.30.swift b/lecture/Mentoring.swift similarity index 77% rename from lecture/23.10.30.swift rename to lecture/Mentoring.swift index 8a3db5d..86a3a20 100644 --- a/lecture/23.10.30.swift +++ b/lecture/Mentoring.swift @@ -2,6 +2,23 @@ import SwiftUI +// 텍스트 필드 밖 화면 터치 시 키보드 내림 +extension UIApplication { + func hideKeyboard() { + guard let window = windows.first else { return } + let tapRecognizer = UITapGestureRecognizer(target: window, action: #selector(UIView.endEditing)) + tapRecognizer.cancelsTouchesInView = false + tapRecognizer.delegate = self + window.addGestureRecognizer(tapRecognizer) + } + } + +extension UIApplication: UIGestureRecognizerDelegate { + public func gestureRecognizer(_ gestureRecognizer: UIGestureRecognizer, shouldRecognizeSimultaneouslyWith otherGestureRecognizer: UIGestureRecognizer) -> Bool { + return false + } +} + struct ContentView: View { @State private var email : String = "" @@ -12,6 +29,9 @@ struct ContentView: View { @State private var isDisabled : Bool = false @State private var loginFail : Bool = false + //필드 포커스 + @FocusState private var focusedField: FormField? + // @State private var currectEmail : String = "s1111@apple.com" // @State private var currectPassword : String = "happyswift1!" @@ -32,7 +52,7 @@ struct ContentView: View { .font(.system(size: 50)) .fontWeight(.heavy) .padding(.horizontal) -// Spacer() + VStack{ //이메일 HStack{ @@ -43,13 +63,18 @@ struct ContentView: View { ZStack(alignment: .trailing){ TextField(" 이메일을 입력해주세요", text: $email) .keyboardType(.emailAddress) + .textInputAutocapitalization(.never) .padding() .background(Color.white) .cornerRadius(15) .overlay( RoundedRectangle(cornerRadius: 15) - .stroke(FieldColor().fieldcheck(checkButton, email), lineWidth: 2) + .stroke(fieldcheck(checkButton, email), lineWidth: 2) ) + //포커스 필드 + .submitLabel(.next) + .focused($focusedField, equals: .email) + if !email.isEmpty { Image(systemName: checkButton == true ? "xmark" : "exclamationmark.circle") .resizable() @@ -62,9 +87,11 @@ struct ContentView: View { } } } + // .onAppear { // UITextField.appearance().clearButtonMode = .whileEditing // } //텍스트 필드 클리어 버튼 + HStack{ if email.isEmpty { Text("Helper text") @@ -78,7 +105,7 @@ struct ContentView: View { } } .padding() -// Spacer() + VStack{ //비밀번호 HStack{ @@ -92,24 +119,34 @@ struct ContentView: View { if showPassword == false{ SecureField(" 비밀번호를 입력해주세요", text: $password) + .keyboardType(.asciiCapable) + .textInputAutocapitalization(.never) .padding() .background(Color.white) .cornerRadius(15) .overlay( RoundedRectangle(cornerRadius: 15) - .stroke(FieldColor().fieldcheck2(checkButton, password), lineWidth: 2) + .stroke(fieldcheck2(checkButton, password), lineWidth: 2) ) + //포커스 필드 + .submitLabel(.done) + .focused($focusedField, equals: .password) }else{ - TextField(" 비밀번호를 입력해 주세요", text: $password) + .keyboardType(.asciiCapable) + .textInputAutocapitalization(.never) .padding() .background(Color.white) .cornerRadius(15) .overlay( RoundedRectangle(cornerRadius: 15) - .stroke(FieldColor().fieldcheck2(checkButton, password), lineWidth: 2) + .stroke(fieldcheck2(checkButton, password), lineWidth: 2) ) + //포커스 필드 + .submitLabel(.done) + .focused($focusedField, equals: .password) + } Image(systemName: showPassword == false ? "eye.slash" : "eye") .resizable() @@ -148,18 +185,20 @@ struct ContentView: View { } } .padding() -// Spacer() + Button(action: onButton, label: { Text("로그인") .font(.title2) .fontWeight(/*@START_MENU_TOKEN@*/.bold/*@END_MENU_TOKEN@*/) .frame(maxWidth: 350, maxHeight: 50) }) -// .padding() + .foregroundColor(.white) .background(!email.isEmpty && CheckPassword().pwcheck2(password) == .orange && checkEmail(str: email) == true ? Color.blue : Color.gray) .cornerRadius(10) .disabled(CheckPassword().pwcheck2(password) == .orange && checkEmail(str: email) == true ? false : true) + + // 경고 .alert(isPresented: $loginFail){ Alert(title: Text("로그인 실패"), message: Text("아이디 혹은 비밀번호가 맞지 않습니다"), @@ -172,9 +211,25 @@ struct ContentView: View { } .frame(maxWidth: .infinity, maxHeight: .infinity) } -// .padding() + + //키보드 내림 + .onAppear (perform : UIApplication.shared.hideKeyboard) + + //텍스트 필드 옮기기 (포커스필드) + .onSubmit { + switch focusedField { + case .email: + focusedField = .password + case .password: + focusedField = nil + default: + focusedField = nil + } + } + } + // 버튼 func onButton() { let currectEmail : String = "s1111@apple.com" @@ -188,14 +243,44 @@ struct ContentView: View { return checkButton = false } } + + // 텍스트필드 테두리 색 (이메일) + func fieldcheck(_ checkButton : Bool, _ email : String) -> Color{ + + if checkButton == false { + return Color.red + }else if focusedField == .email { + return Color.black + }else if focusedField != .email{ + return Color.gray + }else{ + return Color.gray + } + } + + // 텍스트필드 테두리 색 (비밀번호) + func fieldcheck2(_ checkButton : Bool, _ password : String) -> Color{ + + if checkButton == false { + return Color.red + }else if focusedField == .password { + return Color.black + }else if focusedField != .password{ + return Color.gray + }else{ + return Color.gray + } + } } +//이메일 확인 func checkEmail(str: String) -> Bool { let check = "[A-Z0-9a-z._%+-]+@[A-Za-z0-9.-]+\\.[A-Za-z]{2,64}" let test = NSPredicate(format: "SELF MATCHES %@", check) return test.evaluate(with: str) } +//비밀번호 확인 및 규격 체크 struct CheckPassword{ let check = "^(?=.*[A-Za-z])(?=.*[0-9])(?=.*[!@#$%^&*()_+=-]).{8,64}" let test : NSPredicate @@ -244,31 +329,10 @@ struct ColorManager { static let BackgroundColor = Color("pickColor") } -struct FieldColor { - - func fieldcheck(_ checkButton : Bool, _ email : String) -> Color{ - - if checkButton == false { - return Color.red - }else if !email.isEmpty { - return Color.black - }else{ - return Color.gray - } - } - func fieldcheck2(_ checkButton : Bool, _ password : String) -> Color{ - - if checkButton == false { - return Color.red - }else if !password.isEmpty { - return Color.black - }else{ - return Color.gray - } - } +//포커스 필드 +enum FormField { + case email, password } - - From a91ae35c33f9a92d05509abfc31fd6cf77b8d80c Mon Sep 17 00:00:00 2001 From: SeonKoo Date: Wed, 1 Nov 2023 09:44:57 +0900 Subject: [PATCH 15/21] :wrench: Mentoring update --- lecture/Mentoring.swift | 13 ++++++++++--- 1 file changed, 10 insertions(+), 3 deletions(-) diff --git a/lecture/Mentoring.swift b/lecture/Mentoring.swift index 86a3a20..7b430e0 100644 --- a/lecture/Mentoring.swift +++ b/lecture/Mentoring.swift @@ -97,8 +97,10 @@ struct ContentView: View { Text("Helper text") .foregroundColor(checkButton == true ? .black : .red) }else{ - Text(checkEmail(str: email) == true ? "Helper text" : "이메일을 올바르게 입력해주세요") - .foregroundColor(checkButton == true ? .black : .red) + Text(validEmail == false ? "Helper text" : "이메일을 올바르게 입력해 주세요") + .foregroundColor(validEmail == false ? .black : .red) +// Text(checkEmail(str: email) == true ? "Helper text" : "이메일을 올바르게 입력해주세요") +// .foregroundColor(checkButton == true ? .black : .red) } Spacer() Text("") @@ -219,7 +221,12 @@ struct ContentView: View { .onSubmit { switch focusedField { case .email: - focusedField = .password + if checkEmail(str: email) == true{ + validEmail = false + focusedField = .password + }else{ + validEmail = true + } case .password: focusedField = nil default: From 982816ab07a88d2ee1a4b4ee98559d3aa51858ee Mon Sep 17 00:00:00 2001 From: SeonKoo Date: Thu, 2 Nov 2023 17:59:41 +0900 Subject: [PATCH 16/21] save 1 --- .../MovieDabang.xcodeproj/project.pbxproj | 4 + MovieDabang/MovieDabang/MovieDetailView.swift | 71 + lecture/23.09.21.swift | 365 +++++ lecture/23.09.22.swift | 341 +++++ lecture/23.09.25.swift | 506 +++++++ lecture/23.09.26.swift | 320 +++++ lecture/23.10.04.swift | 538 ++++++++ lecture/Mentoring.swift | 348 +++++ resume/cv/codelion.css | 105 ++ resume/cv/index.html | 56 + {ds => resume/ds}/codelion.css | 0 {ds => resume/ds}/index.html | 0 studyReview/main.swift | 1204 +++++++++++++++++ 13 files changed, 3858 insertions(+) create mode 100644 MovieDabang/MovieDabang/MovieDetailView.swift create mode 100644 lecture/23.09.21.swift create mode 100644 lecture/23.09.22.swift create mode 100644 lecture/23.09.25.swift create mode 100644 lecture/23.09.26.swift create mode 100644 lecture/23.10.04.swift create mode 100644 lecture/Mentoring.swift create mode 100644 resume/cv/codelion.css create mode 100644 resume/cv/index.html rename {ds => resume/ds}/codelion.css (100%) rename {ds => resume/ds}/index.html (100%) create mode 100644 studyReview/main.swift diff --git a/MovieDabang/MovieDabang.xcodeproj/project.pbxproj b/MovieDabang/MovieDabang.xcodeproj/project.pbxproj index 488556f..411d777 100644 --- a/MovieDabang/MovieDabang.xcodeproj/project.pbxproj +++ b/MovieDabang/MovieDabang.xcodeproj/project.pbxproj @@ -14,6 +14,7 @@ 09E7DC912AF37232004DE546 /* MovieDabangTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 09E7DC902AF37232004DE546 /* MovieDabangTests.swift */; }; 09E7DC9B2AF37232004DE546 /* MovieDabangUITests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 09E7DC9A2AF37232004DE546 /* MovieDabangUITests.swift */; }; 09E7DC9D2AF37232004DE546 /* MovieDabangUITestsLaunchTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 09E7DC9C2AF37232004DE546 /* MovieDabangUITestsLaunchTests.swift */; }; + 61BABE562AF38C7200ADBD59 /* MovieDetailView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 61BABE552AF38C7200ADBD59 /* MovieDetailView.swift */; }; /* End PBXBuildFile section */ /* Begin PBXContainerItemProxy section */ @@ -44,6 +45,7 @@ 09E7DC962AF37232004DE546 /* MovieDabangUITests.xctest */ = {isa = PBXFileReference; explicitFileType = wrapper.cfbundle; includeInIndex = 0; path = MovieDabangUITests.xctest; sourceTree = BUILT_PRODUCTS_DIR; }; 09E7DC9A2AF37232004DE546 /* MovieDabangUITests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = MovieDabangUITests.swift; sourceTree = ""; }; 09E7DC9C2AF37232004DE546 /* MovieDabangUITestsLaunchTests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = MovieDabangUITestsLaunchTests.swift; sourceTree = ""; }; + 61BABE552AF38C7200ADBD59 /* MovieDetailView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = MovieDetailView.swift; sourceTree = ""; }; /* End PBXFileReference section */ /* Begin PBXFrameworksBuildPhase section */ @@ -96,6 +98,7 @@ children = ( 09E7DC7F2AF3722E004DE546 /* MovieDabangApp.swift */, 09E7DC812AF3722E004DE546 /* ContentView.swift */, + 61BABE552AF38C7200ADBD59 /* MovieDetailView.swift */, 09E7DC832AF37232004DE546 /* Assets.xcassets */, 09E7DC852AF37232004DE546 /* Preview Content */, ); @@ -257,6 +260,7 @@ isa = PBXSourcesBuildPhase; buildActionMask = 2147483647; files = ( + 61BABE562AF38C7200ADBD59 /* MovieDetailView.swift in Sources */, 09E7DC822AF3722E004DE546 /* ContentView.swift in Sources */, 09E7DC802AF3722E004DE546 /* MovieDabangApp.swift in Sources */, ); diff --git a/MovieDabang/MovieDabang/MovieDetailView.swift b/MovieDabang/MovieDabang/MovieDetailView.swift new file mode 100644 index 0000000..01d4115 --- /dev/null +++ b/MovieDabang/MovieDabang/MovieDetailView.swift @@ -0,0 +1,71 @@ +// +// MovieDetailView.swift +// MovieDabang +// +// Created by 박선구 on 11/2/23. +// + +import SwiftUI + +struct MovieDetailView: View { + + struct Movie: Codable, Identifiable { + let id: Int + let title: String + let overview: String + let posterPath: String + let releaseDate: String + let voteAverage: Double + } + + @State var like : Bool = false + @Binding var movie : Movie +// let Movie = ["name" : "과속스캔들", "date" : "2007.11.14", "people" : "264K", "imageName" : "testImage"] + + var body: some View { + Form { + Section(content: { + Image(movie.overview) + .resizable() + .cornerRadius(12.0) + .aspectRatio(contentMode: .fit) + .padding() + + Text(movie.title) + .font(.largeTitle) + + Text(movie.releaseDate) + .font(.headline) + + Text("\(movie.voteAverage)") + .font(.headline) + Spacer() + HStack{ + Spacer() + Text("좋아요") +// Spacer() + Image(systemName: like == false ? "heart" : "heart.fill") + .resizable() + .frame(width: 30,height: 30) + .onTapGesture { + touchHeart() + } + .foregroundStyle(like ? .red : .gray) + .symbolEffect(.bounce, value: like) + } + .padding() + }) + } + } + func touchHeart() { + if like == false{ + like = true + }else{ + like = false + } + } +} + +#Preview { + MovieDetailView() +} diff --git a/lecture/23.09.21.swift b/lecture/23.09.21.swift new file mode 100644 index 0000000..b3e80a1 --- /dev/null +++ b/lecture/23.09.21.swift @@ -0,0 +1,365 @@ +// Created by 박선구 on 2023/09/21. + +import Foundation + +//MARK: - + +//print("아무말 입력: ", terminator: "") +// +//var input = Int(readLine()!)! +//print(input) + +//MARK: - + +//let orange: Int = 3729 +//let number: Int = 52 +// +//var box: Int = orange / number +//var left: Int = orange % number +//print("김모씨가 귤 박스를 줄 수 있는 박스의 수는? ",box) +//print("박스에 담고 남은 귤의 수는? ", left) + +//MARK: - + +//let num : Int = 456; +//var numnum : Int? +// +//numnum = ((num / 10) * 10) + 1 +//print(numnum!) + + +//MARK: - + +//print("swift", terminator: " ") +//print("ios", terminator: " ") +//print("web: ", terminator: " ") +// +//let swift : Int = Int(readLine()!)! +//let ios : Int = Int(readLine()!)! +//let web : Int = Int(readLine()!)! +//var sum = (swift + ios + web) +//var num = sum / 3 +// +//print("합계: ",sum) +//print("평균: ",num) + +//MARK: - + +//끔하게 (읽기 쉽게) +//print("swift", terminator: " ") +//let ios = Int(readLine()!)! +//print("ios", terminator: " ") +//let swift = Int(readLine()!)! +//print("web ", terminator: " ") +//let web = Int(readLine()!)! +// +//var sum: Int = ios + swift + web +//var avg = Float(sum) / 3.0 +// +//print("합", sum) +//print("평", avg) + +//MARK: - + +////연습 +//let x = 10 +//let y = 20 +// +//print("result", x > y ? "안녕" : "잘가") + + +//MARK: - + +////시간구하기 +//print("초 입력: ", terminator: " ") +//var stime = Int(readLine()!)! +//var mtime : Int = 0 +//var htime : Int = 0 +// +//mtime = (stime / 60) % 60 +//htime = (stime / 60) / 60 +//stime = stime % 60 +// +//print("시간", htime) +//print("분", mtime) +//print("초", stime) + +//MARK: - + +////노동시간 +//print("노동시간: ", terminator: " ") +//var times = Int(readLine()!)! +//var money : Double = 0 +//var overTime = (times - 8) +// +//if times > 8 { +// money = ((Double(overTime) * (5000*1.5)) + (8 * 5000.0)) +//}else{ +// money = Double(times) * 5000.0 +//} +//print("총 임금은", Int(money),"원 입니다.") + + +//MARK: - + +////짝수홀수 +//print("정수를 입력하세요: ", terminator: " ") +//let num = Int(readLine()!)! +// +//var num1 = num % 2 +//print(num1 >= 1 ? "홀수입니다." : "짝수입니다.") +//MARK: - + +// +////두 개의 정수 +//print("정수를 입력하세요: ", terminator: " ") +//let num1 = Int(readLine()!)! +//print("정수를 입력하세요: ", terminator: " ") +//let num2 = Int(readLine()!)! +// +//print("두 수의 차: ", num1 > num2 ? "\(num1 - num2)":"\(num2-num1)") + +//MARK: - + +//func inputLine(_ message: String) -> Int { +// print(message, terminator: " ") +// return Int(readLine()!)! +//} +//// +// +// +//print("초를 입력해주세요: ", terminator: " ") +//let total = Int(readLine()!)! +// +//let m = (total / 60) % 60 //분 구하기 초를 60으로 나누면 나머지가 분이다. +//let h = (total/60)/60 //시간 구하기 초를 60으로 나누고 한번더 60으로 나누면 초가 시간이 된다. +//let s = total % 60 //초는 전체초를 60으로 나누면 나온다. +//print(h , m, s) +//print("시간:",h ,"분:",m ,"초:" ,s) + +//MARK: - + +////농구공 상자 문제 +//print("공의 수를 입력해주세요: ", terminator: " ") +//let balls = Int(readLine()!)! +//var leftBall = 0 +//var boxs = 0 +// +//leftBall = balls % 5 +//boxs = balls / 5 +// +//print("공이 들어간 박스: ", boxs) +//print("남은 공: ", leftBall) +// +//if leftBall != 0 { +// boxs = boxs + 1 +// print("필요한 상자의 수: ", boxs) +//}else{ +// +// print("필요한 상자의 수: ", boxs) +//} +// +// +//print("필요한 상자의 수", leftBall != 0 ? "\(boxs = boxs + 1)": boxs) + + + +//MARK: - + +//경헌님 도움 +//print("예제 6") +//print("초 입력: ", terminator: "") +//var sec = Int(readLine()!)! +// +//var m = sec / 60 +//sec %= 60 +//let h = m / 60 +//m %= 60 +// +//print("\(h)시 \(m)분 \(sec)초") +//print("----------") + +//MARK: - + +////if문 예제 1 +//print("정수 입력: ", terminator: " ") +//let age = Int(readLine()!)! +// +//if age >= 20 { +// print("성인입니다.") +//}else{ +// print("어린이입니다.") +//} + +//MARK: - + +////조건문예제 2번 +//print("num 입력: ", terminator: " ") +//var num = Int(readLine()!)! +//var a = 0 ;var b = 0 +//a = num % 3 +//b = num % 5 +// +//if a == 0 && b == 0{ +// print("3과 5의 배수입니다.") +//}else{ +// print("3과 5의 배수가 아닙니다.") +//} + +//MARK: - + +////조건문예제 3번 +//print("grade 입력: ", terminator: " ") +//let grade = Int(readLine()!)! +// +//if grade >= 60{ +// print("합격입니다.") +//}else{ +// print("불합격입니다.") +//} + +//MARK: - + +////조건문예제 4번 +//print("정수 입력: ", terminator: " ") +//let num = Int(readLine()!)! +// +//if num > 0{ +// print(num, "양수입니다.") +//}else if num < 0{ +// print(num, "음수입니다.") +//}else { +// print(0,"입니다.") +//} + +//MARK: - + +//조건문예제 5번 +//print("정수 num1 입력: ", terminator: " ") +//let num1 = Int(readLine()!)! +//print("정수 num2 입력: ", terminator: " ") +//let num2 = Int(readLine()!)! +// +//if num1 > num2 { +// print(num1) +//}else if num1 < num2 { +// print(num2) +//}else{} + +//MARK: - +// # again + + +//////조건문예제 6번 +//print("1과목 소프트웨어 설계: ", terminator: " ") +//let num1 = Int(readLine()!)! +//print("2과목 소프트웨어 개발: ", terminator: " ") +//let num2 = Int(readLine()!)! +//print("3과목 데이터베이스 구축: ", terminator: " ") +//let num3 = Int(readLine()!)! +//print("4과목 프로그래밍 언어 활용: ", terminator: " ") +//let num4 = Int(readLine()!)! +//print("5과목 정보시스템 구축관리: ", terminator: " ") +//let num5 = Int(readLine()!)! +// +//var score = num1 + num2 + num3 + num4 + num5 +// +//if num1 < 8 { +// print("불합격입니다.") +//}else if num2 < 8 { +// print("불합격입니다.") +//}else if num3 < 8 { +// print("불합격입니다.") +//}else if num4 < 8 { +// print("불합격입니다.") +//}else if num5 < 8 { +// print("불합격입니다.") +//}else if score < 60 { +// print("불합격입니다.") +//}else{ +// print("합격입니다.") +//} + +//MARK: - + +/////디즈니랜드 입장료 +//print("나이를 입력해주세요: " , terminator: " ") +//let age = Int(readLine()!)! +//print("인원 수를 입력해주세요: " , terminator: " ") +//let num = Int(readLine()!)! +// +//var price : Int = 5000 +// +//if num > 1 { +// price = num * price +// print(price) +//}else if age < 18{ +// price = (price / 2) * num +// print(price) +//}else{} + +//MARK: - + +/////마트 계산대 +//print("구매하려는 상품 개수를 입력해주세요: ", terminator: " ") +//let num = Int(readLine()!)! +// +//var price = 10000 +// +//if num >= 11 { +// price = (num * price) - ((num * price)/10) //0.9를 곱해도 가능 +//// price = Int(Double(price)*0.9) * num +// print(price) +//}else { +// price = price * num +// print(price) +//} + +//MARK: - + +////input 함수 +//func inputLine(_ message: String) -> Int{ +// print(message, terminator: " ") +// return Int(readLine()!)! +//} +// + +//MARK: - + +////조건문 예제 9 학점출력 +// +//let grade = inputLine("grade를 입력해주세요 ") +// +//if grade > 90 { +// print("A학점입니다.") +//}else if grade > 80 && grade < 90{ +// print("B학점입니다.") +//}else{ +// print("C학점입니다.")} + + + + +//MARK: --- + +////지훈님 풀이 +//func inputLine(_ message: String) -> Int{ +// print(message,terminator: " ") +// return Int(readLine()!)! +//} +// var flag:Bool = true +// +// var A = inputLine("1과목 소프트웨어 설계") +// if A <= 8 && flag {flag=false} +// A = inputLine("2과목 소프트웨어 개발") +// if A <= 8 && flag {flag=false} +// A = inputLine("3과목 데이터베이스 구축") +// if A <= 8 && flag {flag=false} +// A = inputLine("4과목 프로그래밍 언어 활용") +// if A <= 8 && flag {flag=false} +// A = inputLine("5과목 정보시스템 구축관리") +// if A <= 8 && flag {flag=false} +// +// flag ? print("합격입니다."):print("불합격입니다.") + + diff --git a/lecture/23.09.22.swift b/lecture/23.09.22.swift new file mode 100644 index 0000000..aba43ee --- /dev/null +++ b/lecture/23.09.22.swift @@ -0,0 +1,341 @@ +// Created by 박선구 on 2023/09/23. +// 23.09.22 수업예제 + +import Foundation + +//MARK: - + +//// 조건문 예제 12번 +//// 월을 입력받아 봄, 여름, 가을, 겨울 중 맞는 계절을 알려주는 프로그램을 만드세요 +// +//print("월 입력: ", terminator: " ") +//let month = Int(readLine()!)! +// +//if month == 12 || month == 1 || month == 2{ +// print("\(month)월은 겨울입니다") +//}else if month == 3 || month == 4 || month == 5 { +// print("\(month)월은 봄입니다.") +//}else if month == 6 || month == 7 || month == 8 { +// print("\(month)월은 여름입니다.") +//}else if month == 9 || month == 10 || month == 11{ +// print("\(month)월은 가을입니다.") +//}else{ +// print("!!월을 적어주세요!!") +//} + +//MARK: - + +//// 조건문 예제 13번, 14번 +//// 금액을 입력하고 메뉴를 고른 뒤 잔돈을 출력 +//// 입력한 금액이 선택한 메뉴의 가격보다 부족하면 돈이 부족하다는 문장을 출력하세요. + +//print("금액을 입력해주세요: ", terminator: " ") +//let pay = Int(readLine()!)! +//var money = 0 +// +//if pay < 500 { +// print("구매가능한 메뉴가 없습니다.") +//}else{ +// print("메뉴를 입력해주세요.", "1. 콜라(800원)", "2. 생수(500원)", "3. 비타민워터(1500원)") +// let menu = Int(readLine()!)! +// +// switch menu { +// case 1: +// if pay > 800 { +// money = pay - 800 +// print("잔돈: \(money)원") +// }else{ +// print("구매하실 수 없습니다.") +// } +// case 2: +// print("잔돈: \(pay - 500)원") +// case 3: +// if pay > 1500 { +// money = pay - 1500 +// print("잔돈: \(money)원") +// }else{ +// print("구매하실 수 없습니다.") +// } +// default: +// print("오류") +// } +//} + +//MARK: - + +//// 조건문 예제 15 +//// 잔돈을 줄때 천원, 오백원, 백원을 몇 개 줘야 하는지 계산해보세요 + +//print("금액을 입력해주세요: ", terminator: " ") +//let pay = Int(readLine()!)! +//var money = 0 +// +//if pay < 500 { +// print("구매가능한 메뉴가 없습니다.") +//}else{ +// print("메뉴를 입력해주세요.", "1. 콜라(800원)", "2. 생수(500원)", "3. 비타민워터(1500원)") +// let menu = Int(readLine()!)! +// +// switch menu { +// case 1: +// if pay > 800 { +// money = pay - 800 +// var m1000 = money / 1000 +// var x = money % 1000 +// var m500 = x / 500 +// var y = x % 500 +// var m100 = y / 100 +// print("잔돈: \(money)") +// print("천원지폐: \(m1000)장, 500원: \(m500)개, 100원: \(m100)개") +// }else{ +// print("구매하실 수 없습니다.") +// } +// case 2: +// if pay > 500 { +// money = pay - 500 +// var m1000 = money / 1000 +// var x = money % 1000 +// var m500 = x / 500 +// var y = x % 500 +// var m100 = y / 100 +// print("잔돈: \(money)") +// print("천원지폐: \(m1000)장, 500원: \(m500)개, 100원: \(m100)개") +// }else{ +// print("구매하실 수 없습니다.") +// } +// case 3: +// if pay > 1500 { +// money = pay - 1500 +// var m1000 = money / 1000 +// var x = money % 1000 +// var m500 = x / 500 +// var y = x % 500 +// var m100 = y / 100 +// print("잔돈: \(money)") +// print("천원지폐: \(m1000)장, 500원: \(m500)개, 100원: \(m100)개") +// }else{ +// print("구매하실 수 없습니다.") +// } +// default: +// print("오류") +// } +//} + + +//MARK: - +// +//// 조건문 예제 15, 16 자판기 문제 +//// 추가본 + +//print("금액을 입력해주세요: ", terminator: " ") +//let pay = Int(readLine()!)! +// +//func getchange(_ money: Int) -> (Int, Int, Int){ +// var t = money / 1000 +// var fh = money % 1000 / 500 +// var h = money % 1000 % 500 / 100 +// print("천원: \(t)장, 오백원: \(fh)개, 백원: \(h)개") +// return (t, fh, h) +//} +// +// +//var money = 0 +// +//if pay < 500 { +// print("구매가능한 메뉴가 없습니다.") +//}else{ +// print("메뉴를 입력해주세요.", "1. 콜라(800원)", "2. 생수(500원)", "3. 비타민워터(1500원)") +// let menu = Int(readLine()!)! +// +// switch menu { +// case 1: +// if pay > 800 { +// money = pay - 800 +// getchange(money) +// print("잔돈: \(money)") +// }else{ +// print("구매하실 수 없습니다.") +// } +// case 2: +// if pay > 500 { +// money = pay - 500 +// getchange(money) +// print("잔돈: \(money)") +// }else{ +// print("구매하실 수 없습니다.") +// } +// case 3: +// if pay > 1500 { +// money = pay - 1500 +// getchange(money) +// print("잔돈: \(money)") +// }else{ +// print("구매하실 수 없습니다.") +// } +// default: +// print("오류") +// } +//} + +//MARK: - + +//// Sring 타입의 변수 data를 선언하고 키보드로 값을 입력 받으세요 +//// switch ~ case 문 사용 + +//(다시 해보기) +//대답하는 기계 (경헌님 코드) + +//func inputLineString(_ message: String) -> String{ +// print(message, terminator: " ") +// return String(readLine()!) +//} + +////let hi = inputLineString("user:") + +//print("입력: ",terminator: "") +//let greeting = (readLine()) +// +//switch greeting { +//case "hello": +// print("mac: 네, 안녕하세요!") +//case "nice meet you.": +// print("mac: 네, 반가워요!") +//case "bye": +// print("mac: 네, 수고하세요.") +//default: +// print("mac: ?") +//} + +//MARK: - + +//// while 예제 1 +//// while문을 사용하여 키보드로부터 입력 받은 수가 10보다 작을 때만 계속 정수를 입력 받으세요. + +//var numIn = 0 +// +//while numIn < 10 { +// print("정수입력: ", terminator: "") +// numIn = Int(readLine()!)! +//} +//print("종료되었습니다.") + +//MARK: - + +//// while 에졔 2 +//// 다이어트 관리 프로그램 +//// 현재 몸무게와 목표 몸무게를 입력 받고 주차 별 감량 몸무게를 입력 받으세요 +//// 목표 몸무게를 달성하면 축하한다는 문구를 출력 하고 입력을 멈추세요! + +//print("현재 몸무게: ", terminator: "") +//var pWeight = Int(readLine()!)! +// +//print("목표 몸무게: ", terminator: "") +//let fWeight = Int(readLine()!)! +// +//var weak = 0 +// +//while pWeight > fWeight { +// weak += 1; +// print("\(weak)주차 감량 몸무게: ", terminator: "") +// var mWeight = Int(readLine()!)! +// +// pWeight = pWeight - mWeight +// +// if pWeight <= fWeight { +// break +// } +// +//} +//print("\(pWeight)kg 달성! 축하합니다!") + +//MARK: - + +//// while문 예제 3, 4번 +//// 로그인이 실패했을 경우에 계속 입력, 성공하면 종료 +//// +// +//let userID : String = "Hello" +//let password : Int = 1234 +// +//while true{ +// print("userID: ", terminator: "") +// let inputUserID = (readLine()!) +// print("password: ", terminator: "") +// let inputPassword = Int(readLine()!)! +// +// if inputUserID == userID && inputPassword == password { +// print("로그인 성공!") +// break +// }else{ +// print("아이디 또는 비밀번호가 잘못되었습니다.") +// } +//} + +//MARK: - + +////while 예제5 LOGIN 프로그램 +//// (아이디와 비밀번호가 틀렸을 경우 "계속 하시겠습니까?" 라는 문장을 출력) +// +//let userID : String = "Hello" +//let password : Int = 1234 +// +//while true{ +// print("ID를 입력해 주세요: ", terminator: "") +// let inputUserID = (readLine()!) +// print("비밀번호를 입력해 주세요: ", terminator: "") +// let inputPassword = Int(readLine()!)! +// +// if inputUserID == userID && inputPassword == password { +// print("로그인 성공!") +// break +// }else{ +// print("아이디 또는 비밀번호가 잘못되었습니다.") +// print("계속 하시겠습니까? (Y/N) : ", terminator: "") +// let answer = (readLine()!) +// if answer == "Y" { +// continue +// }else if answer == "N"{ +// break +// } +// } +//} + +//MARK: - + +//// while문 예제 6번 계산기 프로그램 +////두 정수를 입력받고 연산하기, 결과 출력 후 "계속 하시겠습니까?"를 출력 +////Yes 와 No 중, Yes면 반복문 다시실행 +// +//while true { +// print("첫 번째 정수를 입력하세요: ", terminator: "") +// let num1 = Int(readLine()!)! +// print("두 번째 정수를 입력하세요: ", terminator: "") +// let num2 = Int(readLine()!)! +// +// print("1.더하기 2.빼기 : ", terminator: "") +// let sm = Int(readLine()!)! +// +// switch sm { +// case 1: +// var sum : Int = 0 +// sum = num1 + num2 +// print("더하기 연산 결과는 \(sum)입니다.") +// case 2: +// var minus : Int = 0 +// minus = num1 - num2 +// print("빼기 연산 결과는 \(minus)입니다.") +// default: +// print("종료되었습니다.") +// } +// print("다시 실행 하시겠습니까? (Y/N) : ", terminator: "") +// let answer = String(readLine()!) +// if answer == "Y" { +// print("\n"); continue +// }else if answer == "N"{ +// break +// }else{ +// break +// } +//} + + diff --git a/lecture/23.09.25.swift b/lecture/23.09.25.swift new file mode 100644 index 0000000..7b79837 --- /dev/null +++ b/lecture/23.09.25.swift @@ -0,0 +1,506 @@ +// Created by 박선구 on 2023/09/25. + +import Foundation + +//MARK: - + +//MARK: 랜덤숫자게임 + +//var fn = Int.random(in: 0...20) +//var sn = Int.random(in: 0...20) +//var sum = fn + sn +// +//print("== Plus Game ==") +// +//print("\(fn) + \(sn) = ", terminator: "") +//let num = Int(readLine()!)! +// +//if sum == num { +// print("Success!") +//}else{ +// print("Fail!") +//} + +//MARK: - + +//MARK: 랜덤숫자 게임 7-1 + + + +// var fn = Int.random(in: 0...20) +// var sn = Int.random(in: 0...20) +// var sum = fn + sn +// +// print("== Plus Game ==") +// +//while true{ +// print("\(fn) + \(sn) = ", terminator: "") +// let num = Int(readLine()!)! +// +// if sum == num { +// print("Success!") +// print("계속 하시겠습니까? (Y/N): ", terminator: "") +// let play = readLine() +// if play == "N" { +// break +// } +// }else{ +// print("Fail!") +// print("계속 하시겠습니까? (Y/N): ", terminator: "") +// let play = readLine() +// if play == "N" { +// break +// } +// } +//} +//MARK: - + +//MARK: 랜덤숫자게임 7-2 (다시하기) + +//while true { +// var fn = Int.random(in: 0...20) +// var sn = Int.random(in: 0...20) +// var sum = fn + sn +// +// print("== Plus Game ==") +// +// print("\(fn) + \(sn) = ", terminator: "") +// let num = Int(readLine()!)! +// +// switch sum == num { +// case true : print("Success!") +// print("계속 하시겠습니까? (Y/N): ", terminator: "") +// let play = readLine() +// if play == "Y" { +// break +// } +// case false : print("Fail!") +// print("계속 하시겠습니까? (Y/N): ", terminator: "") +// let play = readLine() +// if play == "Y" { +// print("\(fn) + \(sn) = ", terminator: "") +// let num = Int(readLine()!)! +// }else { +// break +// } +// } + +// if sum == num { +// print("Success!") +// }else{ +// print("Fail!") +// } +// print("계속 하시겠습니까? (Y/N): ", terminator: "") +// let play = readLine() +// +// if play == "Y" { +// print("\n") +// continue +// }else{ +// break +// } +//} + + +//MARK: - + +//MARK: 랜덤숫자게임 7-2 + +//while true { +// var fn = Int.random(in: 0...20) +// var sn = Int.random(in: 0...20) +// var sum = fn + sn +// +// print("== Plus Game ==") +// +// print("\(fn) + \(sn) = ", terminator: "") +// let num = Int(readLine()!)! +// +// if sum == num { +// print("Success!") +// }else{ +// print("Fail!") +// } +// print("계속 하시겠습니까? (Y/N): ", terminator: "") +// let play = readLine() +// +// if play == "Y" { +// print("\n") +// continue +// }else{ +// break +// } +//} + +//MARK: - + +//MARK: for 문 00 +// +//for i in 53...96 { +// print(i) +//} + +//for 문 00-1 + +//let j = 21...57 +// +//for a in j where a % 2 != 0{ //where를 이용하여 조건을 넣는다. +// print(a) +//} +// + +//for 문 00-2 + + +//1~100까지 3의 배수의 합을 출력하세요. (1683) +//var num = 0 +//for i in 1...100 { +// if i % 3 == 0 { +// num += i +// } +//} +//print(num) + + +//MARK: - + + +//MARK: for 문 3 + +//for i in 1...9 { +// print("2 * \(i) = \(2 * i)") +//} + +//MARK: - + +//MARK: for 문 한 개의 자연수를 입력 받아 그 수의 배수를 차례로 10개 출력하는 프로그램을 작성하시오. + +//print("정수 입력: ", terminator: "") +//let num = Int(readLine()!)! +// +//var a = 1...10 +// +//for i in 1...10 { +// print("\(num * i)") +//} + +//MARK: - + +//let j = 21...57 +// +//for a in j where a % 2 != 0{ //where를 이용하여 조건을 넣는다. +// print(a) +//} +// +//for i in 21...57 { +// if i % 2 != 0 { +// print(i) +// } +//} + +//MARK: - + +//print("정수입력: ", terminator: "") +//let num = Int(readLine()!)! +// +//for i in 1...num { +// print(i) +//} + +//MARK: - + +//MARK: for문 예제 4 + +//print("정수 입력: ", terminator: "") +//let number = Int(readLine()!)! +// +//for a in 1...9{ +// print("\(number) * \(a) = \(number * a)") +//} + + +//MARK: - + +//MARK: for문 예제 5 + +//for a in 2...9{ +// print("\n===\(a)단===") +// for i in 1...9 { +// print("\(a) * \(i) = \(a * i)") +// } +//} + +//MARK: - + +//MARK: for문 예제 6 +// +//for a in 2...9{ +// print("\n\(a)단: ", terminator: "") +// for i in 1...9 { +// print("\(a) * \(i) = \(a * i) ", terminator: " ") +// } +//} + +//MARK: - + +//MARK: for문 예제 7 + +//print("정수입력: ", terminator: "") +//let number = Int(readLine()!)! +// +//print("\(number)의 약수 : ", terminator: "") +//for q in 1...number { +// if number % q == 0 { +// print("\(q)", terminator: " ") +// if q == number { +// print("\n") +// } +// } +//} + +//MARK: - + +//MARK: for문 예제 8 + +//for i in 2...30 { +// print("\n\(i)의 약수: ", terminator: "") +// for a in 1...30 { +// if i % a == 0 { +// print(a ,terminator: " ") +// if a == 30 { +// print("\n") +// } +// } +// } +//} + +//MARK: - + +//MARK: for 예제 9-1 +// +//var p = 0 +// +//for _ in 1...5{ +// print("") +// p += 1 +// for i in 1...p { +// print("*", terminator: "") +// if i == 5 { +// print("\n") +// } +// } +//} + +//MARK: - + +//MARK: for문 예제 9-2 +// +//var p = 5 +// +//for some in 1...5{ +// print("") +// p -= 1 +// for _ in 0...p { +// print("*", terminator: "") +// if some == 5 { +// print("\n") +// } +// } +//} + +//MARK: - + +//MARK: for문 예제 9-3 +// +//var o = 5 +//var p = 0 +//var k = 1...6 +// +//for some in k{ +// print("") +// p += 1 +// o -= 1 +// for _ in 0...o { +// print(" ", terminator: "") +// } +// for _ in 1...p { +// print("*", terminator: "") +//// if some == 5 { +//// print("\n") +//// } +// } +//} + + +//MARK: - +//MARK: 별찍기 1 (수정) + +// +//for i in (1...5).reversed() { +// print("") +// for _ in 1...i{ +// print("*", terminator: "") +// } +// for _ in 1...i{ +// print(" ", terminator: "") +// } +//} +//MARK: - +//MARK: 별찍기 2 (수정) + +//for i in (1...5).reversed() { +// print("") +// for _ in 1...i{ +// print("*", terminator: "") +// } +// for _ in 1...i{ +// print(" ", terminator: "") +// } +//} + +//MARK: - +//MARK: 별찍기3 (수정) + +//for i in (1...5).reversed() { +// print("") +// for _ in 1...i{ +// print(" ", terminator: "") +// } +// for _ in i...5{ +// print("*", terminator: "") +// } +//} + +//MARK: - +//MARK: 별찍기 다이아 (수정) + +//for i in (1...5).reversed(){ +// print("") +// for _ in 1...i{ +// print(" ", terminator: "") +// } +// for _ in i...5{ +// print("*", terminator: "") +// } +// for _ in i...5{ +// print("*", terminator: "") +// } +//} +// +//for i in 1...5 { +// print("") +// for _ in 1...i{ +// print(" ", terminator: "") +// } +// for _ in (i...5).reversed() { +// print("*", terminator: "") +// } +// for _ in i...5 { +// print("*", terminator: "") +// } +// +//} +//print("\n") + + +//MARK: - + +//MARK: 369 게임 (다시하기) + +//for i in 0...99{ +// print(i) +// while i % 3 == 0 { +// print("*") +// }break +//} + +//MARK: - +// 창준님 코드 + +//func forExercise10() { +// for num in 0...99 { +// var strNum = String(format: "%02d", num) +// var tmp = "" +// for s in strNum { +// if let intS = Int(String(s)), intS != 0, intS % 3 == 0 { +// tmp += "*" +// } +// } +// strNum += tmp +// tmp = "" +// print(strNum) +// } +//} + +//MARK: - + +// 경헌님 코드 + +for i in 0...9 { + for j in 0...9 { + // 여기서 부터 + print("\(i)\(j)", terminator: "") + var cnt = 0 + if (i != 0 && i % 3 == 0) { + cnt += 1 + } + + if (j != 0 && j % 3 == 0) { + cnt += 1 + } + + for _ in 0.. Int { +// fm + sm +//} +// +// +//print("1번째 수: ", terminator: "") +//var a = Int(readLine()!)! +//print("2번째 수: ", terminator: "") +//var b = Int(readLine()!)! +// +//print("연산결과: \(addNumber(fm: a, sm: b))") + +//MARK: - +//MARK: 함수예제 2 + +//func largerNumbers(fm : Int, sm : Int) { +// if fm > sm { +// return print("결과확인: ",fm) +// }else if fm == sm{ +// return print("0") +// }else { +// return print("결과확인: ",sm) +// } +//} +// +//print("1번째 수: ", terminator: "") +//let a = Int(readLine()!)! +//print("2번째 수: ", terminator: "") +//let b = Int(readLine()!)! +// +//largerNumbers(fm: a, sm: b) + +//MARK: - +//MARK: 함수예제 2 (강사님ver) + +//func largerNumbers (a: Int , b: Int) -> Int{ +// if a == b { +// return 0 +// } +// return a > b ? a : b +//} +// +//print("1번째 수: ", terminator: "") +//let a = Int(readLine()!)! +//print("2번째 수: ", terminator: "") +//let b = Int(readLine()!)! +// +//let c = largerNumbers(a: a, b: b) +//print("큰 수 확인: \(c)") + +//MARK: - +//MARK: 함수예제 3 + +//func close10(num1 : Int, num2 : Int) { +// if abs(10 - num1) > abs(10 - num2) { +// return print("10에 가까운 수: \(num2)") +// }else if abs(10 - num1) == abs(10 - num2) { +// return print("10에 가까운 수: 0") +// }else{ +// return print("10에 가까운 수: \(num1)") +// } +//} +// +//print("1번째 수: ", terminator: "") +//let a = Int(readLine()!)! +//print("2번째 수: ", terminator: "") +//let b = Int(readLine()!)! +// +//close10(num1: a, num2: b) + +//MARK: - +//MARK: 함수예제 4 + +//func powerN(base: Int, n: Int) { +// var result = 0 +// +// result = Int(pow(Float(base), Float(n))) //pow = 제곱 +// return print("결과 확인: \(result)") +//} +// +//print("1번째 수: ", terminator: "") +//let a = Int(readLine()!)! +//print("2번째 수: ", terminator: "") +//let b = Int(readLine()!)! +// +//powerN(base: a, n: b) + +//MARK: - +//MARK: 함수예제 5 + +//func getAbsoluteValue(num1 : Int, num2 : Int) { +// var result = 0 +// result = num1 - num2 +// return print("결과 확인: \(abs(result))") +//} +// +//print("1번째 수: ", terminator: "") +//let a = Int(readLine()!)! +//print("2번째 수: ", terminator: "") +//let b = Int(readLine()!)! +// +//getAbsoluteValue(num1: a, num2: b) + +//MARK: - +//MARK: 함수예제: 6 +//두 개의 정수를 인자(매개변수)로 넘겨받아 앞의 정수가 뒤의 정수로 나누어지는지를 판별하는 isDivide( ) 를 작성하세요. + +//func isDivide(a : Int, b : Int) -> Bool{ +// if b == 0{ +// return false +// } +// return (a % b == 0) +//} +//print("1번째 수: ", terminator: "") +//let a = Int(readLine()!)! +//print("2번째 수: ", terminator: "") +//let b = Int(readLine()!)! +// +//let c : Bool = isDivide(a: a, b: b) + + +//MARK: - +//MARK: 함수예제 7 (보충필요) +//약수를 구하는 getDivisor() 를 구현하세요 + +//func getDivisor(num : Int) { +// print("\(num)의 약수: ", terminator: "") +// for q in 1...num { +// if num % q == 0 { +// print("\(q)", terminator: " ") +// if q == num { +// print("\n") +// } +// } +// } +//} +// print("정수입력: ", terminator: "") +// let a = Int(readLine()!)! +// +// getDivisor(num: a) +// +// +// +//MARK: - +//MARK: 함수예제 7 (강사님ver) + +//func getDivisor (a: Int) -> String { +// var str = "\(a)의 약수: " +// for i in 1...a { +// if isDivide(a: a, b: i) { +// str += "\(i) " +// } +// } +// return str +//} +// +//print("정수 입력: ", terminator: "") +//let a = Int(readLine()!)! +// +//let c: String = getDivisor(a: a) +//print(c) + +//MARK: - +//MARK: 함수예제 8 (강사님Ver) +//func getSumofDivisors(a: Int) -> Int { +// var sum = 0 +// for i in 1...a { +// if isDivide(a: a, b: i) { +// sum += i +// } +// } +// return sum +//} + +//let a: Int = 10 +// +//let c: Int = getSumofDivisors(a: a) +//print("\(a)의 약수의 합: \(c)") + +//MARK: - +//MARK: 함수예제 9 (보충필요) +//startValue...endValue까지의 숫자 중 완전수를 출력하는 getPerfectNumber() 를 구현하세요 +//완전수 = 자신을 제외한 약수들의 합이 자신인 것 +// +//let a: Int = 100 +//let b: Int = 41 +// +//var str = "" +//for i in 2...1000{ +// let c: Int = getSumofDivisors(a: i) +// if c - a == a{ +// str += "\(i) " +// } +//} +//print(str) + +//MARK: - +//MARK: 함수예제 10 + +//권지원님 코드 +//func getPrimeNumber(first: Int, last: Int) { +// print("\(first)~\(last)까지의 소수: " ,terminator: "") +// for i in first...last { +// var result = "F" +// if i == 2 { +// +// } else { +// for j in 2...(i-1) { +// if i % j == 0 { +// result = "T" +// break +// } +// } +// } +// if result == "F" { +// print(i, terminator: " ") +// } +// } +// print() +//} +// +//getPrimeNumber(first: 2, last: 30) + +//MARK: - +//MARK: 클래스 + +//class piggbank { +// var bank = 0 +// func inputMoney(money: Int) -> Int { //입금 +// showMoney() +// if money > 0 { +// bank += money +// return bank +// }else{ +// return bank +// } +// } +// func outputMoney(bMoney: Int) -> String { //출금 +// showMoney() +// if bMoney > 0 && bank > bMoney{ +// bank -= bMoney +// return String(bank) +// }else if bank < bMoney{ +// return "잔액이 부족합니다." +// }else{ +// return String(0) +// } +// } +// func showMoney(){ //현재 잔액 +// print("현재 잔액: \(bank)") +// } +//} +// +//let a : Int = 15000 +//let b : Int = 9000 +// +//let myBank = piggbank() +//print("입금:\(a), 현재잔액: \(myBank.inputMoney(money: a))\n") +//print("출금:\(b), 현재잔액: \(myBank.outputMoney(bMoney: b))\n") + +//MARK: - +//MARK: 객체를 이용하여 입력된 학생의 정보를 출력하기 + +//let student1 = Student(name: "홍길동", number: "20200677", age: 22, scoreSwift: 50, scoreiOS: 89, scoreWeb: 77) +//let student2 = Student(name: "김영희", number: "20190541", age: 26, scoreSwift: 90, scoreiOS: 85, scoreWeb: 70) +// +//class Student { +// var name: String +// var number: String +// var age: Int +// var scoreSwift: Int +// var scoreiOS: Int +// var scoreWeb: Int +// +// init(name: String, number: String, age: Int, scoreSwift: Int, scoreiOS: Int, scoreWeb: Int) { +// self.name = name +// self.number = number +// self.age = age +// self.scoreSwift = scoreSwift +// self.scoreiOS = scoreiOS +// self.scoreWeb = scoreWeb +// } +// func show() { +// print("\(name)님 안녕하세요") +// print("[ \(number), \(age)살 ]") +// print("\(name)님의 Swift 점수는 \(scoreSwift)점 입니다.") +// print("\(name)님의 iOS 점수는 \(scoreiOS)점 입니다.") +// print("\(name)님의 Web 점수는 \(scoreWeb)점 입니다.") +// print("=======================================\n") +// } +//} +// +//student1.show() +//student2.show() diff --git a/lecture/23.10.04.swift b/lecture/23.10.04.swift new file mode 100644 index 0000000..3e9d392 --- /dev/null +++ b/lecture/23.10.04.swift @@ -0,0 +1,538 @@ +// Created by 박선구 on 2023/09/27. + +import Foundation + + +//MARK: - +//MARK: 0927 +//MARK: 객체지향 class 예제 1 (강사님 ver) +// 예제 1번 + +class Student { + var name: String = "" + var number: String = "" + var age: Int = 0 + var scoreSwift: Int = 0 + var scoreiOS: Int = 0 + var scoreWeb: Int = 0 + + func show() -> String{ + return "\(name)" + } +} + +//예제 2번 +let student1: Student = Student() +student1.name = "홍길동" +student1.number = "20200677" +student1.age = 22 +student1.scoreSwift = 50 +student1.scoreiOS = 89 +student1.scoreWeb = 77 + +let student2: Student = Student() +student2.name = "김영희" +student2.number = "20190541" +student2.age = 26 +student2.scoreSwift = 90 +student2.scoreiOS = 85 +student2.scoreWeb = 70 + +//예제 3번 +//print(student1.show()) +//print("=============") +//print(student2.show()) + + +//MARK: - +//MARK: class 예제 4 (강사님 ver) + +class Person { + private var name : String //private 외부에서 변수에 접근하는것을 방지 (접근제한자) + private var age : Int + + init() { //default값을 만들어보기 (오버로딩) + name = "이름없음" + age = 0 + } + + init(name: String, age: Int) { + self.name = name + self.age = age + } + + func getName() -> String { + return name + } + + func setName(name: String) { + self.name = name + } + func getAge() -> Int{ + return age + } + func setAge(age: Int) { + self.age = age + } + func show() -> String{ + return "이름: \(name), 나이: \(age)" + } +} + +//예제 4-1 +let st0 = Person() //Default값 (오버로딩) +let st1 = Person(name: "홍길동", age: 25) //init을 사용했기 때문에 따로 초기화를 해줘야 한다. +let st2 = Person(name: "김영희", age: 27) + +//print("(st1 객체 학생) \(st1.show())") +//print("(st2 객체 학생) \(st2.show())") +//print("(st 객체 학생) \(st0.show())") + +//MARK: - +//예제 5 + + + +//MARK: class 예제 5-1 (강사님 ver) + +class Calculator { + var num1 : Int + var num2 : Int + init() { + num1 = 0 + num2 = 0 + } + init(num1: Int, num2: Int) { + self.num1 = num1 + self.num2 = num2 + } + func sum() -> Int { + return num1 + num2 + } + func sub() -> Int{ + return num1 - num2 + } + func div() -> Int{ + return num1 / num2 + } + func mul() -> Int{ + return num1 * num2 + } + func setNum1(num1: Int) { + self.num1 = num1 + } + func setNum2(num2: Int) { + self.num2 = num2 + } +} + +let cal = Calculator(num1: 2, num2: 7) +cal.setNum1(num1: 10) +cal.setNum2(num2: 20) +let sum : Int = cal.sum() +let c = cal.sub() +//print(sum, c, cal.mul(), cal.div()) + +//MARK: - +//MARK: class 예제 06 + +class TV { + var name: String + var year: Int + var size: Int + + init(name: String, year: Int, size: Int) { + self.name = name + self.year = year + self.size = size + } + + func show() -> String{ + return "\(name)에서 만든 \(year)년형 \(size)인치 TV" + } +} + +let myTv = TV(name: "LG", year: 2023, size: 48) +//print(myTv.show()) + +//MARK: - +//MARK: class 별찍기 + +class makeStar { + func reverStar() { + for i in (1...10).reversed(){ + print("") + for _ in 1...i{ + print(" ", terminator: "") + } + for _ in i...10{ + print("*", terminator: "") + } + for _ in i...10{ + print("*", terminator: "") + } + } + } + func Star() { + for i in 1...10 { + print("") + for _ in 1...i{ + print(" ", terminator: "") + } + for _ in i...10 { + print("*", terminator: "") + } + for _ in i...10 { + print("*", terminator: "") + } + + } + } +} + +let star = makeStar() +//star.reverStar() +//star.Star() +//print("\n") + +//MARK: - +//MARK: class 별찍기 (강사님 ver) +class Shape { + var size : Int = 1 + + init(size: Int) { + self.size = size + } + + func printShape(start: Int, end: Int, shape: String) -> String{ + var result: String = "" + for _ in start...end { + result += shape + } + return result + } + func drawShape() -> String{ + var str = "" + for i in 1...size { + str = printShape(start: 1, end: i, shape: "*") + "\n" + } + return str + } + + func invdrawShape() -> String { + var str = "" + for i in (1...size).reversed() { + str = printShape(start: 1, end: i, shape: "*") + "\n" + } + return str + } +} + +let shape = Shape(size: 10); +//print(shape.drawShape() + shape.invdrawShape()) + +//MARK: - +//MARK: 배열 + +var items = [8,9,10,11,12,15] //배열 생성 + +var sumItems = 0 +for i in items { //items의 전체 합 + sumItems += i +} + +print(sumItems) + +//배열 인덱스의 항목위치를 참조하여 접근 +items[0] = 10 //0번째 배열에 10넣기 +print("0번째 인덱스의 값은: ",items[0]) //0번째 + +//문자열을 갖는 배열 +var strArray: [String] = ["nice", "to", "meet", "you"] + + +//빈배열 생성 +//var 변수명: [타입] = [] +//var 변수명 = [타입]() + + +//기본값과 크기를 미리 설정하여 초기화 +var nameArray = [String](repeating: "no Name", count: 10 ) +print("nameArray 배열 항목 개수: ",nameArray.count) +print("nameArray 빈배열인가?: ",nameArray.isEmpty) + +// 배열을 결합하여 새로운 배열 생성 : 같은 타입이라고 가정 +print(strArray + nameArray) + +// 배열 항목 섞기 +let shuffledArray = strArray.shuffled() +print(strArray) //섞기 전 +print(shuffledArray) //섞은 후 + +//배열 항목 무작위 접근 +print(strArray.randomElement()!) + +//배열에 항목 추가하기 +strArray.append("PLEASE") +print(strArray) + +strArray += ["HEY", "What"] +print(strArray) + +// 배열 항목을 특정 위치에 추가 +strArray.insert("jkl", at: 0) +print("strArray의 0번째 위치에 jkl 추가:", strArray) + +// 배열 항목 삭제 +// 배열 인덱스 위치에서 삭제 +print( strArray.remove(at: 0) ) +print("strArray의 0번째 위치 항목 삭제:", strArray) + +// 배열 마지막 항목 삭제 +print( strArray.removeLast() ) + +// 배열 모두 삭제 +print( strArray.removeAll() ) +print( strArray ) +print("=====================\n") + + +//MARK: - +//MARK: 배열 예제 1 + +// 1.정수형 데이터를 담을 수 있는 배열 array를 선언하세요 +// 2.정수형 데이터 10개를 담을 수 있도록 array배열을 생성하세요 +// 3.각각의 인덱스에 1~20까지의 랜덤수를 초기화하세요 +// 4.배열array의 각각에 인덱스에 들어있는 모든 데이터를 출력하세요. +// 5.4번째 인덱스에 들어있는 값과 9번째 인덱스에 들어있는 값을 더하여 결과 값을 출력하세요 +// 6.각각의 인덱스에 들어있는 데이터를 모두 더하여 결과 값을 출력하세요 +// 7.배열 안에 있는 수의 평균을 구하여 출력하세요 + +var array : [Int] = [1,2,3,4,5,6,7,8,9,10] //1,2 + +for _ in 1...10 { //3 + let a = Int.random(in: 0...9) + let b = Int.random(in: 1...20) + array[a] = b +} +print(array) //4 +print(array[4] + array[9]) //4번째와 9번째의 합 //5 + +var sumArray = 0 +for i in array { //array의 전체 합 //6 + sumArray += i +} +print(sumArray) + +var avg: Float = Float(sumArray) / 10 //7 +print(avg) + +//MARK: - +//MARK: 배열 예제 2 +//배열의 값 중 짝수인 값이 몇 개인지 출력하는 프로그램을 작성하세요 + +//var p = array[0] % 2 +//var result = [Int]() +// +//for i in 0...9{ +// p = array[i] % 2 +// if p == 0 { +// result.append(array[i]) //append = 배열 항목 추가 +// } +//} +//print("array에 들어있는 짝수는 \(result)입니다.") + +//MARK: - +//MARK: 배열 예제 3 +//배열의 값 중 홀수인 값이 몇 개인지 출력하는 프로그램을 작성하세요 + +var p = array[0] % 2 +var result = [Int]() + +for i in 0...9{ + p = array[i] % 2 + if p != 0 { + result.append(array[i]) + } +} +print("array에 들어있는 홀수는 \(result)이며, 총 \(result.count)개 입니다.") + + +//MARK: - +//MARK: 배열 예제 4 +//배열의 값 중 가장 큰 값을 찾아 출력하는 프로그램을 작성하세요 + +let maxArray = array.max()! //max는 배열안에 있는 값중 최댓값을 찾는다. +print("가장 큰 값은 \(maxArray)입니다.") + +//MARK: - +//MARK: 배열 예제 5 +//배열의 값 중 가장 작은 값을 찾아 출력하는 프로그램을 작성하세요 + +let minArray = array.min()! //min은 배열안에 있는 값중 최솟값을 찾는다. +print("가장 작은 값은 \(minArray)입니다.") + +//MARK: - +//MARK: 배열 예제 6 (다시해보기) +//숫자를 입력받아 짝수인 4의 경우 “수박수박”, 홀수인 3의 경우 “수박수“ 를 출력하는 프로그램을 작성하세요 + +//var stArray : [String] = ["수","박"] +//print("=== 수박 게임 시작! ===") +//print("숫자를 입력해주세요: ", terminator: "") +//let number = Int(readLine()!)! +// +//var resArr = "" +// +//for i in 1...number { +// let indexArray = (i - 1) % 2 // 짝수면 0 홀수면 1 저장 +// resArr += stArray[indexArray] // +//} +//print(resArr) + +//MARK: - +//MARK: 배열 예제 7 +//1차원 정수형 배열을 선언한 후 10개의 공간으로 생성합니다 +//숫자를 입력 받아 3의 배수인 숫자를 출력하는 프로그램을 작성하세요 + +//var array7 = [Int](repeating: 0, count: 10) +//var result7 = [Int]() +// +// +//for i in 1...10{ +// print("\(i)번째 정수 입력: ", terminator: "") +// let inputNum = Int(readLine()!)! +// array7.remove(at: i-1) +// array7.insert(inputNum, at: i-1) +// +// var num7 = array7[i-1] % 3 +// if num7 == 0{ +// result7.append(array7[i-1]) +// } +//} +// +//print("3의 배수:", terminator:" ") +//for j in result7 { +// print(j, terminator:" ") +//} +////print("3의 배수: \(result7.map {String($0)}.joined(separator: " "))") //또 다른 방법 + +//MARK: - +//MARK: 배열 예제 8 +//다음과 같이 정답이 있을 때 사용자로부터 답을 입력받아 결과를 출력하고 총점을 출력하는 프로그램을 작성하세요 + +//var answer8 : [Int] = [1, 1, 4, 2, 3] +//var myAnswer = [Int]() +//var point = 0 +// +//for i in 1...5{ +// print("\(i)번답: ", terminator: "") +// myAnswer.insert(Int(readLine()!)!, at: i-1) +//} +// +//for j in 1...5{ +// if answer8[j-1] == myAnswer[j-1] { +// print("O", terminator: " ") +// point += 20 +// }else{ +// print("X", terminator: " ") +// } +// if j == 5{ +// print("총점: \(point)") +// } +//} + +//MARK: - +//MARK: 배열 예제 9 +//배열의 (인덱스) 값 만큼 별을 출력해보세요 + +//var array9 : [Int] = [1,2,3,2,1] +var array9 = [Int]() + +print("입력 횟수: ", terminator: "") +let inputNum = Int(readLine()!)! + +for _ in 1...inputNum{ + print("별의 갯수 입력: ", terminator: "") + let stars = Int(readLine()!)! + array9.append(stars) +} + +for i in 1...array9.count { + print("") + print("\(array9[i-1]): ", terminator: "") + if array9[i-1] != 0 { + for _ in 1...array9[i-1] { + print("*", terminator: "") + } + } + if i >= array9.count { + print("\n") + } +} + +//MARK: - +//MARK: 스택 예제 1 (강사님 ver) +//func checkParentheses(_ input: String) -> Bool { +// +// var stack: [Character] = [] +// for char in input { +// if char == "(" || char == "{" || char == "["{ +// stack.append(char) +// } else if char == ")" || char == "}" || char == "]"{ +// if stack.isEmpty { +// return false +// } +// +// let top = stack.popLast() +// if (char == ")" && top != "(") || (char == "}" && top != "{") || (char == "]" && top != "[") { +// return false +// } +// } +// } +// +// return stack.isEmpty +//} +// +//print( checkParentheses("()()") ) +//print( checkParentheses("({[}])") ) +//print( checkParentheses("())(") ) +//print( checkParentheses("({}[()]())") ) + +//MARK: - +//MARK: 스택 예제 2 (강사님 ver) + +//func postFix(expression: String) -> Int{ +// +// +// let tokens = expression.split(separator: " ") //문자열을 잘라서 나눠주기 +// +// var stack = [String]() +// +// for token in tokens { +// if "+-*/".contains(token) { +// let right = Int(stack.popLast()!)! //꺼낸 것중 숫자 하나를 오른쪽에 배정 +// let left = Int(stack.popLast()!)! //꺼낸 것중 숫자 하나를 왼쪽에 배정 +// +// switch token { +// case "+": +// stack.append(String(right + left)) +// case "*": +// stack.append(String(right * left)) +// case "-": +// stack.append(String(right - left)) +// case "/": +// stack.append(String(right / left)) +// default: +// break +// } +// +// } else { +// stack.append(String(token)) +// } +// +// } +// +// return (Int(stack.popLast()!)!) +//} +// +//print(postFix(expression: "2 3 + 4 *")) diff --git a/lecture/Mentoring.swift b/lecture/Mentoring.swift new file mode 100644 index 0000000..7b430e0 --- /dev/null +++ b/lecture/Mentoring.swift @@ -0,0 +1,348 @@ +// Created by 박선구 on 2023/09/27. + +import SwiftUI + +// 텍스트 필드 밖 화면 터치 시 키보드 내림 +extension UIApplication { + func hideKeyboard() { + guard let window = windows.first else { return } + let tapRecognizer = UITapGestureRecognizer(target: window, action: #selector(UIView.endEditing)) + tapRecognizer.cancelsTouchesInView = false + tapRecognizer.delegate = self + window.addGestureRecognizer(tapRecognizer) + } + } + +extension UIApplication: UIGestureRecognizerDelegate { + public func gestureRecognizer(_ gestureRecognizer: UIGestureRecognizer, shouldRecognizeSimultaneouslyWith otherGestureRecognizer: UIGestureRecognizer) -> Bool { + return false + } +} + +struct ContentView: View { + + @State private var email : String = "" + @State private var password : String = "" + @State private var showPassword : Bool = false + @State private var validEmail : Bool = false + @State private var checkButton : Bool = true + @State private var isDisabled : Bool = false + @State private var loginFail : Bool = false + + //필드 포커스 + @FocusState private var focusedField: FormField? + +// @State private var currectEmail : String = "s1111@apple.com" +// @State private var currectPassword : String = "happyswift1!" + + var body: some View { + ZStack{ + ColorManager.BackgroundColor + .cornerRadius(40) + .padding(.bottom, -100) + .padding(.top, 50) + .shadow(radius: /*@START_MENU_TOKEN@*/10/*@END_MENU_TOKEN@*/) + VStack { + Spacer() + HStack{ + Text("Hello\nWorld !") + Spacer() + Text("") + } + .font(.system(size: 50)) + .fontWeight(.heavy) + .padding(.horizontal) + + + VStack{ //이메일 + HStack{ + Text("이메일") + Spacer() + Text("") + } + ZStack(alignment: .trailing){ + TextField(" 이메일을 입력해주세요", text: $email) + .keyboardType(.emailAddress) + .textInputAutocapitalization(.never) + .padding() + .background(Color.white) + .cornerRadius(15) + .overlay( + RoundedRectangle(cornerRadius: 15) + .stroke(fieldcheck(checkButton, email), lineWidth: 2) + ) + //포커스 필드 + .submitLabel(.next) + .focused($focusedField, equals: .email) + + if !email.isEmpty { + Image(systemName: checkButton == true ? "xmark" : "exclamationmark.circle") + .resizable() + .frame(width: 15, height: 15) + .padding() + .foregroundColor(checkButton == true ? .black : .red) + .symbolEffect(.bounce, value: checkButton) + .onTapGesture { + email = "" + } + } + } + +// .onAppear { +// UITextField.appearance().clearButtonMode = .whileEditing +// } //텍스트 필드 클리어 버튼 + + HStack{ + if email.isEmpty { + Text("Helper text") + .foregroundColor(checkButton == true ? .black : .red) + }else{ + Text(validEmail == false ? "Helper text" : "이메일을 올바르게 입력해 주세요") + .foregroundColor(validEmail == false ? .black : .red) +// Text(checkEmail(str: email) == true ? "Helper text" : "이메일을 올바르게 입력해주세요") +// .foregroundColor(checkButton == true ? .black : .red) + } + Spacer() + Text("") + } + } + .padding() + + + VStack{ //비밀번호 + HStack{ + Text("비밀번호") + Spacer() + Text("") + } + + ZStack(alignment: .trailing){ + + if showPassword == false{ + + SecureField(" 비밀번호를 입력해주세요", text: $password) + .keyboardType(.asciiCapable) + .textInputAutocapitalization(.never) + .padding() + .background(Color.white) + .cornerRadius(15) + .overlay( + RoundedRectangle(cornerRadius: 15) + .stroke(fieldcheck2(checkButton, password), lineWidth: 2) + ) + //포커스 필드 + .submitLabel(.done) + .focused($focusedField, equals: .password) + + }else{ + TextField(" 비밀번호를 입력해 주세요", text: $password) + .keyboardType(.asciiCapable) + .textInputAutocapitalization(.never) + .padding() + .background(Color.white) + .cornerRadius(15) + .overlay( + RoundedRectangle(cornerRadius: 15) + .stroke(fieldcheck2(checkButton, password), lineWidth: 2) + ) + //포커스 필드 + .submitLabel(.done) + .focused($focusedField, equals: .password) + + } + Image(systemName: showPassword == false ? "eye.slash" : "eye") + .resizable() + .frame(width: 20, height: 17) + .padding() + .onTapGesture { + if showPassword == false{ + showPassword = true + }else{ + showPassword = false + } + } + } + + HStack{ + Text(" ") + .frame(minWidth: 82, maxHeight: 2.5) + .background(CheckPassword().pwcheck4(password)) + Text(" ") + .frame(minWidth: 82, maxHeight: 2.5) + .background(CheckPassword().pwcheck3(password)) + Text(" ") + .frame(minWidth: 82, maxHeight: 2.5) + .background(CheckPassword().pwcheck2(password)) + Text(" ") + .frame(minWidth: 82, maxHeight: 2.5) + .background(CheckPassword().pwcheck1(password)) + } + .shadow(radius: 1) + + HStack{ + Text("Helper text") + .foregroundColor(checkButton == true ? .black : .red) + Spacer() + Text("") + } + } + .padding() + + Button(action: onButton, label: { + Text("로그인") + .font(.title2) + .fontWeight(/*@START_MENU_TOKEN@*/.bold/*@END_MENU_TOKEN@*/) + .frame(maxWidth: 350, maxHeight: 50) + }) + + .foregroundColor(.white) + .background(!email.isEmpty && CheckPassword().pwcheck2(password) == .orange && checkEmail(str: email) == true ? Color.blue : Color.gray) + .cornerRadius(10) + .disabled(CheckPassword().pwcheck2(password) == .orange && checkEmail(str: email) == true ? false : true) + + // 경고 + .alert(isPresented: $loginFail){ + Alert(title: Text("로그인 실패"), + message: Text("아이디 혹은 비밀번호가 맞지 않습니다"), + dismissButton: .default(Text("확인"))) + } + + Spacer() + Spacer() + + } + .frame(maxWidth: .infinity, maxHeight: .infinity) + } + + //키보드 내림 + .onAppear (perform : UIApplication.shared.hideKeyboard) + + //텍스트 필드 옮기기 (포커스필드) + .onSubmit { + switch focusedField { + case .email: + if checkEmail(str: email) == true{ + validEmail = false + focusedField = .password + }else{ + validEmail = true + } + case .password: + focusedField = nil + default: + focusedField = nil + } + } + + } + + // 버튼 + func onButton() { + + let currectEmail : String = "s1111@apple.com" + let currectPassword : String = "happyswift1!" + + if email == currectEmail && password == currectPassword{ + loginFail = false + return checkButton = true + }else{ + loginFail = true + return checkButton = false + } + } + + // 텍스트필드 테두리 색 (이메일) + func fieldcheck(_ checkButton : Bool, _ email : String) -> Color{ + + if checkButton == false { + return Color.red + }else if focusedField == .email { + return Color.black + }else if focusedField != .email{ + return Color.gray + }else{ + return Color.gray + } + } + + // 텍스트필드 테두리 색 (비밀번호) + func fieldcheck2(_ checkButton : Bool, _ password : String) -> Color{ + + if checkButton == false { + return Color.red + }else if focusedField == .password { + return Color.black + }else if focusedField != .password{ + return Color.gray + }else{ + return Color.gray + } + } +} + +//이메일 확인 +func checkEmail(str: String) -> Bool { + let check = "[A-Z0-9a-z._%+-]+@[A-Za-z0-9.-]+\\.[A-Za-z]{2,64}" + let test = NSPredicate(format: "SELF MATCHES %@", check) + return test.evaluate(with: str) +} + +//비밀번호 확인 및 규격 체크 +struct CheckPassword{ + let check = "^(?=.*[A-Za-z])(?=.*[0-9])(?=.*[!@#$%^&*()_+=-]).{8,64}" + let test : NSPredicate + + init(){ + test = NSPredicate(format: "SELF MATCHES %@", check) + } + + func pwcheck1(_ str: String) -> Color{ + let strcount = str.reduce(0) {$0 + ("!@#$%^&*()_+=-".contains($1) ? 1 : 0)} + if strcount >= 2 && test.evaluate(with: str){ + return .green + }else{ + return .gray + } + } + func pwcheck2(_ str: String) -> Color{ + if str.count >= 8 && str.rangeOfCharacter(from: .decimalDigits) != nil && str.rangeOfCharacter(from: CharacterSet(charactersIn: "!@#$%^&*()_+=-")) != nil { + return .orange + }else{ + return .gray + } + } + func pwcheck3(_ str: String) -> Color{ + if str.count >= 8 && str.rangeOfCharacter(from: .decimalDigits) != nil { + return .orange + }else{ + return .gray + } + } + func pwcheck4(_ str: String) -> Color{ + if !str.isEmpty { + return .red + }else if str.count >= 8{ + return .red + }else{ + return .gray + } + } +} + + + +//커스텀 컬러 +struct ColorManager { + static let BackgroundColor = Color("pickColor") +} + +//포커스 필드 +enum FormField { + case email, password +} + + + +#Preview { + ContentView() +} diff --git a/resume/cv/codelion.css b/resume/cv/codelion.css new file mode 100644 index 0000000..fb26e33 --- /dev/null +++ b/resume/cv/codelion.css @@ -0,0 +1,105 @@ +@import url("https://fonts.googleapis.com/css?family=Montserrat:100,200,300,400,500,600,700,800&display=swap"); + +* { + font-family: "Montserrat"; +} + +body, +h1, +h2 { + margin: 0px; + padding: 0px; +} + +body { + min-width: fit-content; +} + +h1 { + font-size: 36px; + font-weight: bold; + font-style: italic; +} + +h2 { + font-size: 20px; + color: #282828; + font-weight: lighter; + margin-bottom: 16px; + border-bottom: 1px solid #ebebeb; + padding-bottom: 5px; +} + +.name-text { + font-size: 16px; + color: #7c7c7c; + font-weight: bold; +} + +.about-me-text { + font-size: 10px; + line-height: 16px; +} + +.mainbox { + width: 610px; + padding: 30px; + margin: 30px; + margin-right: auto; + margin-left: auto; + border: 1px solid #ebebeb; + box-shadow: 0 1px 20px 0 rgba(0, 0, 0, 0.1); +} + +.title-box { + text-align: right; +} + +section { + margin-bottom: 24px; +} + +.float-wrap { + overflow: hidden; +} + +.title-text { + font-size: 11px; + font-weight: bold; + color: #282828; + float: left; +} + +.year-text { + font-size: 11px; + font-weight: bold; + color: #282828; + float: right; +} + +.desc-text { + font-size: 9px; +} + +.desc-subtext { + font-size: 9px; + color: #282828; + padding-left: 16px; +} + +.sns-img { + width: 12px; + height: 12px; +} + +.sns-wrap { + text-align: right; +} + +footer { + text-align: center; + background-color: #1e1e1e; + padding: 20px; + font-size: 12px; + color: #919191; +} diff --git a/resume/cv/index.html b/resume/cv/index.html new file mode 100644 index 0000000..b315714 --- /dev/null +++ b/resume/cv/index.html @@ -0,0 +1,56 @@ + + + + + 이창준의 이력서 + + + +
+
+

이창준 [ Phang ]

+

Mobile Developer

+
+
+

ABOUT ME

+

+ Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do + eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad + minim veniam, quis nostrud exercitation ullamco laboris nisi ut + aliquip ex ea commodo consequat. Duis aute irure dolor in + reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla + pariatur. Excepteur sint occaecat cupidatat non proident, sunt in + culpa qui officia deserunt mollit anim id est laborum. +

+
+
+

EXPERIENCE

+
+

멋사 iOS 교육

+

2023.09 -

+
+

Mobile Developer

+

iOS, Swift, ...

+
+

XXXXXXXX 교육 수료

+

2023.07 - 2023.08

+
+

Mobile Designer

+

iOS, Swift

+
+

XXXXXXXX 교육 수료

+

2022.07 - 2023.06

+
+

Front-End Web Developer

+

HTML/CSS, JS, Vue.js, ...

+

Back-End Web Developer

+

Java, Spring, Python, Django, ...

+

Mobile Developer

+

Android, Kotlin, Jetpack Compose ...

+
+
+
+

Copyright CODE LION All rights reserved.

+
+ + diff --git a/ds/codelion.css b/resume/ds/codelion.css similarity index 100% rename from ds/codelion.css rename to resume/ds/codelion.css diff --git a/ds/index.html b/resume/ds/index.html similarity index 100% rename from ds/index.html rename to resume/ds/index.html diff --git a/studyReview/main.swift b/studyReview/main.swift new file mode 100644 index 0000000..3de9d37 --- /dev/null +++ b/studyReview/main.swift @@ -0,0 +1,1204 @@ +// +// main.swift +// studyReview +// +// Created by 박선구 on 2023/09/30. +// + +import Foundation + +//연산자 예제 1번 + +//let num1 = 7 +//let num2 = 3 +// +//print("더하기 결과: \(num1 + num2)") +//print("빼기 결과: \(num1 - num2)") +//print("곱하기 결과: \(num1 * num2)") +//print("나누기 결과: \(num1 / num2)") +//print("나머지 구하기: \(num1 % num2)") //+ + +//MARK: - +//MARK: 연산자 예제 2 +//변수 num 값 중에서 백의 자리 이하를 버리는 코드이다. 만일 변수 num의 값이 456이라며 400이 되고, 111이라면 100이 된다. + +//let num1: Int = 925 +// +//var result = (num1 / 100) * 100 +//print(result) + +//MARK: - +//MARK: 연산자 예제 3 +//제주도에 다녀온 김모 씨는 3,729개의 귤을 샀다. 김모 씨는 주위 사람들에게 귤을 나눠주려고 하는데 너무 많아서 문제가 생겼습니다. +//김모씨는 귤을 한 사람당 52개씩 박스에 담아서 나눠주려고 합니다. +//김모씨가 사람들에게 줄 수 있는 박스의 수와 남은 귤 갯수를 구해보세요. + +//let orange = 3729 +//let box = 52 +// +//var result = orange / box +//print("나누어 줄 수 있는 박스의 수: ",result) +//result = orange % box +//print("남은 귤 갯수: ",result) + +//MARK: - +//MARK: 연산자 예제 4 +//변수 num 값 중에서 일의 자리를 1로 바꾸는 코드이다. 만일 변수 num의 값이 456 이라면 451이 되고, 777이라면 771이 된다. + +//print("정수를 입력해주세요: ",terminator: "") +//let num = Int(readLine()!)! +// +//var result1 = ((num / 10) * 10) + 1 +//print("\(result1)") + +//MARK: - +//MARK: 연산자 예제 5 +//Swift, iOS, Web 점수를 키보드로 부터 입력 받아 합계와 평균을 출력하세요 + +//print("Swift 점수: ",terminator: "") +//let swiftScore = Int(readLine()!)! +//print("iOS 점수: ",terminator: "") +//let iOSScore = Int(readLine()!)! +//print("Web 점수: ",terminator: "") +//let WebScore = Int(readLine()!)! +// +//var sum = swiftScore + iOSScore + WebScore +//var avg = Float(sum) / 3 +//print("점수 합계: \(sum)\n평균: \(avg)") + +//MARK: - +//MARK: 연산자 예제 6 +//초를 입력 받아 [시, 분, 초] 형태로 출력하세요. + +//print("초 입력: ", terminator: "") +//let t = Int(readLine()!)! +// +//var m = (t/60) % 60 +//var h = (t/60)/60 +//var s = (t%60) +//print("\(h)시간 \(m)분 \(s)초") + +//MARK: - +//MARK: 연산자 예제 7 +//시급계산기 입니다. 기본시급은 5,000원이고, 8시간이 넘을 경우 초과된 시간은 시급의 1.5배를 책정해줍니다. (하루 13시간 이하 근무) + +//var num = 5000 +//var hour = 5000 * 1.5 +// +//print("노동시간 입력: ", terminator: "") +//let time = Int(readLine()!)! +// +// +//if time >= 8 { +// var overtime = (Double(time-8) * hour) +// var money = (Double(time) - Double(time - 8)) * Double(num) +// print("총 입금은 \(Int(overtime + money))원 입니다.") +//} + +//MARK: - +//MARK: 연산자 예제 8 +//정수를 입력받아 홀수인지 짝수인지 판별하세요.(삼항연산자 이용) + +//print("정수를 입력하세요: ", terminator: "") +//let num = Int(readLine()!)! +// +//print(num % 2 == 0 ? "\(num)은 짝수입니다." : "\(num)은 홀수입니다.") + +//MARK: - +//MARK: 연산자 예제 9 +//두 개의 정수를 입력 받아 큰 수에서 작은 수를 뺀 결과값을 출력하세요. .(삼항연산자 이용) +//func inputLine (_ message: String) -> Int { +// print(message, terminator: " ") +// return Int(readLine()!)! +// } +// +//let num1 = inputLine("첫 번째 정수 입력: ") +//let num2 = inputLine("두 번째 정수 입력: ") +// +//print(num1 > num2 ? "두 수의 차: \(num1 - num2)" : "두 수의 차: \(num2 - num1)") + +//MARK: - +//MARK: 연산자 예제 10 +//농구공을 담기 위해 필요한 상자의 개수를 구하세요. +//상자 하나에는 농구공이 5개 들어갈 수 있습니다. 만일 농구공이 ‘23’개라면 필요한 상자의 개수는 ‘5’개입니다. + +func inputLine (_ message : String) -> Int{ + print(message, terminator: "") + return Int(readLine()!)! +} + +//let balls = inputLine("농구공의 갯수를 입력하세요: ") +//var box = balls / 5 +//var left = balls % 5 +// +//print(left != 0 ? "필요한 상자의 수: \(box + 1)" : "필요한 상자의 수: \(box)") + +//MARK: - +//MARK: 조건문 예제 1 +//Int 타입의 변수 age를 선언하고 키보드로 값을 입력받으세요. +//만약 age가 20보다 크거나 같다면 “성인입니다.” 라고 +//출력하는 프로그램을 만들어 보세요. + +//let age = inputLine("정수를 입력하세요: ") +// +//if age >= 20 { +// print("성인입니다.") +//}else{ +// print("성인이 아닙니다.") +//} + +//MARK: - +//MARK: 조건문 예제 2 +//변수 num를 선언하고 키보드로 값을 입력받으세요. +//만약 num이 3의 배수이면서 5의 배수라면 “3과 5의 배수입니다”라고 출력하는 +//프로그램을 만들어보세요. + +//let num = inputLine("정수를 입력하세요: ") +// +//if num % 3 == 0 && num % 5 == 0 { +// print("3과 5의 배수입니다.") +//}else{ +// print("3과 5의 배수가 아닙니다.") +//} +//MARK: - +//MARK: 조건문 예제 3 +//Int 타입의 변수 grade 를 선언하고 키보드로 값을 입력받으세요. +//만약 grade 가 60점이상이면 “합격입니다.” grade 가 60점 미만이면 “불합격입니다.” 를 출력하는 프로그램을 작성해보세요. + +//let grade = inputLine("정수를 입력하세요: ") +// +//if grade >= 60 { +// print("합격입니다.") +//}else{ +// print("불합격입니다.") +//} +//MARK: - +//MARK: 조건문 예제 4 +//정수를 입력 받아 양수, 음수, 0을 판별하여 다음과 같이 출력하세요. + +//let num = inputLine("정수를 입력하세요: ") +// +//if num > 0 { +// print("양수입니다.") +//}else if num < 0 { +// print("음수입니다.") +//}else{ +// print("0 입니다.") +//} + +//MARK: - +//MARK: 조건문 예제 5 +//Int 타입의 변수 num1, num2를 선언하고 키보드로 값을 입력받으세요. +//입력받은 num1과 num2 중 큰 수를 출력하는 프로그램을 만들어보세요. + +//let num1 = inputLine("첫 번째 정수를 입력하세요: ") +//let num2 = inputLine("두 번째 정수를 입력하세요: ") +// +//switch num1 > num2{ +// +//case true: +// print("더 큰 수: \(num1)") +//case false: +// print("더 큰 수: \(num2)") +//} + +//MARK: - +//MARK: 조건문 예제 6 +//정보처리기사의 각 과목의 정답개수를 Int형 타입의 변수 5개를 선언하고 입력받으세요. +//한 과목이라도 8개 미만인 경우, “불합격입니다!”를 출력하고 총 개수가 60개 이상이면 “합격입니다!”를 출력하는 프로그램을 만들어보세요. + +//let num1 = inputLine("1과목 소프트웨어 설계: ") +//let num2 = inputLine("2과목 소프트웨어 개발: ") +//let num3 = inputLine("3과목 데이터베이스 구축: ") +//let num4 = inputLine("4과목 프로그래밍 언어 활용: ") +//let num5 = inputLine("5과목 정보시스템 구축관리: ") +// +//if num1 < 8 || num2 < 8 || num3 < 8 || num4 < 8 || num5 < 8 { +// print("불합격입니다.") +//}else if num1+num2+num3+num4+num5 < 60 { +// print("불합격입니다.") +//}else{ +// print("합격입니다!") +//} + +//MARK: - +//MARK: 조건문 예제 7 +//다음은 디즈니랜드 입장료 계산 프로그램입니다. +//기본료는 5000원이며 인원수에 따라 지불해야하는 프로그램을 만들어보세요. +//단, 미성년자인 경우 50%할인이 적용됩니다! + +//let money = 5000 +//let age = inputLine("나이를 말씀해주세요: ") +//let people = inputLine("인원수를 말씀해주세요: ") +// +//if age < 20 { +// print("총 \(people * (money/2))원 입니다.") +//}else{ +// print("총 \(people * money)원 입니다.") +//} +//MARK: - +//MARK: 조건문 예제 7 (더 해보기) + +//let money = 5000 +//var pay = 0 +// +//let people = inputLine("인원수를 말씀해주세요: ") +// +//for i in 1...people{ +// let age = inputLine("\(i)나이를 입력해주세요: ") +// +// if age <= 20{ +// pay += (money/2) +// }else{ +// pay += money +// } +//} +// +//print("총 \(pay)원 입니다.") + +//MARK: - +//MARK: 조건문 예제 8 +//마트 계산대 프로그램입니다. +//10000원짜리 추석선물셋트를 구입했을 때 지불해야하는 금액을 계산해 보세요. +//단, 11개 이상 구매시에는 10%할인이 됩니다! + +//let set = 10000 +//let num = inputLine("구매하려는 상품 갯수를 입력하세요: ") +// +//if num >= 11 { +// print("가격은 \(Int(Double(set)*0.9) * num)원 입니다.") +//}else{ +// print("가격은 \(set * num)원 입니다.") +//} + +//MARK: - +//MARK: 조건문 예제 9 +//Int 타입의 변수 grade 를 선언하고 키보드로 값을 입력받으세요. +//Grade가 +//90이상이면 “A학점입니다.”, +//80점 이상 90점 미만일 경우 “B학점입니다.” +//70점이상 80점 미만일 경우 “C학점입니다.” 를 출력하세요. + +//let grade = inputLine("점수를 입력하세요: ") +// +//if grade > 90 { +// print("A학점입니다.") +//}else if grade > 80 && grade < 90 { +// print("B학점입니다.") +//}else{ +// print("C학점입니다.") +//} + +//MARK: - +//MARK: 조건문 예제 10 +//switch ~ case 문을 사용하여, +//data가 "hello" 일 때, "네, 안녕하세요!" 출력, +//data 가 "nice to meet you" 일 때, "네, 반가워요!" 출력, +//data가 "take care" 일 때, "네, 수고하세요!" 출력, +//그 외 다른 문장일 때는 "잘못 입력하셨습니다." 라고 출력하는 프로그램을 작성하세요. + +func inputString(_ message: String) -> String{ + print(message, terminator: "") + return readLine()! +} + +//let data = inputString("") +// +//switch data { +//case "hello": +// print("네, 안녕하세요.") +//case "nice to meet you": +// print("네, 반가워요!") +//case "take care": +// print("네, 수고하세요") +//default: +// print("잘못 입력하셨습니다.") +//} + +//MARK: - +//MARK: 조건문 예제 12 +//월을 입력받아 봄, 여름, 가을, 겨울 중 맞는 계절을 알려주는 프로그램을 만드세요. +//12, 1, 2월 → 겨울 +//3, 4, 5월 → 봄 +//6, 7, 8월 → 여름 +//9, 10, 11월 →가을 + +//let month = inputLine("월을 입력하세요: ") +// +//switch month { +//case 12, 1 ,2 : +// print("겨울") +//case 3, 4, 5: +// print("봄") +//case 6, 7, 8: +// print("여름") +//case 9, 10, 11: +// print("가을") +//default: +// print("다시 입력해주세요.") +//} + +//MARK: - +//MARK: 조건문 예제 13 +//자판기 프로그램을 만들어 봅시다. +//금액을 입력하고 메뉴를 고른 뒤 잔돈을 출력해 보세요! + +//let money = inputLine("금액을 입력하세요: ") +//let menu = inputLine("메뉴를 고르세요\n1.콜라(800원) 2.생수(500원) 3.비타민워터(1500원): ") +// +//switch menu { +//case 1: +// print("잔돈: \(money - 800)") +//case 2: +// print("잔돈: \(money - 500)") +//case 3: +// print("잔돈: \(money - 1500)") +//default: break +//} + +//MARK: - +//MARK: 조건문 예제 14 +//입력한 금액이 선택한 메뉴의 가격보다 부족하면 +//돈이 부족하다는 문장을 출력하세요! + +//let money = inputLine("금액을 입력하세요: ") +//let menu = inputLine("메뉴를 고르세요\n1.콜라(800원) 2.생수(500원) 3.비타민워터(1500원): ") +// +//switch menu { +//case 1: +// if money < 800 { +// print("돈이 부족해요 ㅠㅠ") +// }else{ +// print("잔돈: \(money - 800)") +// } +//case 2: +// if money < 500 { +// print("돈이 부족해요 ㅠㅠ") +// }else{ +// print("잔돈: \(money - 500)") +// } +//case 3: +// if money < 1500 { +// print("돈이 부족해요 ㅠㅠ") +// }else{ +// print("잔돈: \(money - 1500)") +// } +//default: break +//} + +//MARK: - +//MARK: 조건문 예제 15 +//잔돈을 줄 때 천원을 몇 개 줘야 하는지 계산해 보세요! + +//let money = inputLine("금액을 입력하세요: ") +//let menu = inputLine("메뉴를 고르세요\n1.콜라(800원) 2.생수(500원) 3.비타민워터(1500원): ") +// +//switch menu { +//case 1: +// if money < 800 { +// print("돈이 부족해요 ㅠㅠ") +// }else{ +// print("잔돈: \(money - 800)") +// print("천원: \((money - 800)/1000)") +// } +//case 2: +// if money < 500 { +// print("돈이 부족해요 ㅠㅠ") +// }else{ +// print("잔돈: \(money - 500)") +// print("천원: \((money - 500)/1000)") +// } +//case 3: +// if money < 1500 { +// print("돈이 부족해요 ㅠㅠ") +// }else{ +// print("잔돈: \(money - 1500)") +// print("천원: \((money - 1500)/1000)") +// } +//default: break +//} + +//MARK: - +//MARK: 조건문 예제 16 +//잔돈을 줄 때 천원, 오백원, 백원짜리를 몇 개 줘야하는지 계산해 보세요! + +//let money = inputLine("금액을 입력하세요: ") +//let menu = inputLine("메뉴를 고르세요\n1.콜라(800원) 2.생수(500원) 3.비타민워터(1500원): ") +// +//switch menu { +//case 1: +// if money < 800 { +// print("돈이 부족해요 ㅠㅠ") +// }else{ +// print("잔돈: \(money - 800)") +// print("천원: \((money - 800)/1000)") +// print("오백원: \((money - 800)%1000/500)") +// print("백원: \((money - 800)%1000%500/100)") +// } +//case 2: +// if money < 500 { +// print("돈이 부족해요 ㅠㅠ") +// }else{ +// print("잔돈: \(money - 500)") +// print("천원: \((money - 500)/1000)") +// print("오백원: \((money - 500)%1000/500)") +// print("백원: \((money - 500)%1000%500/100)") +// } +//case 3: +// if money < 1500 { +// print("돈이 부족해요 ㅠㅠ") +// }else{ +// print("잔돈: \(money - 1500)") +// print("천원: \((money - 1500)/1000)") +// print("오백원: \((money - 1500)%1000/500)") +// print("백원: \((money - 1500)%1000%500/100)") +// } +//default: break +//} + +//MARK: - +//MARK: while문 예제 1 + +//var result = 0 +// +//while result < 10 { +// let num = inputLine("정수 입력: ") +// result = num +//} +//print("종료되었습니다.") + +//MARK: - +//MARK: while문 예제 2 +//다이어트 관리 프로그램 +//현재 몸무게와 목표몸무게를 입력 받고 주차 별 감량 몸무게를 입력 받으세요. +//목표 몸무게를 달성하면 축하한다는 문구를 출력 하고 입력을 멈추세요! + +//var nowWeight = inputLine("현재 몸무게: ") +//let target = inputLine("목표 몸무게: ") +//var i = 0 +// +//while nowWeight > target { +// i = i + 1 +// var weight = inputLine("\(i)주차 몸무게: ") +// nowWeight -= weight +//} +//if nowWeight < target { +// print("\(nowWeight)kg 달성! 축하합니다.") +//} + +//MARK: - +//MARK: while문 예제 3 +//로그인 프로그램을 만들어 보자. +//아이디와 비밀번호를 각각 입력 받고 일치할 경우 “로그인성공!” +//일치하지 않은 경우에는 “로그인 실패!” + +//let setId = "hello" +//let setPassword = 1234 +//let id = inputString("아이디를 입력해주세요: ") +//let password = inputLine("비밀번호를 입력해주세요: ") +// +//if id == setId && password == setPassword { +// print("로그인 성공!") +//}else{ +// print("id 또는 비밀번호가 틀렸습니다.") +//} + +//MARK: - +//MARK: while문 예제 4 +//로그인이 실패했을 경우에 계속 입력 +//로그인이 성공하면 프로그램 종료 + +//let setId = "hello" +//let setPassword = 1234 +// +//while true { +// let id = inputString("아이디를 입력해주세요: ") +// let password = inputLine("비밀번호를 입력해주세요: ") +// +// if id == setId && password == setPassword { +// print("로그인 성공!") +// break +// }else{ +// print("id 또는 비밀번호가 틀렸습니다.\n") +// continue +// } +//} + +//MARK: - +//MARK: while문 예제 5 +//Login프로그램 +//아이디와 비밀번호가 틀렸을 경우 "계속 하시겠습니까?" 라는 문장을 출력하세요. +//Y를 입력하면 아이디 비밀번호 입력 계속, +//N을 입력하면 종료 +//로그인 성공 시 종료 + + +//let setId = "hello" +//let setPassword = 1234 +// +//while true { +// let id = inputString("아이디를 입력해주세요: ") +// let password = inputLine("비밀번호를 입력해주세요: ") +// +// if id == setId && password == setPassword { +// print("로그인 성공!") +// break +// }else{ +// print("id 또는 비밀번호가 틀렸습니다.\n") +// let again = inputString("다시 하시겠습니까? (Y/N): ") +// if again == "Y"{ +// continue +// }else if again == "N"{ +// break +// } +// } +//} + +//MARK: - +//MARK: while문 예제 6 +//아이디와 비밀번호가 틀렸을 경우 "계속 하시겠습니까?" 라는 문장을 출력하세요. +//첫 번째 정수를 입력 받는다. +//두 번째 정수를 입력 받는다. +//연산자를 선택한다. +//선택한 연산자에 따라 연산결과를 출력한다. +//다시 실행할 것인가를 물어본다. +//“Y” 를 입력하면 다시 실행. +//“N”을 입력하면 반복문 종료. + + +//var a = true +//while a { +//let num1 = inputLine("첫 번째 정수 입력: ") +//let num2 = inputLine("두 번째 정수 입력: ") +//var result = 0 +// +//let sellect1 = inputLine("1.더하기 2.빼기: ") +// switch sellect1 { +// case 1: +// result = num1 + num2 +// print(result) +// let sellect2 = inputString("다시(Y/N): ") +// if sellect2 == "Y"{ +// continue +// }else if sellect2 == "N"{ +// a = false +// } +// case 2: +// result = num1 - num2 +// print(result) +// let sellect2 = inputString("다시(Y/N): ") +// if sellect2 == "Y"{ +// continue +// }else if sellect2 == "N"{ +// a = false +// } +// default: +// print("다시 입력해주세요.") +// continue +// } +//} + +//MARK: - +//MARK: while문 예제 7 + +//let num1 = Int.random(in: 0...100) +//let num2 = Int.random(in: 0...100) +//var result = num1 + num2 +// +//let answer = inputLine("\(num1) + \(num2) = ? ") +// +//if answer == result { +// print("SUCCESS") +//}else{ +// print("FAIL") +//} + +//MARK: - +//MARK: while문 예제 7 - 1 +//사용자가 원할 때까지 반복 +//Fail 후 계속하기를 선택할 시 기존 숫자를 출력 + +//var again = true +//let num1 = Int.random(in: 0...100) +//let num2 = Int.random(in: 0...100) +//var result = num1 + num2 +// +//while again { +// let answer = inputLine("\(num1) + \(num2) = ? ") +// +// if answer == result { +// print("SUCCESS") +// again = false +// }else{ +// print("FAIL") +// let failAgain = inputString("다시 하시겠습니까? (Y/N): ") +// if failAgain == "Y"{ +// again = true +// }else{ +// again = false +// } +// } +//} + +//MARK: - +//MARK: while문 예제 7-2 * +//Success 후 계속하기를 선택할 시 새로운 숫자를 뽑아서 출력 + +//var again = true +//var again2 = true +// +//while again2 { +// let num1 = Int.random(in: 0...100) +// let num2 = Int.random(in: 0...100) +// let result = num1 + num2 +// +// while again { +// let answer = inputLine("\(num1) + \(num2) = ? ") +// +// if answer == result { +// print("SUCCESS") +// let successAgain = inputString("다시 하시겠습니까? (Y/N): ") +// if successAgain == "Y"{ +// break +// }else{ +// again2 = false +// again = false +// } +// }else{ +// print("FAIL") +// let failAgain = inputString("재도전 하시겠습니까? (Y/N): ") +// if failAgain == "Y"{ +// again = true +// again2 = true +// }else{ +// again2 = false +// again = false +// } +// } +// } +//} + +//MARK: - +//MARK: for문 예제 00 +//for문을 사용하여 96에서 53까지 출력하시오. + +//for i in (53...96).reversed(){ +// print(i) +//} + +//for문을 사용하여 21에서 57까지의 수 중 홀수만 출력하시오. + +//for i in 21...57 { +// if i % 2 == 1{ +// print(i) +// } +//} + +//정수를 입력 받아 1부터 입력 받은 정수까지 차례대로 출력하는 프로그램을 작성하시오. + +//let num1 = inputLine("정수 입력: ") +//for i in 1...num1{ +// print(i) +//} + +//한 개의 자연수를 입력 받아 그 수의 배수를 차례로 10개 출력하는 프로그램을 작성하시오. + +//let num1 = inputLine("자연수 입력: ") +//for i in 1...10{ +// print("\(num1 * i)") +//} + +//1~100까지 3의 배수의 합을 출력하세요. (1683) + +//var sum = 0 +// +//for i in 1...33 { +// var result = 3 * i +// sum += result +//} +//print(sum) + +//MARK: - +//MARK: for문 예제 3 +//2단 출력 + +//for i in 1...9{ +// print("2 * \(i) = \(i * 2)") +//} + +//MARK: - +//MARK: for문 예제 4 +//원하는 단을 입력받아 구구단을 출력하세요. + +//let num = inputLine("단 입력: ") +//for i in 1...9 { +// print("\(num) * \(i) = \(num * i)") +//} + +//MARK: - +//MARK: for문 예제 5 +//구구단 1단~9단까지 출력 + +//for i in 2...9{ +// print("=== \(i)단 ===") +// for j in 1...9{ +// print("\(i) * \(j) = \(i * j)") +// if j == 9{ +// print("\n") +// } +// } +//} + +//MARK: - +//MARK: for문 예제 6 + +//for i in 2...9{ +// print("\(i)단: ", terminator: "") +// for j in 1...9{ +// if (i * j) < 10{ +// print("\(i) * \(j) = \(i * j)", terminator: " ") +// }else{ +// print("\(i) * \(j) = \(i * j)", terminator: " ") +// } +// if j == 9{ +// print("\n") +// } +// } +//} + +//MARK: - +//MARK: for문 예제 7 +//입력 받은 정수의 약수를 구하세요 + +//print("정수 입력: ",terminator: "") +//let num = Int(readLine()!)! +// +//print("\(num)의 약수: ",terminator: "") +//for i in 1...num{ +// if num % i == 0{ +// print(i, terminator: " ") +// } +//} + +//MARK: - +//MARK: for문 예제 8 +//2~30까지의 약수를 구하세요 + +//for i in 2...30{ +// print("\(i)의 약수: ", terminator: "") +// for j in 1...i{ +// if i % j == 0{ +// print("\(j)", terminator: " ") +// if j == i { +// print("\n") +// } +// } +// } +//} + +//MARK: - +//MARK: for문 에제 9 +//별찍기 + +//for i in 1...5{ +// print(" ") +// for j in 1...i{ +// print("*",terminator: "") +// } +//} + +//MARK: - +//MARK: 별찍기 거꾸로 + +//for i in (1...5).reversed(){ +// print(" ") +// for j in 1...i{ +// print("*",terminator: "") +// } +//} + +//MARK: - +//MARK: 별찍기 반대로 + +//for i in 1...5{ +// print("") +// for k in i...5{ +// print(" ",terminator: "") +// } +// for j in 1...i{ +// print("*",terminator: "") +// } +//} + +//MARK: - +//MARK: 별찍기 다이아 + +//for i in 1...5{ +// print("") +// for _ in i...5{ +// print(" ",terminator: "") +// } +// for _ in 1...i{ +// print("*",terminator: "") +// } +// for _ in 1...i{ +// print("*", terminator: "") +// } +//} +//for p in (1...5).reversed(){ +// print("") +// for _ in p...5{ +// print(" ",terminator: "") +// } +// for _ in 1...p{ +// print("*",terminator: "") +// } +// for _ in 1...p{ +// print("*", terminator: "") +// } +//} + +//MARK: - +//MARK: 함수 예제 1 +//두 수의 합을 받아 아래와 같은 결과가 나올 수 있도록 addNumber() 를 작성하시오 + +//func addNumber(_ num1: Int,_ num2: Int) -> Int { +// return num1 + num2 +//} +// +//let firstnum = inputLine("첫번째 수: ") +//let seccondnum = inputLine("두번째 수: ") +// +//let result = addNumber(firstnum, seccondnum) +//print("연산결과: \(result)") + +//MARK: - +//MARK: 함수 예제 2 +//2개의 정수를 받아 2개의 숫자 중 더 큰 수를 반환하는 largerNumbers() 을 만들어보세요 + +//func largerNumbers(_ num1: Int,_ num2: Int) -> Int{ +// if num1 > num2{ +// return num1 +// }else if num2 > num1{ +// return num2 +// }else{ +// return 0 +// } +//} +// +//let inputNum1 = inputLine("첫번째 수: ") +//let inputNum2 = inputLine("두번째 수: ") +// +//let result = largerNumbers(inputNum1, inputNum2) +//print("큰 수 확인: \(result)") + +//MARK: - +//MARK: 함수 예제 3 * +//2개의 정수를 받아 2개의 숫자 중 10에 더 가까운 수를 반환하는 close10() 을 만들어보세요 + +//func close10(num1: Int, num2: Int) -> Int{ +// if 10 - abs(num1) < 10 - abs(num2) { +// return num1 +// }else if 10 - abs(num2) < 10 - abs(num1) { +// return num2 +// }else{ +// return 0 +// } +// +//} +// +//let inputNum1 = inputLine("첫번째 수: ") +//let inputNum2 = inputLine("두번째 수: ") +// +//let result = close10(num1: inputNum1, num2: inputNum2) +//print("10에 가까운 수: \(result)") + +//MARK: - +//MARK: 함수 예제 4 +//2개의 정수 base, n을 받아 base의 n제곱 만큼 값을 반환하는 powerN() 를 작성하세요 + +//func powerN(base : Float, n : Float) -> Float{ +// return pow(base, n) +//} +// +//let inputNum1 = inputLine("첫번째 수: ") +//let inputNum2 = inputLine("두번째 수: ") +// +//let result = powerN(base: Float(inputNum1), n: Float(inputNum2)) +//print("결과 확인: \(Int(result))") + +//MARK: - +//MARK: 함수 예제 5 +//키보드로부터 입력받은 두 개의 정수를 인자(매개변수)로 넘겨받아 num1에서 num2를 뺀 결과값을 절대값으로 바꾸어 출력하는 getAbsoluteValue( ) 를 구현하세요 + + +//func getAbsoluteValue(num1 : Int, num2 : Int) -> Int{ +// return abs(num1 - num2) +//} +// +//let inputNum1 = inputLine("첫번째 수: ") +//let inputNum2 = inputLine("두번째 수: ") +// +//let result = getAbsoluteValue(num1: inputNum1, num2: inputNum2) +//print("결과 확인: \(result)") + +//MARK: - +//MARK: 함수 예제 6 +//두 개의 정수를 인자(매개변수)로 넘겨받아 앞의 정수가 뒤의 정수로 나누어지는지를 판별하는 isDivide( ) 를 작성하세요. +//(이때 나누어지면 true, 나누어지지 않으면 false을 반환) + +//func isDivide(num1: Int, num2: Int) -> Bool{ +// if num1 % num2 == 0 { +// return true +// }else if num1 % num2 != 0{ +// return false +// }else{ +// return false +// } +//} +// +//let inputNum1 = inputLine("첫번째 수: ") +//let inputNum2 = inputLine("두번째 수: ") +// +//let result = isDivide(num1: inputNum1, num2: inputNum2) +//print("결과 확인: \(result)") + +//MARK: - +//MARK: 함수 예제 7 +//약수를 구하는 getDivisor() 를 구현하세요 + +//func getDivisior(num1: Int) { +// for i in 1...num1{ +// if num1 % i == 0{ +// print(i, terminator: " ") +// } +// } +//} +//let inputNum = inputLine("약수: ") +//let divi = getDivisior(num1: inputNum) +//print(divi) + +//MARK: - +//MARK: 함수 예제 8 +//약수의 합을 구하여 반환하는 getSumOfDivisors() 를 구현하세요 + +//func getSumOfDivisiors(num1: Int) -> Int{ +// var result = 0 +// for i in 1...num1{ +// if num1 % i == 0{ +// result += i +// } +// } +// return result +//} +// +//let inputNum = inputLine("약수: ") +//let result = getSumOfDivisiors(num1: inputNum) +//print("\(inputNum)의 약수의 합: \(result)") + +//MARK: - +//MARK: 함수 예제 9 * +//startValue...endValue까지의 숫자 중 완전수를 출력하는 getPerfectNumber() 를 구현하세요 + + +//MARK: - +//MARK: 함수 예제 10 * +//startValue~endValue까지의 숫자 중 소수를 출력하는 getPrimeNumber() 를 구현하세요 +//func getPrimeNumber(num1: Int, num2: Int) { +// for i in num1...num2{ +// for j in 1...i { +// if i % j == 0{ +// print(i, terminator: " ") +// } +// } +// } +//} +// +//let inputNum1 = inputLine("첫번째 수: ") +//let inputNum2 = inputLine("두번째 수: ") +// +//getPrimeNumber(num1: inputNum1, num2: inputNum2) +//print("결과 확인: \(result)") + +//MARK: - +//MARK: 클래스 예제 0 + +//class Pigbank { +// var mybank = 0 +// +// func moneyIn (num: Int) { +// mybank += num +// show() +// } +// func moneyOut (num: Int){ +// if mybank == 0 || mybank < 0{ +// print("잔액이 부족합니다.") +// }else{ +// mybank -= num +// } +// show() +// } +// func show() { +// print("현재 잔액: \(mybank)") +// } +//} +// +//let bank = Pigbank() +//bank.show() +//bank.moneyIn(num: inputLine("입금: ")) +//bank.moneyOut(num: inputLine("출금: ")) + +//MARK: - +//MARK: 클래스 예제 1 ~ 3 + +//class Student { +// var name : String +// var number : String +// var age : Int +// var scoreSwift : Int +// var scoreiOS : Int +// var scoreWeb : Int +// +// init(name: String, number: String, age: Int, scoreSwift: Int, scoreiOS: Int, scoreWeb: Int) { +// self.name = name +// self.number = number +// self.age = age +// self.scoreSwift = scoreSwift +// self.scoreiOS = scoreiOS +// self.scoreWeb = scoreWeb +// } +// func show(){ +// print("\(name)님 안녕하세요.\n[ \(number), \(age)살 ]\n\(name)님의 Swift 점수는 \(scoreSwift)점 입니다.\n\(name)님의 iOS 점수는 \(scoreiOS)점 입니다.\n\(name)님의 Web 점수는 \(scoreWeb)점 입니다.") +// } +//} +// +//var student1 = Student.init(name: "홍길동", number: "20200677", age: 22, scoreSwift: 50, scoreiOS: 89, scoreWeb: 77) +//var student2 = Student.init(name: "김영희", number: "20190541", age: 26, scoreSwift: 90, scoreiOS: 85, scoreWeb: 70) +// +//student1.show() +//print("===============") +//student2.show() + +//MARK: - +//MARK: 클래스 예제 4 + +//class Person { +// var name: String +// var age: Int +// +// init(name: String, age: Int) { +// self.name = name +// self.age = age +// } +// func getName () -> String { +// return name +// } +// func setName (change: String) -> String{ +// name = change +// return name +// } +// func getAge() -> Int { +// return age +// } +// func setAge(changeAge: Int) -> Int { +// age = changeAge +// return age +// } +//} +// +//var st1 = Person(name: "홍길동", age: 25) +//var st2 = Person(name: "김영희", age: 27) +//print("이름: \(st1.name), 나이: \(st2.age)") +//print("이름: \(st2.name), 나이: \(st2.age)") + +//MARK: - +//MARK: 클래스 예제 5 + +//class Caculator { +// var num1: Int +// var num2: Int +// +// init(num1: Int, num2: Int) { +// self.num1 = num1 +// self.num2 = num2 +// } +// func setNum1 (num: Int) -> Int { +// num1 = num +// return num1 +// } +// func setNum2 (num: Int) -> Int { +// num2 = num +// return num2 +// } +// func sum () -> Int{ +// return num1 + num2 +// } +// func sub () -> Int{ +// return num1 - num2 +// } +// func mul () -> Int{ +// return num1 * num2 +// } +// func div () -> Int{ +// return num1 / num2 +// } +//} +// +//var cal = Caculator(num1: inputLine("1번째 수: "), num2: inputLine("2번째 수: ")) +// +//print(cal.sum(), cal.setNum1(num: 75), cal.setNum2(num: 5), cal.sub(), cal.mul(), cal.div()) + +//MARK: - +//MARK: 클래스 예제 6 + +//class TV { +// var name: String +// var year: Int +// var size: Int +// +// init(name: String, year: Int, size: Int) { +// self.name = name +// self.year = year +// self.size = size +// } +// func show() { +// print("\(name)에서 만든 \(year)년형 \(size)인치 TV") +// } +//} +// +//let myTV = TV(name: "LG", year: 2023, size: 48) +//myTV.show() + +//MARK: - +//MARK: 별그리기 클래스 + +//MARK: - +//MARK: 배열 예제 1 + +//var array : [Int] = [] +//for i in 1...10{ +// array.insert(Int.random(in: 1...20), at: i-1) +//} +//print(array) +//print(array[4] + array[9]) +//var sum = 0 +//for j in 1...10{ +// sum += array[j-1] +//} +//print(sum) +//print(Float(sum) / 10.0) + +//MARK: - +//MARK: 배열 예제 2 + +var array : [Int] = [] +for i in 1...10{ + array.insert(Int.random(in: 1...20), at: i-1) +} +var result : [Int] = [] +for j in 1...10{ + if array[j-1] % 2 == 0{ + result.append(array[j-1]) + } +} +print(result) From 90e8e018698cf47050170cf7121e299dce913ed8 Mon Sep 17 00:00:00 2001 From: SeonKoo Date: Fri, 3 Nov 2023 01:41:48 +0900 Subject: [PATCH 17/21] ada --- .../MovieDabang.xcodeproj/project.pbxproj | 4 ++ .../common.imageset/Contents.json | 21 +++++++ .../common.imageset/common.jpeg | Bin 0 -> 71902 bytes MovieDabang/MovieDabang/MovieDetailView.swift | 28 ++++----- MovieDabang/MovieDabang/SwiftUIView.swift | 55 ++++++++++++++++++ 5 files changed, 95 insertions(+), 13 deletions(-) create mode 100644 MovieDabang/MovieDabang/Assets.xcassets/common.imageset/Contents.json create mode 100644 MovieDabang/MovieDabang/Assets.xcassets/common.imageset/common.jpeg create mode 100644 MovieDabang/MovieDabang/SwiftUIView.swift diff --git a/MovieDabang/MovieDabang.xcodeproj/project.pbxproj b/MovieDabang/MovieDabang.xcodeproj/project.pbxproj index 411d777..cf672b5 100644 --- a/MovieDabang/MovieDabang.xcodeproj/project.pbxproj +++ b/MovieDabang/MovieDabang.xcodeproj/project.pbxproj @@ -15,6 +15,7 @@ 09E7DC9B2AF37232004DE546 /* MovieDabangUITests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 09E7DC9A2AF37232004DE546 /* MovieDabangUITests.swift */; }; 09E7DC9D2AF37232004DE546 /* MovieDabangUITestsLaunchTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 09E7DC9C2AF37232004DE546 /* MovieDabangUITestsLaunchTests.swift */; }; 61BABE562AF38C7200ADBD59 /* MovieDetailView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 61BABE552AF38C7200ADBD59 /* MovieDetailView.swift */; }; + 61BABE5C2AF3EBC600ADBD59 /* SwiftUIView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 61BABE5B2AF3EBC600ADBD59 /* SwiftUIView.swift */; }; /* End PBXBuildFile section */ /* Begin PBXContainerItemProxy section */ @@ -46,6 +47,7 @@ 09E7DC9A2AF37232004DE546 /* MovieDabangUITests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = MovieDabangUITests.swift; sourceTree = ""; }; 09E7DC9C2AF37232004DE546 /* MovieDabangUITestsLaunchTests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = MovieDabangUITestsLaunchTests.swift; sourceTree = ""; }; 61BABE552AF38C7200ADBD59 /* MovieDetailView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = MovieDetailView.swift; sourceTree = ""; }; + 61BABE5B2AF3EBC600ADBD59 /* SwiftUIView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = SwiftUIView.swift; sourceTree = ""; }; /* End PBXFileReference section */ /* Begin PBXFrameworksBuildPhase section */ @@ -99,6 +101,7 @@ 09E7DC7F2AF3722E004DE546 /* MovieDabangApp.swift */, 09E7DC812AF3722E004DE546 /* ContentView.swift */, 61BABE552AF38C7200ADBD59 /* MovieDetailView.swift */, + 61BABE5B2AF3EBC600ADBD59 /* SwiftUIView.swift */, 09E7DC832AF37232004DE546 /* Assets.xcassets */, 09E7DC852AF37232004DE546 /* Preview Content */, ); @@ -262,6 +265,7 @@ files = ( 61BABE562AF38C7200ADBD59 /* MovieDetailView.swift in Sources */, 09E7DC822AF3722E004DE546 /* ContentView.swift in Sources */, + 61BABE5C2AF3EBC600ADBD59 /* SwiftUIView.swift in Sources */, 09E7DC802AF3722E004DE546 /* MovieDabangApp.swift in Sources */, ); runOnlyForDeploymentPostprocessing = 0; diff --git a/MovieDabang/MovieDabang/Assets.xcassets/common.imageset/Contents.json b/MovieDabang/MovieDabang/Assets.xcassets/common.imageset/Contents.json new file mode 100644 index 0000000..e82c570 --- /dev/null +++ b/MovieDabang/MovieDabang/Assets.xcassets/common.imageset/Contents.json @@ -0,0 +1,21 @@ +{ + "images" : [ + { + "filename" : "common.jpeg", + "idiom" : "universal", + "scale" : "1x" + }, + { + "idiom" : "universal", + "scale" : "2x" + }, + { + "idiom" : "universal", + "scale" : "3x" + } + ], + "info" : { + "author" : "xcode", + "version" : 1 + } +} diff --git a/MovieDabang/MovieDabang/Assets.xcassets/common.imageset/common.jpeg b/MovieDabang/MovieDabang/Assets.xcassets/common.imageset/common.jpeg new file mode 100644 index 0000000000000000000000000000000000000000..b30fa0155f245b5fe3ed4287cead66667eb4ff83 GIT binary patch literal 71902 zcmb4qWl$VE7w+QjR7ir`Vr&+3@l7+Y^;AiKa03-Nz@#I!G#S9 z-)6SYX@uZ-bRr1%S!Jt`(Bz`Vxr_f+0mNAUbSSVW0J4DQrW1EV40**=v4w|w%To!{ zMg{qGM&|k%n%;=%X&s1c7_oT$7Li7Xf|iEL&DGs*HjxG|bUM*Fr8)l3_vQOCIfF19 zY_EpP!So^NzOjdTwe_3(_q`ve8EiEodTB}KKX-qRJWinOOdm-EHo`T-T?)K<%z6$Z z^aRP{fZ;ODCYm)J_kTamK}z)+;qos1MY&HBoi=N*RbH_!J=4>@qrxUx!rR|bIvM6uA`u6nHh&!kbkr5Cr(-zd3 zJAID`3d)79E}bAB|F-paFt`DO8-Ty2bAV*-Ff9AoY(rFb?9JeHBElOPhF0}gSvr!i zTI@^(%lxKnB2VW#&wugKHD1vktZ2^$ql3>D@dBPL|1MgFs+7bUy)Eyi0)g8hgxUr% zN1|MFzlUm<(w33vBHDtqwJy{S_J07`sam@Juvh4xA8aT}d-t}ffB^E;^4i_XmgYaq zFMrW6n5e5kbkx?#rs}TdSTMYKbi?Jj2>_wK|5PWJrvb(TF(1|fdZZibDb3_(DN)Q{ z!o9b3U%p!MP;;VkI|z&*8qGF#8P(Rt>YFFaV?0O*WFX)+n~0)&&dZNRetWi!@1 zQRt<(leYt{ek}Moh33KGWj6!?BvVnc!&1{$Jgkcf`=oqe2v#Q~L35sH>$KCI$mVTG zmCWU7CKnM-7r>&-;szeONZDsqUuoJ~_U>|JIF}%}+8s!DYUUHnKz7mJ6mS6Q*7{ zq?W{{m(<8}+XBcaW1`fa4*_^b24W)YYY~uo`sY@&-%&aYQPV92jh8#ku1<&_s zPiywlAJ{1}NrwxLSWYYlR-AQiC1%{_`4L%>JsqX|xKUx9g@-n2p8mL8euiFyx7?2< z8>F0B=!BP^Z$$ET^nXw@HK6E97XAZNC9Pzoqip$(DJ>sXhkp|p%HD3Ad++4Znod$q z#-z=XeR22PykG?6D? zfRpZvE;*rsQ#Nyhxx0!%ex}fY&T~7-ky3bZccU6Wjkjr|X9M}HNtathrNTLhob`D1 zht|bcQ+Y{tVRA9Wc6Z{AJv(y#ym!WtMOqgvc$v(O)?#q`1aai+pp0lb8TRNG9B!9# z-yFdwlcKTF<_6EDqz=;ZOx)EwKZPNS7-m&uPPhE#b!H_ ziG6MC&QU!A#la4tOf|gzb=}QOUS(i8hBzVQ*UbT&ivnV>I(D zxm@qka?oF$8$)Wgcpxhz(gPGk0BKoVrR6QTUkR_vEVGtLK&W~x`VG5yI4Jc2Wo zb^ie_3#aV&fj(j7dAF#!imF@@e9_rt!niMiq65C!r@Bh%)J1Q}K3W^iIh#-jerZw; z!rlDAop_(@g6tJws+<#w{7m(_E3r~!ShM_cuJ3W}7flvoixN$N>uc$v$_fl(5^cv( zgZUZqSdmIn3$YPSTsYMIv88BB$|mjJ31M{j5Ac&#E1YXO+hUsgL%*)99pQV`IOQ_L zNz$?%udOuOT^*?YveyX%!b(|2Q@Ob;PP)f0t+m^@y=df3?GvUH_PRi!c(i=J;_}RS zEgG!oRMlbX0VfG=pnImsoP~B2oyf(Z(P}c_BbIu6c5%3{I&+R!D*Le-CDD}s0S1GM zLFe9Z9~g<&&grS8q=+Y_RU+isPS+Id)x9Rb577KD?%>-lfed@}KJRUoFF0|NJh3T6 z`10~gfwN|RL0(BV)h2!LM|q0@u#LNs)Py|G3Ixw1(#1!K8?8>~ntjZydfq2&Ur2^S zj`(oo<9&~@L^8Xn%U_M6BcRhv{dx5xi~=kTsoqJ&dgGvfu*Y*_y?dP){?M*5+EGrf z`s+BtMkY)cu^XDvOdT3KGe;c1`%T_1AH(O~K=mH5T-_YajX-D*B4wzY{vrH>OzTis2^VrG3=Ed036ECDincXO z_QK4IzI(jbhAPY_2Ljr-YM)w8WKHGFjYzV~D=f%0B9fJVt&yq8J8W^IO@L)nOIN+` zkhqVUAg2CAIV?x!o8E)(UxsReHVlpfZrjXFvRnl>hKclU)L66ctY;6ZIgi0=bj!cO z)NJa}B&NMM%>Y@i{{Rs(ZKb19&W2UJVy##I0bUy~r448idceZ#TB_D9yWOTWQMrUb zGd#V{zlP`c!Tel1Yp|dryvK$LM?Pg^%)45!WNGg)R*%^Q+#m%w-~fj=^Maskl1Y`{ z{Tmo2XhdefmV;7WuVB3WNG$)iNY(v^zlJG^(QiDQo@p$$^5X^{2A|oFYs}d-9W=M3G0>4&K&JZxs>(+m~g4hVkX1GUIW zkMZ#h+|!V)^nu92-O9Zk`E*QYcLhtD)g9GXVJ0OI-#@ZJ%C-kdfnRZM!~~skQTY?z z3r!L|KAPqxQEnF(;sF)&;TG{O@Z*XDl@WwG_TT4CoX3h# zj&b4a{6{@2tfo^*=Q#Zo5w%wdQ3-m~!4sL%lO+s7%Cn}1xGJC?v?SyqGHCFV>qUPW3XzMMIy~DB z(Ow(ACHWhcUn&&+#Z4ow{Dt`xLdNgLj<0COJ7QDaW-~1kQ3lUHM_bCWh1$J~F)6*& zCT&$y!|FO8_;$kRwzq%?3knmDI{uBXnSa@T>16XthqV38x?5F1)|bHNr9_NS+xvp9 zEr~8__Ub+(tB4;yE@w&UoGM8jsmeijkE)N)tVVxxs1zeghgpX|sAB{+ReeM~Oaetz zOsiC))H*6DyN;oQ`rbHcUoPfBlHSjabvBQGO4=sBa6 z-S{iMTt3NXK-Lz#hl#xZ+q8c?7SODCzHmk% zdFG%pYI*lL7wKGb7xprK8QBmNrco4$dzq$Ju4=-#Y*R}w zbrVRlIxM8N3#lXC+PjMMjmgaC-iy*xGI%$tSS#`Pia+MGj3wb!j7Ng#CMb%xam=Yu zGaFdV^(GwkLYOdID4Kp(68>zg-O?yp$lhX}X$7th*JCg>j1G`<;7*jkDX%i%=JAL@8@!wZ>~1r!D&FnW3PTN+J`!>dsMk$Vs+tG=>k=3bbuE z`q3kQAV8>9QCTI|c5J}5XM{uAt9{3E`kXQ zJtLH+yFZ$49x+~8CL-Z%s4U@kr=c6>{w)`DuilXwo#s6BHOH=nQfatAL?;qE^(_?z8X03AJO0QQXQoHzy z(H(O%gshR;Xybj5FIZa7=_$+J7453ZaiG+Q*7Lx@%+}5pRjdk7{NXO-{BgqwqKyNq z=j?sJ2$GFe!fjE+=v#It59g0gH^*RQQ{OtRi>z;WzvV+tDn#4H*}FVWrNB~DDVSPJ z@!e>C2UUU@z_uU8bf)^9QlUrpj+pCp*)y<2szK#8w$F#5)_g0WfLjwHpFezPrPxiT zjT+(PV$fPxVn|P<=3xKL+T3#n5I)ou&AI`BIDyFQLEob8K8H$?)L**JVLeFBQfW)j1(#uN7=!5=f6}i>Wb6!pr%q3VVs524+5Yt*gskdWahg^SJAGVm|pZ!@V>U zm`zJqx(qYxGN!*|;1o$hM>sibp1SH}wvGV!n~w4Q0My)kaX&HF;hd*~1NyH%aV<c)g;zneQ&Q2e$MEc3|o^JSFF-`qv9tx9>;=Dp7z^h`yzADX(@`M z{M!jg^%N-VZ{-(+D&+XS{I?zZ0LxQtI#EHVboJRH|vzW?De z7!a~c{QEDv&3JGMHxlt#LxRCU$Nzw_j<-Z+rQrZb;rlUCXOlkpO2%|*rRJvGI|k?N zy7foHs7ACfwG*PIrF%1}&zvz-5l^;KyYJ$%?JFBpg$b6e5)y`ql#AX(%7Pi-c3y8Gkkqtg`E9nZZ8&l zzRa1~`)t)q{Fu4*SNrbfGzZ_s4NW)M^N*Q2lT?CDeo0CqKGp;%J$U6|5=nDDfM=#- z)cFhP;&tE6=N@Lei{#eqv@3PzbOwX}0E9Cn{cJk&VA%Y{d5t=2E=K|5E;3U``di59 zgOA5=9WkZx5V}1n5*=q)Z&H`iDo6XD`k1Yy_D_5CB41Z59{;}ow17Pr%?V@l z+R+GtLEGEcoE-K23X9qiB@iDfiF6tvyMoYCNyq|P-K;70Sf}}yrLPHzgG=QQIZQc% z;V^Vy;psh`*biX!f-CyYfzzPOjtlbcfxW23B;sDX(L%S9;2j&QgG4m#+EOW#@x*-k zXQ35uDibr?sEVvprS%Hp3T3cyOMN>w;KT9`9~v5>O~5B<;i4IkMl}fOVLF0@{?tj& z@t$MAqj1+y2Xb0fn5j1ma6h3C?l&Gy* zj-^U?_4D04%!90S|E&%2J3}us#$~d{{&SgkvN_`6I+=Nf!P-{-?<2}n??j&aB=J|D zij9{DY1_RPrcrfCjWh?~>bg(UvHwYL=rd=3n+1Z!r57!6Bd%UbQ<`ZI>o8ytWz42g z(L|VCuq`LFP>;;+%2ihv!(yfAr?l)$TZzPNM_jLnyu|GTU(Q(Z3jYuROhqq}LkS?- z_$Cgl&k1{LX~yl*zWN7Q2XCwPmzmhAMyqGxt7R(AWlRrkh8-e2+wF9#H_LZcr7A&W zm3A_*xx6VVi$t*(CRwZBd!pj%ZdfX)SSGyln$x+dSDzem353N?2qTP?A{Q8Q!AlGQ zl2P6$(JLoDKG1*zD~=(F!!ys^)97@EDT$aa^I{p{Z>+V19R2pJ!`A5_zv&TgLL=SS z4knG*DlB9JXv9>j_5$zI^@;GinWBBaFBoZ+zR(>jlHF==~f^t-eL zd3rkplx%2`bFqZmKUdA36(xSvN?<&TAytxV0A4B-)5dU0dSo<*nq4wYy&(B(@dwVJPahone%MWSc%dR6!a^u`$`uZo=33bcT4R?hF7OD5it*Mu3jL6dI>>5X%dKjD%s(0_z z>my6s=3!hl5UQ~=sFo>eQf?(Bo*Baa-FtwXG7QLzqI3c<{)*s;o7^%kbY&`HGB!4L z0;6biy3WYVzU(sFE>C9C!89Hpf%)qaAAT)SWIZPrjI)0gJ*w|kCh@6D=Yg{ZbVEZc zWp8z3opVmoR!7hsQv2PS5;75ht6QKCd6nkqS!o85Og@eWr~_$xZ(1$r()Ytp2fg^%KEGc(QGQgtwTye! z!#Dde=sPUQ_|2i%8~)M_=F)YyO;7By95etPcI$*0B@H;??^Q=?bI^-bK03t{IaU}r{5gp=4NzQ>~9SSD#W!+T_{kXksut~SSrx?|vX3s1^f z21R>#8UjO-%=DwkBa1aU~t{|bRVAEe0rBqqEMMl##4^bFScoMh5M&19;hG$GiT8Yo8J9SLffX{hx z0BWnduKc3n^o~ItD*|O|8;Vba!0f zZbvt_yGk)Apw?F)m)|n_eB<>aq%`BTgl)1Kh8S~ALc|&Qw67G}EPCnN1LCq9o88lC zi`qOZ5=~!MXbyc8-;Jwb`=jX0d9#>KP%lXmkMk&9r1!bYvO1e8YhG;ngx)gUPWqXu z;s>eu(h79F#$1`Jv)HE92P*N6zH;x&Le=pVI)Q^wWq+pulnR=51qmY{eP?X0QX33B zeiUtgh8$yA@B@$Dr7^*{$UJHU>k!%zWBkfED-3Cg-PWB zEcNjlMnElx-2Cz!3k`OkG!@#8Rs!$P(bD&Mf+N zAO`98%1tpLhkcYup}e=s?&EyU;2fV^dDRAJ*p0a4igK7+A)B%G5c;FxIH6NxXA0Nx zkz0!zr1C)o4kq=_#2E~Wif_9d^%9*nkNs(-=V*i%NK$Xt@NKI2{^_HUjPMn)>m!`u z9pCw!d1z^xJ68Ho=t;qDm@WS1-Tt8!v|}^GDMjvs-XIAZ z&G;B?zS3CYW~G4zIpUGt3z2bT{4e=HR>*g(Kp1hu>UqVCIjU_>Z_S}xw%?7Y^n!?e zc^Nf{$8Vz1lq^xX8*n3DCB-(?$$}o3pnt-8sqKDdnq$vr0BPnr5aL_d5VK9xht9%3 zKq<4WmO*LYTzIBaj5V4Mz05YIQBf*YJ~=zu7y8)+yoKkr4@;O>fV#D9Rple(qJ zf6s?l76SbEy0?rXn;r;mfV39A0bF-oVcVe+Ih~iEVesO60PdP(>3-;#R+0aA%7HCVM}~pnWF-}bKxyQI8E@Cq(T$5_=RN7ET*Z)*uH( z!I^Y>iV~ZS{$knGUY7W|Gj!lH=&T%}X75)g{AW>fR|cPZ$ULClpQe<`7AvOs(0C4$ zd>XuFgg6i*I>z{n_D_P*u2=`P-|OuJ>y>VjtTpo(-(!{k2N)fpQ3wZQeMBjI2+E{` z>^UWWH@lJg#yY#NI*x>;R-Cm3B`YvU;sA;o)zsRSEr=6upAS~*`9y1%^z>B%VG7LZ z2p?n6P{@56ul|+&#sJ3bLEjj*>6GSHS(AxEt4@u4opJ%GQQCmspi%U=qyyL(PFRgI zdCh5}mF1ow?qx;8SqZf!F6S+l8?KlIL;^c2e;;aN5@VFh)_e@VKB=seQSx5k2Of zE15S7OtFLSFw7gYi$Ymi*04NQta68D;G}hIOSqb1$r^0GNsElPlv&p8=LQc>!&tUm z2&=s51r1TqvI9u28?mgBx!pLj6-UVY;WC(lkI%HXAk0Ak z^yQba6O%T)mKLMF4M%dB_{GTer=%2z_&o-~qB&dm4#XpMc%n|}eQFh|;{7ZEPgivJ z&2cQ=OTc25=`Wq!Ck2DOk@C*7_W+E+`Hzekr)6%t%@h$UwoOfA_5_OW)L?KxJ%BWn zB_)D4Gw)reLP6>0^n;is=o%T%I8XLABWh1kzSp>kMCs}0tq{sm3h=_&r)NVe3t*@MRBU+R*K;?C?s`rX} z0YB9gVd!Wh9L-mj%?6fZ1*i_z+&oJ-Pg%}NLEVO@d)PXP&s^~mGWAb7b58WqP2$0l@u@j=-_9u8v1IkG!pe9=+|id zQhF0ecE?V_yQl9YLB5EkV=1X&Bf+>#@zN|mnEwYcg~W#@ze4(^I1M&SzgAk(royI# zRjz>+Hg9L9@uZ(P8kv2kkz&%Wu|cQp3T{U+u>AL>C$Q3SMT0MOG$<|?Lg7LsG^^Fm zeHbqjD)FuDr(iAgUds&4o-VO?OZ<2^YnarQR&*~(v<|R5Zscp)i_i4v2e#p@Jc~&+ z^y^CQFJ|LMVP#9wL#7965}30pHQdg7`CpV1OwHPL{vkyIZIGX4xp^LR^d7P_g8O6% z-p+Ly(`kr(9j;UW{K&}fG_vL=WDp8%ZFE^JE1eha!4o1eweAT zlYV>;g-co^qJ}lO_)Tib-$jPYP29GhN$$;};i`Y~tTNTmD$Y#e&|z1AeF+dmz>wlm z&zKB7aS2(pruMr?iqM@D46IGsjOaJ6JQU`5D%ue)|ALNVYebjnr8s&X2Wz2-RFYMW zX8Jf<-)-xeOS-K=F4k7*LURP;z=F3H&jkus(Ow^v2)pDEIAy6Uq9zgpr!2ef%VOEoj;nX{{e7|_rxEy zggZ{hzi|j2IGm&T<_yw`yzOUA8BF9(P^OeGTDDfDqC5$O>qekF-w-K0F*2li;! z!fq;fsZOIUVVtIqx#bkqVW|Ro#4Fc5R72D`EJPjR)#ndb^GEUQ{?0)wO_@qM2oDRm z|5dhix7;VR;Wr8RTNUvg9!#L-JOWpaZqt#arL*} z8i64o!sHXEyS!$f&Dt4?@s61^8@GvmwI-uHEml5SVmo5*Q;BV2T@xW>0ng%Tz+ zTpI4Lb=YI|_~%lTY?qhsky-hl?&`&mG1 zMBIi3L-*rSTsl8)BAe|riN<$9M5m_Nr^nADZ5>rQhYZV8eT(3J`i$VQogP2qG)n?Rm!2Fdyfc157(tADdjHtTu-_jbuq_#e}yZ zQfa_!UnZXtz0cnrs^`V8 zg`()+cQ0xwx_u8^w-JStsc?v%+K7$o7rnSu56W9!?54P=^&o9JFy2u=EvFU_fBO%H zz+a~*+K^;ogh-K(o=fLl){*g8IL=T^KEMlUbHS*NJv63g=eG0cG`{9nGW;KwK@xI< zYjGG?hpk=}GFqCwj(#uyWr=^Xi+PjnY!|F-`8}ob2*5us{lx1VvK`p^4lPw3A1{)t zdl^BWWnvr>8`O4Ipf8d9!q(KQoBno2p=xrHo-R~MvY<>XV4-Bz>b}awTzhHeYG5wxZ4Z4RyWFw4^nhPan5*4tvHfuZ>>(c-EHG@liN! zP%}*j+1^{dHX>n2`T$V7R?s9u9Gm(~de6mm>iAH#zvVV2fnZf|GWp{ZniMvh@7==W z+aVV2saqE5Rda3r-<&z#W;xN!{$Mh!hNPr}Kb3%x1N`D;ObV)w;wIPue4;;Mc@+M} ze+q`ycK(i82tcQ=r~I;5IJCu9hDY`?&0?nE$+yY0#a=uQ%~9DoY~qLGo`D38ux(u|PZjb^KrWt7xAJPka?#jD*b>70){*=7sG{wtus5P)*bC z2HWbDXQLQ&fhj-!RwcxptFDF`dtE3(!ZzK(yz69-wQMuPP5`;eEw^j^P}#En#SZAR z!$`W6nuoS{wevPSS8=>-tw-frSCbd#DsdX+wslSPwE`@9k`R@5&G1SI@>ih2RW@al z5JXjw-$VpYTwsWvIh{>|T zn2vLqr!!9Z8R#Ho;PHCCY?DW`h3FSA5Cmh+CTt$nrp(UEuq<*lHvae@z+}hFy<|Wh z78HY|B|=i15nsC|Yo6$|w_$!$a)|&9d7=XOzL4&_FH76;N?XPQ131c4D*Db_A^{A* z%PmRQ!j+!b`2dV_d6##I3l}Bo`LVX`r>eze|wp1ws$$YETDYerPdSTW` zWBy#DRek9z>$)pqU{Sp&Xv(ge%i@cY=FA3@+DQG@XRI)`zrupSH zUxvMADs>6@G{f+G*Syw1bA3|KFbN6&hZ;Rn@y&zyvod0wpib$y(+$hTlX=aW1fNYS zCm+^U;#lfzrvt@DA%XT7)o{r|=q>L#IJv*4No<>hIVq6H(hgV0!%|-<&ccj$7Y&bl9qzh5|2eY zq_s!$3|Y0e#-z*fixo(%sK*a$q{1hN@PZrY@=l5V(PmszrJaQW=)p?my7p)jp0@5V$S3uM#Oa8RH{)>zP1tk8_u6i96>PZ>!w7>JzRkjV`U;AKj!T%q35TlRve2erg5gC`=MWK@arLm3bt@s;`H zTuJUV%^R$-TDBx}x6)bkbDH>(u7&ossl}&2p~!bA)mN3p< zY+i&Cv#w1{k~HJKsg*erPM}R%q0i+i8B1*Vf-~#)ya4gLcP)IQ?b^rg#d8Z>f7|l+ zCaGq)Y${DYTer>M@jmn=w45Y&X)?c;TwdlT8FC`ysh`m=*R?0%t{Bl|LsvlN<=rfS zzm^U2rzn5fJAKVEH!9UB>L>*b8~K+s)c`>SyfR7^vT0y!D|;4GUXmoVcZ4Y5UG7}Y zU!vhpvnlG8h2K`F7#n0oxLlsZqxBj!t%H)IJ%{of9=;IR_WztiFCcqt{9h7g4~^fX z-f7M9xMP3(88(u@hp7k!scKw@!10eu;{O`5p4Y7zygV?SQ5$Qn&RNg&!U2I%nr^R; zvDXavd};yhT-q#Dp~SRZ9c#!x&8qwDwbS;yi%A^pwtIR%>gLxKRxQJyemESJ@xJHS zb5`!`oaE>X+yy#Cs=Ep|@t0h$eVWm$MK0}0?syM;=jt8y_Ice-iWX#oa;v&ZkZs5N z8#s8G^Bp2O&&n(kw~!IRZAiMmEin3O0`mc?&qeyMMhj6sDH|6$bL?cRIKr96DF%itS`yAuqg*u&xIu2(tTs*@z?BP z;I=1(cWOzf93G$jJx!n!k8A9PY`+7@itG#vC9g$uDc9 zeRg`a4?xVc+eb3#Pi~f7`InvnEUt^xcR`|Q^gNoiC;BHAcYYCUeI|XXww8MdI(rop zM*X%ijKYhi5cky_BgqQY3UPwPN}};sUFFE~YBu>o7nw@gsWcEx&ft?KjzSMex$PbH z%g~n3Yu8V=39f?io!>IkMZQ(=H=wl)&iv| zMoxA@^a(F`|1~l$FUS2_Zidz^`)T&K53!IasyDc7YF;h0!1261 zp9GSbZw%8Gc8r=I?sFVN;vKG6N3_Ca58U=e%k?l-A2^k#(k*r$;xT83Cv__cZ9LyU8bFxou1pba^AQ&T}I z6@S{K#@FIk*SK)0anEF}4)#r}rZ{pg9^KR`n5FzA1Q~6+uBF;?UY5RvoxR z^4SpgiPsHw~O4djHSmO zDL?D>8onr;F-5! z5lztO&fkDtHUkbAcvr5|=F5{~-A(aX*vI6J3A#>cyRZU^4qHgtIUq_SR6VoI-Z&L1 zc^Sf$zU2gNO&c&cYOlCTjX7E4mw(H78AM6bEH0z6FDZRjG<{dN!Py&pZt4w^fJ+Ta z*W#}wV9=kE}N+<1F6G20s z(_hm4MaCX0mxxf52(KzI$}wWR0sIWcP0v#5VxKk6`Qu)LaaT*8OsRk|VDWnIl}uHR zLs+UP;u+!9PbccOfvoNY)E^tKr@jD6m!CZ;V_Nc5Soqv?v)hBQvSQI;zK|`CxL^qqgx_jUx1HJynCAheAZW5Mk$7fvDiQ@ku z!)0Nk*j@ zOORy?dEVjDasDvm%Nc-ULoa2r)8{fw=v}&4;bCE*RQeyFGsQC2pkJb4d?f@|y*M%B zQ}8cPSBSQxWhmS9vp=3&Tc-VJ`n=l2--$jgYUiz&YCnEd5j7HvxwmMQA7lkB>6L>t zMNy}6viSGc_xEosJ5=%xQHPQ`4PUnvKdxoaTOMUPV_;JDRA0+}!;m z_BK4etYXbI(j>V0cf!8Au?`s#Q?$pqF{e@O`I;IN&XBTO3Npe{3nZ&*#dZZUJ_2Us zc{R@d@gOtCVc{9$b~2Qd{O|jz)W^tP11mI@o{hTM0Py^rO$zb(d5-}BhSBh$YM#2n-t!;HW(1N_7n={@%X>>9 z{#q;P{rSt{mVo2BRfEhs%kL=SrjV=9Ura|*5ibYYj+yxI$k*IVY^AdNrIMN>Qa2gj zCB>45ERqRq()U=%Ki+VWOeHj*)C@8&h*KWvafua`}k=C?3z9h-+PFTKmZ*8^{ zg!HmY6^+;RlEY5)I`UbiHCfUM5)tnKZ|DZrCpfv|NCuG`KuCWB}QB*`*Sb< zv?V+EsVLAIXV|-vko6t^=iU(hH&b_&g&8MM(*04YH1)Th>ZvlcLs`0Rf$I4KA#ZWq z!(u*v7BbU-QG)msUUB$R?HFEOJ~vf0Ko#rpc>0AaKphfZEAMqkqy#d|2Ri!tjSPf^ zl4N;`S`9e~_i^JZ;K>2%pOrGPaKvtWeVQ|(JbLHoE!*g#Zw8wfZ~YqcJ7MV zvqg6lqgVnl=ltFtyV)|QaH z^hV7C*{~Gtp(jYk9O=0?9NIXNEKe$|Dl?-5xkGU&5vtjcSc6#Y`Nk_%9pEX>V}rM# zGP3ds6kVa?%Eyu6bu5V~+FASaI{2!(KESB1R#mzdoMrB_%K)FSd(QoSTvcD8K0Ky1Efre6HvqAX4`}OC% zDg{lcfHG=3J?!m6Fk-$bvXJ0;4{O{24aLV#`D4;Fy@jCeQDS(F;m#LGrNi1)BEP~W za@ndQn>Gs3G(vp==9cx#fOWA2L|l&82}$-B%k&(}9<4hyNtr@neAy7>G7z<(Z=kr6 z1&OunkZpT!zCG~shndxNHT}6!h@7_=Yj&dIM>9z5(Md?Tu<B~M$ruf4u_ZY;TBk3kjbMGg4T%_gvK<`Nz&@h&^@gH3@3g$W@Mqcj2m z3D{X9Zi2vc0~O~gWSYMp^YS&JO;Olii*Eu_4^QW=9sSCw#jMWVDgqQ()&kZqWQ<&% z7Vy#s53>6ZqPCr20^^q5O2UmL=KH4H14Sono0FksDlA%T7DG(3kd&kk)cWIoddv;w zjK1oUupe}3PoK{cG$k>aQ?4B;NYqK}F<*FGX}KOu!-ZlYv&0Uk$C(B4WAdrR@Lx*Ibi zLVOu7U8IDoxA6Y}m!1cH$b2gqmcJv2If)1CN;=Do^M=wTbqCZVWq*55k-*a>WeV@K zM-tkE(O7M3*CF$|SZEuQ{Pj4r{8r2q{FRpJ`3o!{HwF?C!ApHySFO5|Zco?G5)PtX z?iHLgfg5=#6VoK|uZihOf{h{~xrLE;;sV1PJk)x~K{9M;w5Xmc#ePC#wm)Sg*puV{xhK~U>kYo;RiIz6 zPdp5c?0RKmH%Qc3zqnHwCc#_ymIs+63;HNw(p27Z)}X#%<%6%XiBKf{Nk25Vt$ zok#tc{e5xie|T;9d-~ynGSp9xoqY9EAoW0`y1GwkT%u5yvO|RPsofpr*}ODF#sf3YzIM&Qsklw z4nE-tN(IR$4zva|dnHLODk;SbdUF#qJvb5~Y#kl!YkzCjt%}MSh=` z>Rd&svbL&qhJ;!)XZKuKBIU9D<=D8R->>30Pcmd~Iq_kPzajN1lG+z7_L0%p%(#$K ze!<6VoBqoyABzR|DT&QF&6as-6sk%Blz^WJaQrB@O@P1Y-vD;0PnVOhPBaMiJ+~`w z39@ps-3?PFCiO~z=RBo+NlD!({ce3vrYBg;W;ddYM8L-OS?_s!i;s1f%w{tMR9~Jb z6a==QbOUY4J%%Q;Xid$?w0e>f6(XM{`b2<~@26=DIDGDxTx@zq!nPF?d1=8~!BSrn{5-JRXxi7<6SpNY14@^Jd7{=FVt#2Vg8m70PD5wkgM`MMMsOx?3 z+h{9Qt!}_#K@Td*dDN>)RGZjo@pb*!ozSwNZ3sy~Qg5V`8~JX3JO$E*j#LH`mGIXk z^3$Y(^Ue)AHtCBWl<6%~=`FV7L~Bq|^z3ix>+?yoxw9muys*T0@K9`fU5JjUq@7-=pw_n|7*HK1t&PhqR_>4(@WQsp*7 zWkg+S)#1}&Yo6O*4N;rfmo%Nlz`eBih}i!C3_ZZ6`^-6rWR_IDAqTC1-o*9Z2ii3^Oj=`Kcvk0x*nY|EI`5B}dnLuC z!~172gvE%+)DYsyQqP(6C!n?b@de^X6rRk^7F#AQA*1(g4y(7~SNRM{aA3E65m^~| zTey?N)YTd=VGneoux#5&+naC1uTM+_)Wu7PHKysb;I##)1uY``Va7BXmV2tE4L!A~ zwJOCxb@auf;cp6|WLk0$Ei0U)_}uGnK!16_8XYUGI&{V;EnFtyG#($)T5S!bb5@_c zcGn}&V4EF)n;xKJ7-LAnYV~$DU8BD>^`!|wHou-V7{I`gd&`Q1@sm8Ymgvih+n;{u z(_nE~s&!d&64W?IQ`4p|lz=xXQR{^nmo&}dMsimmIOw=G4tXDj z6s{FhSDJHMttNUJ`?gAkn5gmxy8PAKpz|o5SuZufOoG^2FOrw!S{);Txe3{oc}>P@ zJAU;#N{@+a?2+fbzz(>id{^QvciI<-h(tzQD0$vYC}||OJ`JbL79?+a`o5ifc z-8ve*+KkJZV!}bUF?}_tcTw%+Fn#uN;AB1$Ww$eqWI_#9ZE9@_-;|Or6Z1X)053dP z`RX=sJFg07-aDT}uPfzBf3q(Ogm!d2nd(Ue=dI$@M^BK%UxYa|?Dd+QtWG6yBP_3& zzsA1j2{T<*qs0u~5ZO^LFGFbTgkP=>kZA2>yr~+O1O&XagkIZ|+~dFpoxccPHqmF2 zn{z!;H5!Uy#ca649uehyMzS+)NX!-d^*>0b(a^emIIMt`ItSjk3G&$&{`Zz1b4Y%T zOpQpTBr3O4a7JLA{_$N_eG-tRpG2Goy{)svJ{;s~R}N@yl# zjn!?27m{YNq@ER;(&IrVt<{rEjCAhmhlMzYwHZ@gQ_>W4Uh4Jq#>XF2`CRwS@9?Jm z1{KDRxy~gZS)g`E{8;7Yn9lzI*=)raiK}d8RV<>&@Zavy{$~USwABr+NtBvo39U`1Pru~$Uj@hJ4hjI|WE6;hn> zIQHP5+4K6FpUVugR%`X9qBeik+r7{BN5p=oZ_g6GU_yctHb}4o3$flLh5d&gG)K2X zbdE|=4Tb|ed(W$h5{If;zDN0Tx4188jp zMMT=zsiU97dV{qYMPba!|k(N`O}@ zH0Kqx;soZ|ivgAVZN?WZq>tKC657?~rIXy^$k3@mkpMPqr<_rB<&VU(x&8yt3`Dp= zN=#g*9q`y}Om)ecQY->V($&2=X+|g5*TagM9#XSD+(223#$z$0mR}02ahOjfT2?mg zjKB+xtAMzx5|I1O1c0Pif=5%+%MP^o@pAm=b;$@Em@lQtVH;|UZrp%Jt1EPUaV%#o zKN)Lz2@Mi#pBBWC=WVg+$`>w6j7UOWjPrgw?n($C-_L9R04E&amW`&g((y>kW-1-0 z$SU{Re21V(QdQwAX=St29=dP!9dJ*{xnes`B@1ir9Uv05c#>_uZ%h9G)M7Wo2`)%+ zEJ%6BBrYQ>T7e+0Lj=Q+v;F19OTYfGI4B}#Fsbcod0`d^P}w5;_S)NE672F3fKP0+ z(;DMMLQ@?Hx{F|vFXpdKxL(9}3rWrK^3^J4VVYw_ zh~ZL5u?rzAB$IHWes{LVZMVTb9Xf@>T0*KdH`4r(YXu$k3)v}8p7y`)>5h7PZTnZ| zxKh=YICCZJxt7>`#6*ZIExkR^EVbP`sU5c@A0x5FGhZ6Gla-{l`}yj(Ddz#z8dT-J zgbV)4%90K5YYnzI){g<@y03I2Gg@ec*IfC;skz2aIrVZOHcuuZRj~CwXAvqUS*hpx zs$xV!izN7zI$Qbgj(JA*vd)dvAjf*9DsE^=brPbsw$1EpN_41Lb>HWXg!>r#W92OD z^LaX}7Bves1l=qlWl5Zo)l4Y-b^_(Slsg4kL?tIrnWs~YgyS;fstVF@?}kt^OavjM zC31-IJ8qtX6O5pwV+pM?lI^mNYtUzx1J2f1_}sHeyz&; zsVy|893c&)T&YJDXOA33sb_4^#!t&_J1$eo(3Th%KVL1kBqG9zFH}Dfg1UZOKr1`J#PJrkN5YNq%xggYT@mq2*w2=hFtB3;SSaE)?Y%6eP+u zdRvc&7ZPKOS`Yv~00e34xdz(}uvw=607o`>omNCP;U&s>&|aS6v6&5%L?>5tF$OsPuA znVuC>FV4T0fGk8+|eN$X>NxT+aimgQo#8XF}l3Q}%J7ERA{Yz>XlEiW_6j+J5kp6KtQ z6o9mlWCqreYYSat{IPQKT?bQf?k%M#N%{eRUktL~q-F|jJvvDDX8a)BgQ?5k>x)&E zU?wXLY%Z5{en4YB7I?F`tvA2JfrHsdT0m{Iq;vxw@$huUDM2FS*kiA6m7!tszLRVx zQ>Fg^3N}x5V@r=NQuHF}Z@KfwnG(|#JhsNA`FUX(Cm)h4SbsI{WVAwR!>zU$hE=LX z_s*lJ1Gw|_#`^7FkV*peKCY+saN9?xyHJn{fg>FDMDCf|TD2jFMl}?&mj%hrT}jyW z^~A~y6hlVC#pjHJ2@u-=0e3_4+&;&i_*%1Te+N8ulq{{UP%mx2;hqw~Ud)q2C=dT#Ww!oMG_(l_5;F;pbH)Hh=8V z)A664_80t0NIM)R%Bf9Ck5h@MA`LH9fjrHZ)d~rKVa-NFGT@0DglDaf4xv6DP)}wwEPHYBOqDTT0$o zKq@B5NGG{F0gm0R3}_yUn;ii+DDD~R4UYSm*Mw>p6;u)U94h1SR zi%42hyL2Ta8)BUQ07)Mivo8*Es%T5gzW)G~Yq3;g*P%M>X*8OHN(*Ux(RAD^LeiT8 zpp}nNOZ}aFqH{m9og<1hNlwjOPQ3pBy1iSFu_3l9NK5P7D5$ulE!(L>RjdlN1HDXu z8dNR-((2xL<#IjK?DKm-LD88z$2q zri`(a^E%ZsM7L^FqBy5qarad6!Lrf?l;PUnpIl}JNjrsb_WG+sPN%TkVIE$-VE~l? z2Himb{_K3L<>MU&K9<>0Rg~fqMZxGV-{WJ*CdaSdL&El)<^_B=8)`pZ?>zJP)Z(cNF-ZY zUt&42=rw$mVO!#i?3Ec*s$N+TNmZL#91pHSy!#Svn-nrgm*i2JN&Q}_KWta%lTm}(V)%-Gw%jv&L0X9aHni<*|4Fu;H@~_ zn&j51@V)y!R^5jO;%`fhiXDAG{Kh%4?PbO|8Mi*ffk$De)S5Y431N^6Yf)9! zPwf+Aq?6<@&KpFt00zNYW8pIUsfQIfm6j{HtKZv<+9M$@I=^^T!w6Ga(gH_tR;1s| zByJOPT59oOX6(TtX`Yzrl;WP{sU=E4+}qUH3;L6Yx= zu03iCNR<(yq04lVtG2GgWZL7QKRgF()e4;&zUxyNc9UGEz5&|fs_1dc*wW(>_)RoIBwCzi`-HrC>b$s^5a7ALKC_O{@SKZ+C@ zpA)!$IXRi?V~6du#HTqG#5Zg66w3TVNZgwb3BN&%7&FVV93A)xpnVUg=C&rn4TNd@ zU~aBY^lN)rOXG$_otE=lq`R7EsSgQDPzGdjLQ8~pQdCkE>ac$mg};?K+KSZ70u;W5 z!h8tzIN)Eh4;InFo-WYk$tT>NmfJ62(jsGUn~fnXM&Z2-Y9aOvzHL*95I0{igSsTR(p9fS7M@n z<=G=)`J7WuIA==sZOK`ttsTdc9vo#Y$%Q3IZsY(DnBK?GoEWlC3M<@YsEO4Q?KXlJ zazsUFumU=vQJG=a%n zFU?uzp+k07TBUO1MpTVTd86W3Qc{wej>gye?Xe{Fv)G3sQL;Y_V>KPLy*8j5epH8m zD_PJI0X|6rz+;abWTef?oJy}!r!=-_Qzt4j=y08BT0A5ls!lo&?Cb3#QIW$6Ls?cl zX?c;?8>f>o&je*@Q7$PzioqcHZ~33Ai3?*b{5QHUOwi#VcjB#=OXkQFnoF-CrrarP zsVO}Pw|r5&^~N|kKBqdloF`AM)+S6$NH8KGC6sDfP%Z%QHj=ap_>@Y8l6SI7XBjw# z{{Ru<CYb1WFyJQXa0?}3_qZ0fVlW@}HjSD+llZxvXqnmonCp3dT!`~qRqx4hChe72 zt6B&`1<%vu~~;=^qk8$wZ_H*VT?wky98DibqJHnbtN9T~xhQUxjZ znhHa!Q))?NSNtmkr_h`4Y!*DT5%3!82lP}p-aAasZGWBBFU~o-c5%#g3e`}l*>j## z%T}(JJ0yAmVf4Y1+1DW|Oz(Sr2(`71NxjEw3T#BPccQumK$t( z^v1L;bC5!B9w6$YvX%TW{Mj1(qlBwt)457jED~9Y0+c=__D&cp)#hm|sR&mw^RYMT zaj!AvnDl6+rU*#sw^N8^Hav>#&SLICKaj>O^AdEol=Lxw5#c#fqCZ!csaH`ZH|}uug^Ld?8yXPQl$ISprx>Td8qmfH8i2EB=CV0WyAoPc!QeI(!J56tt}7=QZ8I`@T7dd zc^mX@QWT(wX%NT8Wc{4kc!q?Cm1Y@@;er3*3vc)1@PN5)1 zgBc}GI)88-)O!q5=d*;aFK4H7C1&ZNQdM|x)^3a5=t=BO!Ad_N(%6r2Z;RCqELU5L z7hHNIb?A!>9;BOVUz(4fZ_gX@Rb7vF;ug?K_s@VQJ`z=*f(0o_lUR1VtJD|hK#*cuhz^oO>%4EJ4H`u($iNP zYJzQNz%dVa{>1Gw#t@r@(qixE2>Jq=bCdK=s9N;|H`8oF>V1sV&fI z>058M+_tB|ag^w?i;E5bP)Ro;$|@RxDI)f2Ao#S1xl2msKT(r~ZKQiiyv6N8WRE|5 zKk#5l#=QNPJ*INB%!yp3skrP&YCxAwsf4`}Kr2FQOKMK56#|tc?4WJ9II1ptQ_`~} zrO{Z;3yl)Kb;PYS(vZ4BidIW+f^DTLOJiC{8Wf^PDJmk`w-7jo!wQpAW7c6;Sf3f8 zR+}9y$rIAyN>Uz#R2)mKl@^qyls4t0g!DTRoVV=f(#?0-`D<(=9zgb!%yg~_X3UA1 zbA3BCL}6)w#V)hVHE1d_%WUX%0b%5%29{Ew3QCB&blVlnJZ8FGMyZ=>@TjbVQLd__ zh%BkSQQ9TKh{#w$Qb5!Sh*g%RM%w}g^o-VP)oEyLmSf7FBcC=(!dY`kRouIlvH=%2 zupr*VT;aPr*XGE2sS1+hWkOVt?ANKwvL!iV;vfK!gcX#4kPw|h#DWerKy~i1i>=fG zk8ua=S$Vc}iW4tW>8}vtAm(?3Ai>$3F%>s#k_Dfqx3>KENP;;6qj2Q)flNwB`UI1q~GBkYzOi% z^8~$6fFLs3lXX}v2k_tGAY7#*&+-J23OR6NJx}Mdq^%l)m3IgQJ;m?0Tl~f{4EdDx zm*c3n8Nd+x1wa=~heK_ZVm%L`H^(HpF;}{uLPQL+Ol^iGSuKrDmeN#SC%SyQ?d8_y z$%lVVaBUBVr0g{`!$SGU9yu=<>FvZZ9mdBEbGNKr<$?WtB5Aa%#+D~nl$ zoTI|5)lzkZO3?wv!w62I^NSh~kE)gj*Bk`mT?S58&h@G!#?r*Pbhjfs%2%i%X;qY) z_p!Jq%wu<_G&QbS`ED*DH)VP&xvMi$Xze;1a-l7#sam%PD_Bj>%J;`by_~p5kZ4?5 zq`}HLPcc>6N|X_sXUI!zt!=-_P(xt=bxPC+Fesq~S~o~E2ZR}pCQ#yzRjkw!7YYqY zhu#Vo8WONc{{TOxJG;Vs{gCRai7uBC6H}C(NpUGiP`>9+mHjZcRFt*Njo*Zi^X9aA zbXucytlhx-e>F1VR{`>85%P$Em|!LNCufkNbg5cOZlDhRZajzwsKX^rftNTz!_`x% zk=ge&FqZU$B`M{l0SHI{002rr01kr?ZaP*txm2mhqGdXzCoSb!iD#c)l%QW=mk%*W z3O2e^rofHQPb@KJ{O3ZdWJvVL8I_F5GAvXxCQB|R>u@9mDM?8>2{$@>V+L6oSOWzQ z=lgE8aq-?As#jX$_a3suJg>!S{CaaKiA-`?ek({8OHHim2p&N@f#{rcm-;zk(Ri!F z#%JbAl4=quZkWiYsbj+GPm1FEf(ve6x}0A79CPQ|Wq$FWsst3CTAFI#MH~LVt|flO z99VONd`m?1yjLDl8e!U5T99WYPa!G|tt1pJDJod%4vP`K-C1vqjMqP!3z~WG@*dW4 zYrK@iHSXzdIueGGERclRAbAf=c+8oCpOk5C%$l%}k#wM))NvpG07(>Tc2196k1;Z$ zNMSE9_3jpx07bn``frNynsZfSiFKPGI9UqtHaaKN`r|4|n-KEuQw)jH9rg;8`+IOY zPI=B1-YMnCfy78kU8}%p9yFy12{KXu=n|Bb4x+_d?_dYA)^(3T&JI%Fn7B!uVIA;( z2S(QVgZd11SBLyLW|-eHN)r3-3oNJtE!<+O@$>p5TFzOt<~|hFpygCZ)a;5h{%0Y# zuW+UokV+Cy;3COC2?JovFF7z6COh^jEMrV1XJlmdd-i+F`9X?(SydF&r4_1TnMLddT%ABNP{s?w{n#CM%_KsN;;JFP;*_1^Zd zvGm1T%ekkE+#X@zBl|*TT9OQR9Yb#FHgFBa z#j(u0#fnOPMm1stDh0_zrQFpv23YfKwJ^5fCx&CEKL2h%KPs-HVTZ(mtNO?dcxTTV-4TsC= zh2jexbd!HI95Wshm=64<&PCPsOmQi#GL)^`yrH-%H^U}#&MeU4*=hm8ESACC{V_70 zwqQkZ#ULdqNhJALVgs0XY|GUZRuH#k>o+YvtA_nk>FI%FV#yqL8YD8Y&-18NE)?9+ zJKrT;EnmZbFH92X)aK!|kd%M`#+X#UcS=D>NCLqiVNBYbN;?T$xlF`D)DRqfz}iZU z>@G;(W4EEkTv2H@c~3p|otjLOfJZ48Q9C4+s=R6}7p2KqLrtWpl5t*URjM3U&SC^*DYjH@^2bQ*U#Itv z@AMee#(pNhn5&4PQUas^=w&Upzd7sdK109!u%dlJCkAqvqPI1s^9;tl>Z?*vxQNl% zuHDa6wvWU|VW^CWoM(QK_(IW%q9)&Rrdh8!(K4+S_)N(}YDFa>GM`523bxH8{w1Fw ze!KOtrd(Iz?MsTaM8}V+9S%7mh@k90w6pk>d!L~5!VV*G5=MTK)EHdIS#}bLVU;TC zStrEe&*EB*$yct{#4Y!fTtz;d(Q)PYY>|j6-~g7vkR!g7#YtPg?AimVCt|OjEyuI> z4bD)YIZ~XD{wq8JyY+1yQjhaLOhR}Wz-3d@9=BX9#iU@nU-eCf)tRJv?r8qpNR{;`wj8ths0U*>O+lFD-}vbI%{EyqZHTG9WDhaDNs^C(m_HH z39!Az``&2OYUDhuGSd`z>8i4a7cJKogBqa9h)P}7wE`VUSh`iyWq5ShLZdeqBIdYJ zvu!lH0_l+aN?YwX+T+`8E&{N!SFr}<1d)F&8v&+;(#|@`-8bhcZP)2924%^REnk~RaOx95d4*4@lc$*on~ThZ76DQ8FvUA!njwXSXDU;#G6 zAZZ(+yKYlVOrKenz;&v0g*JL9w5|SIV=*Z_U(A_(D1y|8%4wv4ggqGxQ%UTNL|oWd zZ;Zu$^zZ@=%y$4Toy46fFSgWI0=C(-sXi0vJCFI{(U~w8Q+_;WS#j9wM>&KnD73OQ z*+TaOf|U!7hioy#TZJvD3T`+y(o=g6nH$_+0sbV==H!km)ARhQlhkTeRw$=Ps`!+| zIVng>3Ygg4OfO1OR5wqFL&c;XUKspWX}T+;0{f%uQ)cDITc1glA(;q11xHW?D80x~ z=%9T@p8bXjTtD`Yq}HmD=$V1$>Gh|93_5NYkVUo%J0)Hru{-uA#=wU2N@r1Z>mEq?6yHcgk8lufBd9)LV~5__oCu%7J~T{e z)vjXe5+0DJ0KT~jbg4lgUt*QEukn%F7Vjc^OYs*aWvG-HGtn&+;v z?|!H!#d`~O#eMdk;$+S#X9`d-Moivr8l+Kut&qBSOeDN^w{G=5V?|RJRnS3 z_SofA2?+_1pbdgezbsl$W#4FasS1ggtFsJOSs@T+tyTp+n^EjXW8bIFyw|9$Wv3sG z@G=+Avu;~RQWMmVnLnl&<2>vs49ICqX~xzTg`n7iH@H4{(#gkWTxE|`#mbWoPZ6J( zU1HDKja*2|%s`n`sY<4{p!4vcN-@_c0Bnw6xdXn|JvYP}g3O8?9-$>UZkdpByjBv# zNXc+6RFVenyyb$Hqi(7s?~1*_tmRRoWd&5J`Lk2-%9Spd`P8`W1ppjMPgHo5@bt00 zygHn?om2s?WD^c()TyK8LjIbVY*8^=Z!Aq_>qCrYP)HgeJy~zX(?bMvb!-u$W?5UENsYF9l z+^n-IOGvluFTrpI$xV@a4U#d`InB0Xx4-NHR@ zp`e(x1gN&+l1-8{4aJT3A0v&~JKJw8KKxiT%!yk<-By$$?Ki7y+^t5|01{7-CfEs9 z>p5m5nP$G~>Cp_8EGd>$@p0b}umE`jxxnu^ahoeerPNWDV$Xvurd1frmQa$eU;|PT zox#(qu=U1leKr^m-HHd?tq3M$&CuZIKiY#wp(mf3>CXT?s`zupeCa1B(jS!*Fvew0 z`@F;?Huy>LhL#j{l=ULRYms{!SzDqrB;QI>H#q#`WX$*Axf^Dj*P>Y5*wRTU@f_%5SkgL7kd2 zG}bdG7IPR^DWoe>8&TY(E2&5}DpiH-02Tt{k7N!QzsAlWOyWLyQLP}(S1qX?B*~JL z>sr)0Xl*(`PeMrSn;h{8$##xhe?YAqz6*7OO&_U2eCw8kaP2m-wxhhy#D~-yBgmAh z-}A&_Tyl@YT(C0rH8B?zr+wuyDeWrqU+9%Q<;}o0*l*InW2w~amzI5?@;aQ%^k_9Y zgjo;8TBNX&pc3MO3Qew?r%vMA-xQ0FKF?V@hxz(a^7Lhg=%J@xjN|H%8GU{x?w1O- z3DQ6}>wegbj8=5fs%Kk4{ZkCiIRcs}qTlpmxhgCy&Y8+m>J=9gP@1*%FD~~V;Q=ZC z01ht;msNeVlq*NODC_JFwC#>;`z!lSO~_gLWeDU6xtTAvha}CRCeA}n_SV@2D!*Te zA70%W%UPj}($jKdF)ll5Yf_t;9ZanUZHQ3c<}N*P)I|2l8(z)`T+i-HsdfvB+ZzKkxz=!E*ySKIxn{AP;-Bx4m8yBEiQpasMM-5*@H%=wnOry zEFrO{;<}F39WQ>j9k8aT@p61i}=Surq&={{C}{i=123==$69=o#w4J(Ilr!1*3Pfcl4Czt`I#@Z!;=Rc%><;Gw<>WBs9LEJk2Un zkSst+>3y_DdQ(uRCL$IP>J*01=ZQ|Tr4?CPn@xZz)qN!-l-nH0 ziwKudO>pUTZ;oj@1Oc|^zf-sJH%1Df$x7Im)2)S-Hf^mdDLxydj=T35Bk|htvJ+%2 zJFcqmLyq}hEo3)yoaKF^o~CO=3PS8meQG5ObzKv56rVjH*l&nFWzG}xOs7>oTax6; zc*&CCHZQt%y}KnN!j$#{%#vgO0MW0(82o8#Fx6^MQ7)Mg*4mQcapXFel!a;1QnZBu z%JC12?~rZ)@pKNI?3KglEteCPq&V`d3$Dy`{Op}~80Y21b6#5**=aK%5$5Gl3T|Gh z<{3@Er$$?kxNHJb@QhkM4Es4k$_=+ZsD#R?C~8nv;Rgo1y~1h+QRX*Gr6QK*tCg!; zg=5deZ~Edw-7%(#=4zSRa$J?goPL7$Z>DDZ(_Bml^y*_#;l>5ptDzP z>4|Z*wZFS*@htwx>GIy#=)Pb6i;SsMN>uJ`uEEN7TM?3%))lLo;)zjF@el|LN-QmH0^l3t*{IEk#71PT zMl(q&j>>jPC#tR7owq(#?TKAtD_;9ksa682(%wqEZ*v%VPc3RZ<+g9AjkW{=NWH*T zB9q;D5z`qu9`}0(8txEv@xXgNx z`wqIL`=U{Q!j}mH<$Pu?qy^W8X>44{ZEE*GHbPUWM%xi{+a7ZSmg`jc6zMV8lL|sg z9%4g!(6kV4l_d2C*W_@Ww?Szz+bb*lNhE0o;`iUDU-G^+zT>Jbx`z2^SHcj2Zf(BS zBY$4LnBzv$XH%j(7@rgUw3PCiUF0BC|2sFE`05 zR-gdh*YE3r^>>F!hZb8=P$8-9M3&pu%9L$#T02~nq@6Y@DNWA98&Ktf0FesZ-Z)w_ zI};*5DybO@uf(4rw_auvQtXx=bRjL+r)S%H#J1f^Kyu0(IjI0&RfSHQT9aH7l!%Lh z*l|7-6eOzlQ0SDaQ(huSB-;%>phSv9rywA$4z3G&(A#7wvQ)yfl{BNu2?_&Mfm5qUAQtL38)>ELjE%l6yw`Ipq!#&?pShGgQpQnksRanz}x|PQyh;3lNaJ19!5kqlKf)?fzfg zYsh>)oelNPoyuii?jB{1YD1>ZCib~V1R*O|#*Kj`KmrLXgzo14D?08{%Jk||S%%7< zRQWN|OB#yCl^p;Tc)T`32+}*GD+fQzsLaO;snZp)grIW7LHE)`zN^$8>M7)v&HMG!4Iw%^AAYO0pHLr8=92h0e$wfhs5KgRi$dR5!vZBWe4D zCa8ho+QXK-SPCU6oV^7M+zWNU6Wg`HGlTTv(Iow<&^GcdxDF8M*W-uCZN*x71Kt|J zp7Dn(DwSy1XI6cJ=e?z5sC_H5o5IAeXsI(1f0G65_Y=2FL!sfMaSvYSW!D%rXeT-*Q*EC^u2K z^4q35qwEh#p;i5m>sf`Iu$<$YqkF|6$nx86Qk2_An#6XSbcCg`%}UBa8kKXuhTOJ& zCBxFqjg!B{j+1{x7JH8hjl^8LEonv|S;h?z9>>I8%`7x$;7w4quOI)SywRKIBoc3OD0y?EXm66r7R_ss5Ye~mlDxRZm<9sJNODn0xscS>@)h_EjNhsIf6+@2vYk!FKDKE8Jkz6Qw4ZO@) zA%V>3l&whtMPqORhSohXdUAiV6*@-`;K8j;YD@049bfvmT5h6LK?*zkR{CO7ls%HN zR#;`m-Gs!(%j`*Qu)FE}(i5;s z5mG>;*Ui^>H7NdieWRwU{du^&8qQi!#M@#_fc)j0H+YkpGHhK9tUB}eiYg$gxa zsj7>aCe2Dc;ndNV^D&CF^Ayth1KQ=pkINi6_K4#QijNmFY?{QF_0-quGnD+6oAB}y zzjtSsebSJa=~8XJk}gj8>(?FlhZa6WtMXCDXzqf3-n%15T9nJ~SX-weNca zjtlWsPmUzj8TVwgA-&0MqdyeF9d_#wr1!2MO^$5pO9v zOO48D4Ys~H%-1>OMmPrV`7P{F7&Z4hSMya% zBzr3GvyZfDMcp?D?5# zoO0lkU;IFy*BTX*!s9m@O-1Fq%v0-IC`vD=s=$I3=lWqm4p3oecj~-k zfVdh^=+EXU)kPtB%Ay(5vRaK50{wfmO{^`~3F?Nu78A1_&Q&PvwBQ<^YBI&TUfi!- zOrhjhO}Lf&O(JnO}lw;7D{WLs9pYqyce%gp5#Qa;5r>LoEQj({gE);1=J0)vS8+;%R z*k#U~H{k|xqy4p6%4p0rSP`7%NOhIjqMN7`CBhI6!*G+^t}UsJkeyZh=?(33qpDnW z&GG6GAV;dqT!AoYYGQ-s*Hx$}w&7Pm6cf;rdSWVsiBz``18=(>viVsWf(pDLAa^$@ zHa!i^w%*zCmxi^5>y(;RLL3=YnXEdMQ<8MH+#zz1mo8G1%nDLZVr_e00*bE;SCncI zqDOu$QlAa~0DEdHpzCdFwxlUqMx>nsuTLX$ha<~~w{yD781e?*lqoqirq3_jCe3vL zA=O1zq@iR2Qg-XOJ71{Z8H3(Q&5z{j5@E@M0)0W}T$L_k>Rz|qTCP-jbQVv^BN>aF zw%TMu>Q@n#+)J8)aSi|wpxQ|a9)14+PtOmG$Z8~2lc8^wc#sqcD!)tl;iePc>jljq zApuHK_W%z&{&>_G<;hx_S(1xcDhd|^$O{vWeLS4raLwpY*Ww^`u>SBKM{GA#sV%!; zq@W>Nb3&{>X5-Jb{{VIu#&$bw4tuszlu>nTM*fGVL;RdXNwvqBS#IJ*oL6wt?7C?R-HdB$= zCjL0ev(b(F6CKu1)4m%nCNO;v=}~?;Q{ABPR#c~$_p=pE4no1wv}j2k4e!%&fz5GL z`Ekq9Wi4#D>XzhLg3=l)x8k*&PTfV1nnzq*zij>)y!0x5bA;c82@z(cD7KM%G_!5H z6rb>7mCuAqm#x&Pvv5)z7}SDWXkAOOBFTZ1#y6l3<+kYM#b0TuTyV(wH-> zDhn3A_9M7Bp)@Lkxq772!2wCX$8U%p#QFJrh6=4_B}$@8eiNx~r%OVmM@iidGL!er zsXfM#s@`b_YvVvQj%J4qisc=u35aU7x{JV6I&L(jo=CUuGLiM0V6pmWfS? z+Q*+LDHk;)Z%Tyl*#)?Fv*7{ zboucqOPLm1NkW_ewLnV0ZA`q&svs;Bl2C=F#8~Pe>~U65Hdd~6m>l0_-s)sYu^eV> zHv*F4HAsM;_Ambc^%^Aj7v`JT_us{dI+Wa&My*Loz&1BY`u_k7LAWV0t5)I75&FcI zDhpgz)FdU8w6*QkXid-$_iQ}}OiX6e1crcVWwoU0O0G_m`SkSZjR8ci0Htg;mKkld zY?P!WKOix)5ZWGLk@mvrbCeY#DbiMykQNjTjgP7gy)i6l;95z&_QaNuytXZ215q{u zt~@g8+}Ek4H>E@kM0kgo#)L{svWs>WQf-9|D{TrlT6R9TiXnM>N`i*iW6ce-F_z=H z>Y5kSRG!#zpDDOa^Ax=bR={7W#B!%q4mPsuA@;zzCu@HkU88$mP@2sXMRE*RsEW+^1_^p32!B*gN|J!Eb01nzBzUMAU?%e?wUp#mDluwF}QNC{5hsNTZh*qe-gc%eU3 z%atZ-F;^lCsLrKL$!h6SZVM<7q0o-FwzR)(2IRwx#cPz^X_k`Y z)ucJ3#C3&;=>VK_vcI=y$WPw=A5mN2F0|Pf5#^#t_^%shm-#LI#8c^8o-2 zBwPC@9N=yz*)VCYrR64k(x*^>Hf;e~TPM{@3)`>>JKqwV{hsPM{+UX8Lnw(7n-wv6 zarJ0Y^|-L50(Vg>Q1k;G9FU0sZPMkLCX!rtUAW3#(b2P1ro=qd)ZiRQQW`Oqo7@tT zQj3FPHof=6u<=H+sZ~di>`qv9v^JO7Do{;@w@TC9O6`t4)3~i#M+PG1dSSJ7i4DV4 zz|O4;X({ooRsOUFu(3`n2^IRJm^x(3;|?=a(qQzSdz)jH5iol8ASD$ z)RHwJwzk{*xQ@|sJetKlx$vs6-fhP9A;#mC3lV#R%*4@LBwVw1s|(V1JeC4~dX970N$Yn$7B z@iw7ws*ORUrav-Nl&Au&Zs@tUngUPji4`j;(PPF&ifnfXBm(Mrgjk;HxyPfxnbscv z0Nki{RBaa4s^wCoG+CPrI)y)|ua*=wYQCT?>$V)J6gs6!p5%5ZGn4|i=0{ouibw4L zI~*NqO|wp0$x2&cfn@|F1f&ZOr));q;#OUxNS28;s(T6vK+?G=2dcYX_!#N&G4%JV zoTs^#)~b)jA7%RXYs~cO!%<$RshDOj-pWOSLasj%KZ^tEr?a!M8g+y2PQA*ur985& zkC;L8#k%4T6=-!8M^C@F+;r=?L}yj2;qH_h;BO~5<&gXGlI!9-Y%g1!g(tWq`1Ilo za52;!x6MVp&AQ!G8lSS|c~W&bDw58jbfwqSlWUuGPBRkB>&GfooWmh;GW?pW1HvS( zGfF1gTIELg%of|(E_L5!IEXI8k@Xa;kfaiAtby>~ru}jCEr^Qcyx?hQI*1CoyzOqC z@#ZwdwIxnitsvV_NZ-oa?son7_3p2Tmb}|+y2Wc z5Wn^hmJ7L0hV^XQHB{KC=D4(i}_u-d}gn{@I&WljvzIDG-uDJy9*r70?v zC?@Yqa3mxWZ?FL=0U&fpCg*%Iz;qqCQMRBh59<6Vr&h9^MuAh0?}n)vQ5>-7ReKZz z-6q5xw@uHdBDk56T*(=Nu|tytKUAkaxYC_kh-syzL==l#QQM`?JE<~kJ{UB5C)6Cx=K@lOP8w)Q`$REbQerAaAiw)z{36aIKxL8&f*R*4~n5(A@Fph^@xjsF1X zeF)!mR+!~Az+VAwtQDwsN%B6u{ z)ZzlVJeP@W3O8F~<69=)L0cZ+gVz$OZg+`FeoSK>32;s1C8Z%D4n}brNm1$uNe1Vx z-$=zpZRR>dklg6HdoX{|J2$x1-Ff-Rv( z{5Ayn+Zu7d%duQLgWx5O+LlR-=3C5_N;}DI}6hnfVQWJi|BVJWyeoi@@> z{V=5M?iT+5NS(efhkmPMnS8Yip|lHiDg7}b;cjb>8#Or@;o+Yh>TO21xHC11k~^Vd&q8l}LN>SZ*fkd-4zzMyUm`w@V(pzKzbY^OtmTsS*- zU9I*MgBku1L7A1NzXrQYP={H|vShgAZF)k2n?jU%NpT8Gh$-62vF~ep24J4XtqWy+ z7Si@o50S-c_9CTHvnKfkv6Njpo z4p7gH5GT_z+|0pEU`vrtYnFQHt1sndJ@SQK!xI5V20M{zEP9Ycy~ zYSV3MNZf;~KeRL~la{Gg9qsMQ=wS@Ol zt)U~O$tPr-P%bt5Owy}dKg;#ZxlB2FqQr$$C(M$Rs!WBYB$Da~Cz;_SsY+40j^lhQ z{8l?729nWz(0U)Tc6g%aioF_@OLDtJLWA*TwgR18RgzhIK;FtoH?Y`)dt6=8AF_^c zs%BPU$I5jl7EOzeMpJEiU23vN=Yj7HeW-KRRpKMriXCNK!L7o~wH36c5|t>%2_S%l z0bl?CC?#7E4m#Px-Z4VWR4ku0B6V&SXkl)|mkmuvWhxAX#s)7lGzS(k)7Lwbc=WSLCIVQ5@*sI(d=NNk0afO`Y|tB#`wJ_qob zhw^4|cQG{{qnG2-lJ_aI%b2&xZ9pME3Ajti1m4GfxVT>494KQpaCVbbrqa;7~rxvSDamh_Ys?*y+NVHkQ_CNgtSK2B(GrFPl&4flq3>2+-;76djfI# zcM|f`w2AU#nx!>qY1OY%b)i6%EC4+eKf`|b&BAXYBu=7kL!d`>NWb5R|2ZCwpj#+mXL2_(IgK3SeCWJS0+B=uGG<`XH}YD zlVSntRsL9Xq-2_Gbw3nJlOTeXDH@WIb8*=q_8swzAj^Bsr&s2kGC& z4O?3MzE}&&$l0rp)rYB+>5gTLio>N7s!X;FiG?a4vc<)|B#@<$Kp>{Xg#ltXv&3ph z;x=31Xv~`PWqs4lZX&{d&WaMEwxcJPxEOsIc$s$~j0wJ8m&zcCTe;)0F$Di_~;KaGwg^U1LN(4Qe2Hrk@Xl* z&m5>sJEF4!xt2}0cCkx!sOUaQkdUTF)p*zs$6?x%g|8}kC56msO@|i34#c3@M11>x z{{WUMPqv2yS5V2*E0owtoQUld%ZkEm;@a~_9aKDq{#)&fV9jPVLOf?+Jk-=lPPUz8 zVQr~DwWw@HxKbdU@};->xEfn>Y>~k#XmKJHwc0ug{HR zE~(ms=@qC5ZARe_>JEdwt^hYbEJY>5TzAyP!TcoLLUok~Tt3Q=M}NFU{h{%MTLqOL*^mR<@-P)5OE_ru%TbsY&Szv4aq zSZ&QEkFv;7P?NU6?Q4#>QX}RIv(IRLJMXYp+xi>0<5#EWJjcTsl6kp$L`7BNwBom7 zKwE9EN20=$apsVFoAtvVoC1Xe3@T!{-ShJbLCsVOcfC#Ow5T6ew9Ee{Ct1U#)3nYE@V zjOGUt74C6Ri%0SbBdWa44)6};cp;w=*v$E!jScGMMtw2bgNj8up4@xADA;^RO|8^? z!Rdm32KWO_;Y&-ZOh0Vq7f=$ZJh5gI)S<9?Z`AcWVr>H@vmY=!nP)9iYaFuEZm69s zGt{B9^Z?irdXfe3+r)k|W&Rt%3z+zoIo+6r9O`k?*jp7ZbHHO%R`!Q{PvCxT;yccm z`MfTk@`{XUXi^m({gRZ68xEJZV~NKHG95RCSyDb+rvRr@Csely7gLHw^%LCLDHsH1 zZ*9pmdWx3a380qllG%TCAD|@S(q-t*)F|+$RH7y=N=h1({C!1Xhja_15(iDk=ZZWK zD61}Le@pgabnyp=5NXLPkr9`@oLz<-MZsW`)M&6?okJ>JD`nZDo@T5ccmwCtD zBKx+hr^0mD3)qXR$R~4cx~=^pSuVFq$nEEhr!Bg5UIXR%PnH^Rt+0(f97#>mkS+2y zBKYT)VB=nD<4#ftt>&s`XpsR*QkkeynrS+mK?ndg(g3&y+KC{f?O}W>C_98|C7keq z{5-5uUE%g)%aSQ&+S7|vh|-(2$PFkI9{p3bzi9ODa=)XqiZP+afx~RkIe%x?y4ey2%tHeY^9RO4-HLS1YdIm;l05!Y~f z?TP0b;vN=pHZjUsofSB;qcc6FM3#r2im!P}-evF&@nSNLbd32!bWkLrxK zS28mQ8eDDVk*xrmg(O%TjqCtB?~5Ilf2B(;<*E}^2J$<(k2*_^(ke1oLvfO~0ur4n zcFIzK(2y)U3=8wWwbv3j@mzYBPRkIf(Ch3PdwG7Kg-?vNsE@o#j+G&Hu+%MW$lQ`@ z1r_2&Dl=Vmv^-+PbQtX&zVAYb_3a`s$)10aqWk{Q$7UtVYx`+c+mDJyB*jP-p#C*W~ zw}f_}rEVhng9{{B`mWvlu}1xzy`8w9!n*o%2M{^bwknrtic@l%5%t?w-k|`bEF~t} zlWjw_v2!T2`t4d@+4Lg`m93R)eWfYD*t&N&N=5#-S=)5Cw)72dnWocqN2f;|;A8a)kRT%`#MOo?4OZ)Acm&|<~Z z{he~XH{I&Fu57%|R1WG4ys{cftVqz>EJ@q(6ZFHJN&^v>%w`;Xu}KM6K1!0GcyT&U z#ICmal5mWW&gXsO=`h#Fr^wYsxGj;YFnz6R)e59n8hRxKq}|(_spph8C%H>%>+6n? zWbEYgD-osYkr4^-ySZCnc0aT~QR~{a@OHOG&fd}dLxmlb{hFFhC8&!Ey3~ZfGgFuI z)}v$c9X7$?G-)|aJpZ^+^=6OyNpBx!9Y@u$D7tb6>iE1=pPdX$|SW3>Bg zR<5h@3zKcT5!VtM6ZdhcZ6+#F<@Z}B%#syydthDc`NZh-E)C^alVYj9 zWCo?VA~-7?$A>w>qLhFF>9=Ipzu+>_`pf^BM;!|=IU zm8HS~@t&Pe?!+=r4ydw1kGYf;Zly4JNORHtr?4gMQxVJRZq|={*%Q=y~At9FnR?$WtA<&Z3D(OQ{3!*rcG|*4&j~Va9BWSBp-LDoej|kWJ50d*0`4Da*?Us4!HuAsd1~ z^go^(<|Rz5Hlb^O94e%OiLs5qJi(0zZqmMSj!PzQu^+mfKP`HBaM&wQ9ygrr=sd8= zSwNRcc$I&wApt}l<5uKh?MrbCi0!Dj4^)lsgcZfHPKu`9LWGAJAOYIwn=`T7H=P^ks~%4>q0*R#G&bs<0<$8mAJiMA_lVz1>C`7OxV|qI84%TUgfloI=dJUCzx;%r!+#t<@iD zAe8U{4eC%zQk07XpkJV{*q)@Ed&LogTD@AfR}+FfL#1(7j`3;Pb1TB3WyrefGi6R? zGN&#(WB`HH4eMD#NJvtwR6@46x>fEc&Ze!gP0DlYE$aKlB3x!jPnrVU0Y}i3{O|?H z)GV98T9iDcm+8&KetHUh{p-0Vd+9+^l(n9}h=hwJBK81cKT6J3isfTFM3Eu%J00lm zl9g#jg_m?8K2{AI{{VPnl%K0Sy!c~}RnkGyL0~c(wLA90&D6}(?BANA%PXKtaw5{? zda*(j&>-BEAxlDr;^hieujh_r<;Z*|MoW!F%G602sewkl+(HR2 zxLheEu#ys%&c?>({{U^w-##}6=~a0WglV-XF`O)1sOohAT6fridmD|$DqpkyMXlyI zQyw))6v!G<6Ypy(TZAud4W(g9zN5GX+jO|TmM%e>KM~@VZcZ?UPYs6lQ9S7~1zNcD znuSrRQe&YJloG*HWht;BDp3U&I<9mJZEFFD&)LYL<+xzl&cU{Uf3Vg?F zR3z7>zWQ1%zbZ3ffC2l&2U%IZ=@uPD_S+V+f3==i$dsw^7>`A!FtC#BKYwmp&W6FT zQ*GHKbtNIa{KbWam-?_H+SKaFZ=&8ct`< zl?W@FnNcuP;?7INIS~aKo(KSf*&%4Vok&)c{vc`(4frjY_`bS*LWN7SamOSSr46y6 zB!#WV7Eg$%owO*CYhKv4KFpaXIeRy8O{$5z^s1X;HBA)xt!Y;GN`q@dM5rhL2uayy z_qHX@UfEuFRFqGJSC2Z04=%%}O>u;)k`^Si5|Pha?ju)-m4RRse9i7t@aKt;vi(L) z1C$wl64b)Wt_F1`*9TyuxYBn3?}>JN&v|nu&Y}wBmSZBIw@i6c-AhqeC`c+&+$AYb z#E=O$B~};$)nV|jJ8@bx`cs*IH@z^ZR3g%A#z;!9aN$Ew8v<0INfy45^UBL(i*+-Q zpMlK;wD5@>NcNDRWoT}px`ZWEE;O|nJm;^|;!z`^?g!Tu=QME}G4Ucma;q{_YCXwB zWjH}}*pc8CNcoYAMK{^+hVUSXAJjHt_;nW=lOeL7U0RMAseCZWaULs;Pn5#!LS(q` zkfa-RNm%fkdLNcKY>4HN)g+&|{!3aXF{0Yf*#7`EQ+N+1r9k$Nt<>4PWPO_zrV>HY z5SJE8P5vNC?|%BP zIc%j3R2~+Q&I%tLfJTx4>89kHBv>3z=^|YUTdg=%9#bm?3qkcZP(8u^AdaI2j(6iY z9$QqZ_=LcY3Ou7N22v3oQrl>JC|K90(&vB9_{=oYbEE2~uwRasoGBM^wdn`wd;b7F zn9OuSY$7jZl4HmQsIF>8irZ03vNv!52ui#**a3dnRT8G*ct}EmoozuyDciy~zf<{t z95O0QnJ*a0x|D^L1y}--0qx%kV>0vegRVLP8%~~48dYl>f^_%u^~O1*Tl7YX25oAY zPlnl1ZX@ZtK;KFg)V2?rNw6QYr1!xdi#|P8Byg)0q-#M}#FZZDJwf#tu5@`bDUGcQ zj)@SY4KGAek}gNWMek)>xdd)O1YnPpX;p@T23~Z?QBejcY`BFHb7I*#l0e?cP#wWg z+@v8O`3lo);qCJyIn5QSYMO36R$7n&DogHj?t34+)o%R=!{s-NH5NvRjKr30U{X}c zANzs*Fga>fTu5!X@e<3yAQskC(NVeR6bK(x;pw=_O4|2`udt0t@vXa}*Z%8o}nY#q3ufyRq&X4Yl#|}B>*X5SJh<{fNm^w zq=I*~1y;*Fx5c;i-_Mb_ou8?dXn{d0qcYiSt5$-So)+nT-S_K?nI)w*@ktgwM;n+% z;R`n-{lbe`URGPp6oy-p^K|;+5ur~lWje^{Z_{zs_}?QhRH7xs#-80yIO-U1ERp0= zciZKG1Qe-q*+}Z80r{L3;bkPkf}}%muA?CulJuv!Y_yOrpq}n1Z*m2O_?Z|Qd0qbi zOwN9EROq*E#DhfoZQQ5^W~Qs&xyf%u&XuH#5J#u!hSpsyKGLo5ttuN^*92L)TQRv6 zZb(#Wvq3i{rK?@PvZ9fQ{Axp-wp{l|lv{mGxTS!92vR{$P(VtFJvJRMc-}P8T+dO$ zmMO%cg`l3}x_V^1>QGy8s7!m12C#O?mY%8u#%GBsmATvf&Pbqw*rDV3~upvUq z9YNUbg#iH2U5DBHSc|4}TeiTR&*VLRss)$x3<@%|B8?tLDBTlM;@f)t0)mpDM}395 z?}sToRISqM^xDlVA`8^1D3eZctA``0Bp$c%B#=P_own(=ClwADXL|PyDD{QqrWKZH z%34{OPlkq{c@7lr;?kR}fP~uju`0JxF(Z4~iW9som0yWccBfJ16^OANLDJDDNLyrF zD1mUGr2~5b*GXHE4Th7sUo)BqK<7TTwb!p?A8Be=v`+$Z{%n3sXf<*d4y6rFfy$E6 z0d~J-0)>x7j`%aNXit6FD~S5FBS6#;qq*t$PhXw<#yE%l8oX_X!`?Wxk*m%j?5&xf z47Q0$8d{yvm00xGvuD(|<&NILksTmMZwLfRVRPsKbG<@aWWBxehf?JLV@`k4lX-YD`uV+I2lHN|FkLEhMC>!s;qQMYUW; zvNlk1BMCXnJ=Jr@W3M6Dt|ChP-j)GEwYJ10S-l!b-OXwsUj48cCv002x+@`kg235u z9zJmpR1*#@&rM6*pQaAp$;zLfc<+%YlOiEerd60y((g?uP;pne>0}%qy|Dd`7nO5w zyyQ9pDNPn$mi#(gWH{Q}ONmKR5K>A?Ly5XmwSgcFCiSBuyHd!R)`6H6l%x<9r%CiD6=coGjFzH47eMeG_3XN>#_l0ye5;=FyYnh=Q!ToR(1z6F zb%icFtpVt6yjAS;?Ol|3eOJ!Z`i(_Noh6vAL`*c7LyJLtDI|@7ve0+!d{PcM)+-sq zHPmx$PJ41^RU{XlqvgEAN*UvZRHg-Of_?IZ4Wu-wZP=2gK(?n60XjEQfHvF! zUVVlAt|f7Xk3`EWs6?gasxd*G3G{es5Yh@%<3{4dYDp>Ff(PN-7H^3e@|T)3ybPHR zOK7T6lHF2uK??iWVZflvP4+8r1t{tSB`HbMsYp^mB%&slyzCX@h|1vB4a)rdCDl@# zRCzFpB{1Tfd6&{b@+nXv=}WdbwRHMh-2BB14OKHDbHnOA-qH$Qb)N_Vjf~H%|6Eg(`2Fhw{ ziFL+2i7BD)Za5L#`^N2kY1jDuy|Abfw?^V_ZPNK*=N7f=hn#HXP7 zU?-GNEGl)yE)?eeH2Xqj*7${(rq(!m(p!ril*rJS>O)`zlxzZ>Qg?7&M67nU33E7c zPT}5lrPMNRTaQYM73SG4!Dp7FAe|=b15q8xH$Bb^b-a+8n+~YDSaQUnNZCO4H|$2o z<}jsvMWxX4dsXVB7bT`KLsbSMq-tr+VYRD%i3&Hl{3iV|&h;}WdmhubqUm~2jqH4G z82Qv?Rx)#?l&Sft=7Dt-wcow2aZ>W{wJuA`)H**9 zvc`9EUQ3fHG}^@?LDuXC7NQWc-HB~ON{-^nNH*+oZX!lidKzCsl_ERo4mTl71uIDx z3QwWf>@9}cSu1JLlHuCcWXyaHwzz3M=`huD9NLM{WUWXajY&`Wtls$Rf4Y%;P~rJW)297T_EZ@Lz}0o=Ke~oPi%^FZwwDq@ibl$5vam;<*SE;yF)TG~ ztb$X@eO5b=+qldt_87nBKEK&B_K82@ev6dMW}1tHl}XgCi6yjeZl8w^EM|&_D6{Va zK{wOMZp8lpyNEOz+$R7DogAK)4rhUKlyj@l5h+z>)~gSaO4KTt-Is_@j{K$gK* zmo+#2_u(#qdR-v#C5*%a5~OruEqhZL11Y%5bs2G%2cSow?qat%GI&P*_> z5YYQ25nV};5|k*qzzIqmzlB5~C?#M8Y8E2x-`kqO_V6+c7|Eu{T_`($x<3qdg?UfzWkPoblpKfp`oXuKqPJA>@;v(=SDQ}v+|2r`gbK) z9twLiRXD9jIgQD2V#Y+19hhhyBA@}e@&Ks<+n*NxuCp>+E)r%+g7XW0^;L|8G?txl zOKGOT({p|9ZO~X)+rA6l$kp0iLxz|3 zu)-f|%(U8TIWnmssq+gm6Bf5AZF5&8)I7HoG=K{1qM>^WpeEl5#1k)y;UTfudnUSP zSBDQZt!pn!Y?H>W$M;fx0q}yQ#kdr#%|52iTgneR$}C5YJ^A6x<)9@*6d5$2qy$eE;wI{|~(w9_#rCCKIXAOWN__R>HvG{%? zwy$|=fvztyRA(41mh>ef#kGR%qyg0E+WTTQ?;ElYwIdn+TbX23sFVz=B182WghVOm zl3Y?Waxb_yLXMzE!Hl@4$P(&%4xf_i^0TDOWl1itYuj%?I96lXey0UK&U`7EM~=jL zWT*_cHKxENZxFOPut4~gAY9+EBeo)5)AddnQn+;~IlhSwzT7&feY!|-D48K{B_MKu zA!Sx@ivzx&OjkZGadSRo4h3auK2)z$DDpD=YE3p<0UB1d0F^T)DNqG%l7Xxgk_c7$ z99CMUbIg^T=EYAny4GdPj+ApMj*UhuTDENfSt%pLZ)^Ci=W|1f`JQCD7Jh4+pE@XG zvF0RSw|@Tsy0yFq&M>ln0i}JU^w#Li&VDDkIO-Jo7*m9$DQ#eDBbow;>Nghv3|G3I zd~%gts7#|XHIo)Xj5J6VaoFlmATQTsg$r1PC|hBM*_BC^_5F^ybqF-|0N_+blpri@ z0=slOTe#eLLZ;U1^d{jaFIQ*Crs_~hTZApAM($kxE1rjLzf-3k6JsV0|@g~7Z>2!nI z!y_ULi6D>K{9Le-&4=Hr(IFG zT8+s#@Re#!iQl$0pvG(`S98kBpD4`Gz$v4IP^}N$j9VK6qn8qyckq zb~y6#kYt?iSK-!dr)D|?wLq&tcbdcK7qPJgBzH*!f;)mn4D@en+{sDe{ck)eN}8O& z>vC!_RCJb{N&|e9z zwG}UoG0bXwg5;)9mA=A`ml{t?sXa#LuH)ARY|)Y_*@^-ThLV>Ex?DgSzccyojy?Mz z=jSpX9Vl`^P-1Ewg6L0hwB0{H8c~kCD=>yA@E0{+?9t8Q9+5gd>l#zHeP;D8Z2qw)D!2@>lkZSyv}&)yrAFsYkla>+bs62d|jwdf_&GspqH+uAwSQlN>23lR3mKZ7f``QLwjD@PIAp(By}3 zkpQ$Ku4dy5XgZsw#xq>CwY}g;{_1`ueD=kD;!hAWD>V9>?5r^z^sVU(!)He@r6i3@ z7B&C?Nj)~Vd^P5;X*vulq?$%dj;!ZhY!F{MTZYN$a^XH9^0+>DtXyBr+(^uli*>q# za$`7kn6%TSr1=Y26K}35Y}6X!FWnqRDQ>odUdmkwioR)`U*YyiM0xV_okpJH@mP{w zvYQX;Q6OmvPOVE>I|Jo=cC&^J9EXsy{#at9^u}nE`1I!8cp~m4rjmf8w|zL`m$Qc# z2M#ksP9{7`Jg02i&j^4iNxyOkHt%cWt{fkI&LdLVn%-k=XmzoFb!kX81b))gKNprW za(r(Rq1YdOQ;ac~z>~5i<~+t16d5wlES(AtC?Om9fna{O>xe~XG($@%Vk4>4iK^Vv&(3a%9Vp{HGAvR;QjzHn6``1fBk;6>~rPR^%MNCzB#O6&VQ{*2{oM zSg{@(x}&)R8PelVBfjz9%`qIYGx*Iet6t3q=EIvT}uwi-j|9mrCLcF={EXfbTXj3r)2qGt`VSw?s^Pu z=jz+1o+?7NqPu8}~N~g!9A*+RJ_ctAkO2=(UZL?#&_wqO_RH&4g z0I^Tlp-W-+ef_1D!V9vW zbtx+rBW0&zY;1P(v`wP6Vy0atr4qdXX}*al30jAiq**^*Cmig#5%`6b!TxJakh@N! z-AC*G%+0wbE@jDinaWL6HWu972`O|P^sJ)8N%cv;d*EfC;AS7R1ur$z4KlXj1&Or2 zW3cBFe}PF!Q)@OSN|HtnRGi5xD=nlV9EwmW0oZH2h^jXHB_J&%`XG#I&Q%DRp@)6X z-Q8CyCF*nMnA*1_3#RHpze8X_-rHg&h6!11*!wAs^0CzI!lyiH;R&DYfuE+U-ql$| zrY4pY=7q?O5yuUbl-Lxfp8Bn8T`4_9hcVrG`jr_>A%e<7fQ`D3%ct!}tb7YH3Uu{h(e9C%SDg4}Gc(4Cap=#4z5AV}48 zJrQJiF{RVMWLg2bSsB2W_=Io$KeBrEb^?!>XVjUfGa3stXU#|{;yI{7 z+wde_*S)%tusz7e{LSqzRpK>frh?mW=>Y5GHbETa5(9}OZMMe51G%-%15wc_%ENT} zd`A}*rd%Z~{7xpq=hTY>-1u*VVx1lVUH+rZQO%To{DP{BZ`YE zi!p4ypvh?8z`Fr){P#Cl{3=WbYOHgYCB>;rbpRbAl0NV8#I3D|c7$oIm^C01KZsMla3 zV`ap&r813bLn^Qe z^^}&MFy2yAxHhsATLxLa{6 zAqqv?7x>1aq=9k0jk@4tJ}oPVS@wk0E||k`GYqELeqzzP36-UVB_LbjOWKp=qTPYS zHHy51Xp1dqTWO9|`++;_+TmzBf#C!j4)+}h*$TN(q(F&Nks+8>3Usz=4H)VvO`BL+ zK^|8fJpsj93k9^VLnnaH!^Mjvl6Umm*VPcRFBIw=Ii=Tfr1sMSbuQ7}X@3_tTZwai z_9^_y^T4l&5~yHL?mWk+!wiH67D`WD_Q8wbwpH+_LV}4tg4l{J2cg_x_3TSIxLjz8!V6}6#{JqWZY&_JN>I8|O@-_> z7vBJ##gVzq7EvPs&H$ocwgpZ$VazYNQ-dj~NegMyHG(8Gv%aMRxIORRea-Ps9cfIu zwwKf%zIf>8wCx)${{UB5jZ>2FsK;!z{;>9^8#f>&N&|6VIvZH^CgjqIG%7`5r{kse zSdxpD-V3?;5KiOegs_QhbmV-BFWCcee3Ak0p?QM=pt7C#S4~Th-In!x*I;~!kG! zCu?KTJ&cSshhV)tQcWRy#S)L1KiZ!#+}~^-fEB10GCfB$CH)QyFo$ zNPBq-@+z?_h%B=+GgqWn2~F=VO5_25*$YyD{I8D@a%NMhMQzt;@L!bY#m#IjOIaN| z?R<0ckHot57y!jVVIyFb50EYlL78!ZxLpZj zggF`;e7W)C^LnR439w1>^4|E&bE0Py>hq*2=Oh)aT~zASrG9tDVxQ@<{{YQj?NRzD zcu+@9xcU@H@))1DlVKFJR}`r(TEzudJ@($#+TZoU*SLL8d^Xw{EFZ?`T92o~dY+zG z-0_$apJkBnhKh8m!?5YLJ%zZd4xn_mY!q7IT_Fx>FFxwKg}RhnU$)(Teppfdjp++E z(IhAj3PQJ079A`-N#Dz*@l%l+pR&lh$Ly`cSlP4K^M+^@K^^Iou!kedWv7^T#^%H* zYPjuXj5kWi{73eEp1G6>BB4PF)VNP6K>&FKo9Q09zdSj6IOh5_FWKKAWnXoEL61&r zKuJoFNl99T^#T@>y~gLuqJW!8;|a=5sxs#1s`qD)71v_HI2Vm`RUoIv-J-8mnM z#;w#3YJ96#X}FovmnSaEwUp!S>tpERcKq<=P|LYLiA}A_CS!*swVNReNO&i<)<4bg z+fb+Q%ZlmdQEO3P&rsc_+({StU-w{LRLL2GhZUEM6jSPO^@C>_LxAiF?Xkl0W7y`x zyBq=9!kK38WLjNL7?(t;wGOh6yHu5GX-m_46sQtYVpIoTn8hmgwDxArth*EKM_sK> zj0tK(iViyRY%V!~-F|*8{{TE(ZX4&ibcu*+beL3$KKAaYj6!XLVDgRm$W_&Szh|#Z zP57^u^4@IAT+6(fZCS)RnM-hy+*xHqr=|%MMUD?+w+JuuG_n2H7cx|d^qj{UQ>-&e z_Z2CSs)HfGH77{`5p7nu1cTSU5N5XxS2b22X_HH&>r!E<)qtRaZZ`l09mVv3I`qZX z&s-hKwdrqE8+J=`61Av5c8aV??W3)&zh7KeEa$*x&!OCSrVi;>v=eeiqsS>RnKh;-@I9MIFU zV+R9mFw@Fm0^M#9K|Or%2ToO)lj|%?TAY1`mu0r0ve0%TuaW%mb$y;HROnPxvkhqo zTD91BzkFx)42dI-n0fBEa4{i!iF=YGp z2dF+&U5PD} zH&SIKQ6>O2wy!JsA1r5Lbr-YCF5s;kj21i15TX@k$XPm-ncAejmK%C3oeLxK0zhp54xX5&KF-e0$aT7|N3M+%>1r#FucM5U)hE#YgksOptI0!& zDPF|%zf2{ROJps*yC>iQ%nq&64mj}kjhtz2rlA3+-3TG60XB7`=7o*Yen%YF&F(#s za}8>XE*CaRlv`Yo=7hfA;Z}=vBdw2HczCy)z_-_-;EDk<_u6_IQA95u%C4+?T~4W?BwftW;wru>uHy{8_7AUK`MQ*+dLdf|k|AYV{8Q4R~Ql9aim9lF~c z6Bt-Yy_N}ZZ~~V0<*B7=N5qqHjZ<3)DS4r0oZJs1<%P9+1gbQ4o?VpDHVa2@L;hb} zB8>7~ZA`0hd_(-l`Tlrp8y11WMpSxZ8+mcwZRS>{UTr~0akHgKP&Wh-(E8)std^W9 z>N)4(v+;J^$mJb5(&3cU@m%|_>C%4t|+LuvQ@by zU2&~IUmIda5}f7h2wC`V(O#GykT?p~Pb*rKrKlasheA#^KAwl5R{sFU8-2}4b4fen zYw?I;_r0+o_E1s+E)RTpVneXxw)-nBy3&Hsq0|s=4n1Fdd|EXPy5h_#!;C5QjXfB6ZS%lxkyVpIsI@LSth61+We(u{@M5M`V&)2SPO`5N z-5{ONuIV_$nhyom-U{e3=keR6--sw@6zGmXskHb6H0At5&k;DKYS=ij@;E)#@`SAC zN{1FKWk{0ZwRu=1T|}PS1CKmC;Y|*#^`!^Wph_0nlmd{Uu}Rxv4jhH#!W>7k&dFeG z!~_O-IdArhKQ$a`i7EPglt^V|E+qbbn6owh2GF8L4j~FA*RfeYyAXLiIHt6RK#HJJ zs}BjG^+g%&wtYmlId%OCDs>hZ787IrpE_t=LRlYd6;y#NrI#@1N@04%dhb`vaPip zytYUn3u8?`EJ&XPw;hV6-6L?JWpoDT*2H5c1q_}W_9`3K%C*_R6)!rYz zRdT@}JZ2T~f-i=dso^aEz*3YJJV7Sr#Ez!c09&u9`QguSLwL_=-}UNY5#ObUnZImMw{?A6E`(%PJ;#FiUXvs4 zWW;Ld(4dv2WouDa)Tp1S!_5zijz?LfW=30(o{dWh9wF0v-p3Q1pIHxZ#)RSvYia1n zkQ)Fg3PYE3!aIv7VV1R#=sB8<^YI{4WG=-)#u-KL{p9}umNB1-9P({Qn1RCinRtCg zuErCo?Y5@~)u4bC*d864k`9|2M$rBYyWMGml?ihxpeeL>UuVdjYbV8|JoSfW&) zew`Ltkn1jllxi!!$riU?TplR(X#7g17GyO}GPL;GTk1;h^5xs|z6u1*G$@oaLY@%q#ctUaG6D@KzSs(+Q~@-w0~%IweXLJ z+07YJqSG;?m9`b(1qx2x#^7Ofb0B62@!T##<|Gkvl9GClB5@FzL!B6ETnPxa`ngK5 z`r8F?GB-oOa6lC#r~`Z4VuWz_h_Z6MLOLH&LRF*` zuf6eV@}_rYs{ywga4jkq0{tSAC`XWft zBM9tQII<>L7Et0<<~rhg#C(TEppSc{KGIM{!UDgJBiZho8jHpEQ4QoM zDZr-?gK~v*ApVEzf(B=&3XWd6UactJ!yS|6BT4L693ud@9?A_0txTN_$g>=2Y`8S7 z1peIQsl&7TSxqQHH^>VJLP< zm9XiJe+jtjjp`vo8dL|KC3!0q0O?6^*b$FZ;1P;Uzv4`Ljf+?=a&?4x%eW0_YzR z1cSI8hWp|Jdkk%cV0c0M5MP5nvZ%O z@Rk&!w>}#Jk-F@o@ROu z?~N3iG^(^Es634&Wa$za1EBL&`(urnnJ`FNR{T$jRtE$y&(!CeASt+Dg@4^3*nVm_ zNy5s+=#}=VoW%spa3!?1k$q$ojkX_(_dm0T{vy#`r!tbKSh**1?fZ7HBM}Y~LVl~o z{HYPAW9xRL$N}4wd_&@}>9+ou)4`HP$k!B}TNvov6xWOyeq}yeu#Y)zvmqsxa4Rejr9RbmJg&w`QS#?93_O-`n14m!eJZ7(BPQEaR!B%&o0S8<7_O z0RI3yW;p7dbTrRY0Hil0pt!XomXZ#!)mFJAAK*F@=Z6}TBog8hd8oNsM}o?*0CfJ< zt^93<%57DkgaD$DZlx(eo}KP3`EBZa+>ujd!h|6LK;?jy3lO3dPxIRU04w82-P&ML z6>D6mvKnnDjO&lcS-Z}l4*OrXng0Mgb;g=RMZl`ZnIHn=PNqhn3W+Ehu1}rQzt0a* zV>io6hJ`J{Mux7UE^cjZ;8=YxZR{SYbjBk{GM$gjbtzCoZUCZFeJA20&wr<#&2`qw z9LpB1zEaJ#Rybpo>8w^G6L2N+EFZ>A6CMEvkcYlI(Wfx?CwD?SgjYD&2hThMAl!eq(NODh+$Wg~5JO zfmQx(Bx4W>1FV#DqP9-CgFH#&1t;FAwOEj=NKTc;d7UXy^7yayzANQ(JZIh?R-X5U zz1_gC_N;2st-9Xl1bofGtl5|5{hU!g@KGQ8aJ^gvq}GK_MM7mZoUU$^I?9ydlVm4gNk}7aEJZU{0;m*MR8yIwO>41X z=F*|_NxmEbj^|_>BY>t&`%N)ehU7|&l`Se+DO0FAwG&xRsJGYn>$9zvY1f(*FPqI2U?e{{Teuu(FwsGTj@5NBF4M z*Mx0yqzp76Z#45o02FEp1Q0u6zb(nVILRY0EBm;Dt zoGqi}>DlT+*`mcRqS{=Nd=0gKHCwNs-xiuS1`{^J)S=;t=9#f#w7ti$+>~JB2epHg z`a6_ttn!mqc_p{!1GHq?)<^dJe-F>4P*RMAD63M|vvny(*$XGmshT52b6MuzNgR}A&=GYVR*;K z1;m=LJN|38$oLbizZv=2u4GMUCW+hu@&|v-47gRsw>Wx-Voq(@&{4ZdY>i1jv%hRR z=dWu#-O0(<;@CsUuVxtS zs;35r7V;fAtnVAChiuQ!w&H#fwy#s{zd?K>@Fp}`X6qhlNYo?r z9p?c+OQIG5HB#81;3SRECx$lR$UE_Gi1rEz}{ zd~YshJiRL)9kEAsw=@qPoA>%FbCbBK!>p^3P?}r_)9SQ{QJ;(^QX|Edx%x<2(J4CJ zR+r>0;BEp@1%zA1tTH)iw95~c zCO-8^Ex6hvx{~pA2|}I@X)#iP${;$Tpu9}Do1gNfKZU>5sx+LdCaW3?(J8Y9UL2$$ zZn9S{Y828`prYGvAahc~igHV5O4O64ixa3=<546VV$`UuhXMGl!u+d}8-(>bof@|W zJCmH5UTnCBWjV=dK&dHO)_|QrA*RZb+m9a+y0F1pV})|EB#gY?ZpzM0lT(jTUSLA% z>YBF#Rv!-Qq@_HSC1*krVwKpaxG!qmp?>5!N~aJte^6qN+oVLY^eR7`nSHspNATcbd# z$Kn1~c9hrKGo3YBTX3aGaU7OeZ7jUv78(kXebT?WVa44_#RU5npbpUAzy2Bi7?9ykJ8I<(EwZZ-t4Z0zZY*VWO{=I+b|ccJvnke~ zLlov?!a^M8vfsoJB}qemB#S9Pq%B3<2_(@oG_va7g$d_eQCgO{WcZK7ejfet1gKV( zkn<5tg*4QngUv)oIkrKz%D5IM^Xb!UIfa#rC)~#>o$q`1zBHx`Xe|cqb5R!)ZWT$-GUpfP zgr&(!aDZ+ud)o#tWSRpmRi@^ehrBfvgsLMBHDI-=V$Nx~{gb0_{$~3f>tpFtq>`kM zt}MRLo=fvE1D6*KyDcTM#v`)b7Z6n%vDT?yOf5 zGh7dFsJTf};a)0fu0|>$$c-goK!qhhq!VC}q}t^5xEP~cKzXWda!N`<3IG8pAe6ab za#TJdY;H}u^u*hUJbz}f0$VX9$ZZnrRKsp0rM|ZbJ#0xg3b@?$z%H#@U0Po?U;qFK zNC>zQmhqyO1L*B+Yc-H;yX)qDQ@dhbv6d?8w2?b{{Wqj zTuP#-snjgG5)_*io%E=0U`Zr>KTWZlAuDZ-6rO3TL{zCPFr+C&q`I_)F8*Lz$GNws zOWw%y#Qy-YC~cPATI6#SrRiIJQUXu~$Wa$kj+BGAC#E!}rsC14MoI?WEh<28Sdc&GYsLd(R>p|4Hb)^eY)$t9q>K3p7+owVETncrRSNWTyD`}B)@>}87RAKoJ zw(}I$5c1^!5~3PFCta*J`J73SnxWNF5YzDs%TNmp$V!wFZEKPSpWbmzVO2AT!U z+isrQgdv$x61@N$kdm$T>@EjO8*hctGuC=?Lvhhqr~T8HQ>{}hQmb5>lfO?Rg`E?w z!3qKFL00EDXB@kbsZA+!=1G?&S{sECt!i~vy@Hf9fnZI}0ad!yV>3%}=Fr6fg{Z2* zW=rY>-^5AK56BULr2N^MYPI@w>b+rAxX~P1kqx-)w7(JxQhYYO^~dX)=buR+-19ERq(!H^IIZhz0{yPksIhaksxPgd0V0ieO$P~6pb_wB-( z{{T}dkGsvCfSDdJQ9;%uMO3uDn}Xu4RZQ^6fWY&H+p!vYyOR#i=D_xiJwu1(h= z<*gPM1ORLX`)Xd7@B4x{Gal+xa+2-6m-TzaW$Pe(SD>sW zIXXFtDk~<|A6!~B)Xg@MsWVgoVUAAPT#xrb zzo8=@=^1iC1kae;TgT7QJMphT$Lc*x0t_g_B%1Y5uPCj^9meR%l_^YQoT$?>9ZFWq zYJOYf>{dpls{TW#$P861`TslmIB*|AXQNTNnwnG?KD zk<~2&{%WxK1Azw*as&CxFd{OSq9cAe4y1f2@*bz4{QF_fjTnkKI*viz*Yy7D2jhv~ znU{_5$4eI2=urOvm25vD&&;Qe67Z$`^&n217aEGvtfh^V`Tdmt0GY*|qsFJwVWyu> zZK(0%Ssa#nAlm!-kU`&l@I2x!e2c>zwH^g6lp$EJ*5}it^$*0E=QsVvDWwND}D}6(LfM6?C&DEOoNNT55n?0l} zQc)%KI05q)I6iUjhx0QkV^*on84t#5lKTi3Q9vYx0p8a)`eM5~9EFsvB_wP?7C7p< zFWKFQ!oW2Fzpby2{C3`@kJe{yL!IHg+jlxkdsl70b)hF&7_mOioHlMVAJ&SCK~Ape zf`t!+bW@+a52^CNA1+0QCbbc&jE{AIT^#3vN{Un7zyfcJ1)q4wMT3%FftMsG%3DG+ zNlOkk8E)1j6(n>5!{_Obb#sv`8;gz)pOe@H9|gtJab%aPbtkr=7S<9i&h10JcK7)x zPab%zywg@)7M%Y8{{RSvyD3RKKH%7^)DDC5^1;W0mG)~~IHI`QflFbL8Pwl&DIOai zn9_c@rRz$Hi6HNZpALALQ{mLrt};ZJPLa-t;j&e3;PyVa27gCvxJ}2$*tc=->-A22 zJ@KTNy?Rci)JZLrQLo__VuzsN7x=%x$vKj){ceC-REPXe#BpI7m-|U4ZTo|7*8zH` z3o~UMm!FkGl-mrXt;a%jAt@b6BI4MvR9|RJxm08+_T|BFd`Vk+z&?d0=kgeh@n4FR ztjS1=My5|vV@rJ^Y?8{-8fXx0VlHpjYy3XAM*}CSLgr&j9kh2K><75#*>v9#bf1Lt zqL->-WmDb0mXW)Uu@*Py)07ydaQ^@@)*-ht6%KT`u3Vw!m{O9f8*D)H!n4Bc;r{^m z-ADfbF0bK>4^871Mx;}tLW@=9#*W%rZ9eSw$pXXhVeWy&48NKuh;+Hil_N=3l*e%( z0o;<12iF#ttY@&f!yn2!ka$DH_#5HufgES410$`B*X#;!0H0V|5Y_O}}`>q0gD-K1j>5Di7Ij0ilLT-Nz3>^6q^G zA)E}MNJJUgqNJkbPOh>-*VH$All~*W$P7z5)bGTTB1Q&|8_wtZFH7(i1YKtzrenDH{Nkn|#&hi1!<_9E|UsqUHK^-D)EF2}(}RKB5AT(_!>DH&SE3 z;l@jCl_(}HJ%YDfAB|m9eq{9dfsDts_*em)%Qw^y^Y>j`9v5EthDm?}4-41;UOS&! z-28y`NHe{5Wm_^+vXv@IunEv7ty{3TodY4gOEeEM!l%Wgl*5vkBx*``MJ z=l~tbByM|~oCLT_#CR^|jKfl`zL?T#D@keRFQo|t_%GO7O}lt-R*{{u)V5U9)oNqS zELli#^eHMHpqwF_i7XF~9I%!)iLT`Hzvvf7(0ZmPQimg{GIlmu3xjnL0H)^JjID?Mj82VHB7^ZzKiy{@O;aNQ zeN+NJy3QKB5Bwv(rDT1d;u3%FsJ@L+xm;(RRD$a;;xSKo!KE@w{KAh=og(JlF$GRS zkx^513DuUMQXkghsuC0w>xvgUBT+Xb9myZM=Po$;E#45pBJ0r~ZCrG(FLUTM9^FCph zP<`bEJZ>(7dkuyDpOzEW_?1{9Zkr2@fCBaa3~i-WS(bEj z*3yX55~6MY08DQkcc`zIff@3InY@sPTO>>IBnyI`hs&??agFQ9NKTXQDkwMJz~0?$ zVsD88B*$sA9V%1)FBY!|H@8l|mzLPv+QUurg3C>lrA1(i{x3eAw)DV^jzti&(M6xg zO|%vMw5?XUQltP+>+m8+`D*%@QRD}&nH@Vz-`q=sH^uyCjVl|vD5!*^v;~z29_v`*+3%Cnf47yLqc`iAl zP)SO3X&{ma-pRh*e!F9QS*^ZQ=A=3Istr5Ts=$j4x3#a-bRL$DB0}Q6R2BdvC1n-~ zZ)*;Nf0sae;ak((j{dgWP#rd-nQZC5XDhnl$S{u)~T{ov~6B5<2Q9rT5>{aoQ%xOIo$_omombY^v$D zk*eel*4+O9(+fV)5m{`=khG;+i=Plt?fd#2uYu@3sDajYQ%P&4KDSm9nF>~&N^Dux z@1%=uZiLvL*S`2@lN~h)%s{3r##);$KBb*uw)X%K2p1=7d3=TR zq6yzk?mu_X`OC6%D}_&7xhheYH9^-DzNt;TApJM_lZ3M6IPjM@lfvzO73hPlbr!`t ze(AnvcH7eZ&*^E0IL4Eg6%fd&B3qIVDY)&j8q$zASvNh(dX4Nnu%{=NGi7ZKyvRft zDocy;TrJV?r>ARQzd`4SHfgRsm~#}FWGF{Sc`3kiD19~gIB6P3&yjab&5aXz~k6upy041om2aT+#J?y}o67VEun}%zMz@qd6Nhyl^7#RQmP&-} zZ!)j**>F5RfBy|4(4jj0lnAD1Mbe0rL((GJHPWmsf{{Ru&=y8iKHTZo# zBktqx{g=|PdYEH!{w&RJK1iB*(hUGT-0pugMVm;aRNm)Iro)u=t;~IdEmrcm7{vXR zmSD<|%vkUvp#|4Wc9M&Pj^JA7%L3S(B&PeTKJ_Y4k)#&`YEF=@;COmrSNbTVZT`0} zZ&ZK7g^oTr@;Y)r?MM2pk(JgT_wjVLHRNpX5w-~({I~PnH`4NSo-0Y4m?|?@1-D%& zVX)r60NTTGu<7b=h~{3*{{ZOkI7?MM<58!Davit`=OlLm=ENJ={{S2q*@(;W}g_TrHSi^M7&b)>32L8jb2Sbaga0rIgs{V$Jo#^^rdCZkb<21`sJ zy0;x+4iW(KBXfb_;T;=Q{qkk)Z;2o9;g2_DtiP4%4nDcEl_g0bhDwojs^8t{JDedN zCL^W-2^=rAe?6B)m(_ayHUs49cySQWe8u9fxza(i>^V}-7-b4{*b?it8dNnqQ*^q_ zb;n6V4P5C7NfsCV*2L81Y`#YHI%yyNQNQ7e$xNA~JN~T7(y&0dI}b60%|54NqUcTZ z{?0ch=`&3se~d@B_*cw2cgI*AKM|Pcr#0ja$s)<*pTXSy6{P;E<x|7f9O_bMqkSCT2rr5X))SJ@h!;BB_rxa1-XIhE`QAMGX7tuM2`(F z^CeD?9WALzPs9>Hy{-9@KClW7Uy+%rO+$#gFLkYME5ekH=VRzTxF%6JO9CQLYEqXp zr0mmUmY=EWe@s`vi>DIlW-fhg&ffKZxlXe;JL2{=m_0d>!KiC>fptW;R*^&2fhdrS zrI!$dq)@50NU*$C$^F>L574qjI!xgfB{7f(F;Uq{3eRNhH$7}I5US_;7E6ilaT42( zpji~3)T8~PJNejR$HwJC zjMR1z8fBz}AqnV|fnYEs;Pn9%YE!j06aKL?!i$R#*gxh){(})7D`puPw>HM3LQz{$ zm&!;<*-n$!%B8%ZZY* zvuzbxJQhlvUv(a;KQe!K#1@T^;^#(PuUA(gGbgxRLK<^OLwyoD9>emsGjXB}d#9D; zhV0YM{kHbyb^T@X&yNpF!N+KlT6~NIGzJRP3xNJ3<+|T=QchLN$N(mZP5^EH0A+9Z zV-8o#{{a3AP5%JOxBM{!XN6P-1(LacS5kleINEq+M7PH#-``LCIH_!W`0n~2>X;19 z0>9GX{{ZVB{mD3Su*A6 zQ5LXSr?%*S^3gXke^hd%JyU1W>8+=t5SWeYaQP%#727&yq-Khld76A$Y-HRv%x02} zywpG%kMc0n8A^O8D3j`LaiP}A7i(>f!w08~OD=hHy-)PD`QPGCik;W0IAClsj?Dte z_jM1V)&}_Y+SJm*f!t%}n}N1I=-V3Wf(mIssE3;gPU|}alY0~1$LrAf;l(c=R;!`L zf(h}9Z`68r2Yf*wNLvr2q>FmuWR}CxP_RN1t4fMdsNCMfk1LV4%dQlAKq=_nTq$iS zNMT`a>u@L=>eaBat!~4i^}n7Imb4(0l%*)}sFfR}ZP%}v^Txt}&`=>-#kX2)0qfhj zAJ3nL!k!^3UY65x0!FLYSX*O%=gSoci37@c8WNQhSt9AuHa+i*!>g!Lf)q-3Nb0bk z(;1Iy9*f!nMG{ifl$4|=NFu~_8y)xl7|xp#+1r>#*Or@)q*NUtN*eXL7vBB}qwA)(9z-ZP(-ffILC38BQ2#Xzj4JL)mh(~l+z`?oSOlqERli_1A3sbs*>fHaYFxsUr%`WNI{q7*^xTinrLT>q zI%Y*^EtY{*t`a^jrv7$2j-vPPfk_vL!qRHipH0pkKP{O$1GH`d;`@C$QxTcqTK@k4 z9^d%G_~YmGqMm>L{x|;sx<8I0vLhKW&6#L`r6B-0Zruk#VW{}8u=K-IG{;&Y1-(Sr z^4nFw8v+H!$EB`8`r8>_>2V%he?|1K`$)}c+a15EAq>$^xBb39{{Xr_jy)qX!dr<# zXE3EG*(nZ-ljYYC2iYw-%W^nnV#AfNxZAIP+Wf{nM~J9TMwS{w>T33G>K-61sGA>C z*bTAgbhyK8IHJM-08w%zm8_B$HKdC>>^qc3dZw0ITaGLx2uV_udjZtoK|Z|oO1P?; zRHQ7r3nydCw#l{c({IlYwHm~l+yfY)xNSPUCC+G3Qb9Mc+iQzn{zJYrBP|vgQj+S+ zX&1L7ja@d}^!{yzaB&7WE|6}2WsUKd#LeptiVPQh+dS8}w|4pu-F>HKdi_d6aoL{o zo^zrIK-$;2I(Ea!PHngXSp&H)H-G)OZly<&N0jTyWJ%@#gek{DN_t&3-?;+*m~#7m zcCeqb$B`xOn-k^fk53!*)G@ZcL0_ZiV7nAMs%J_hCxGW{J9aA)Ghn^t+>W1m-v0pl zapy*EC;r=E{r3L=;l}ezJ zgXTo1T$H#x0fA>@K>-u6G)Ibt7FG#p4Qh*m2+rj|E zBy&I~&{Fwt#V;`R2jRmzK!fO7P-SeAR+=3rx1aD zh#UTA_+xx`ABxJA8CrskihG;vKc7rCyG^M$g*IDDO@c@&UqSqwJUQiYt~&uqD-x33 zNu4VzPQCBe*0vX=tqc&Q1SKjdvGgY%SfPl?SvOg*x{phLKf4~*+sruP(1b}U0EKr? zZkWA<5Yh(e<1J?ql;X-UqPHSbr+1uDut?}EKE3?0rlX##8HMGv?BzEYfH`r-gq!sq zXX;KF3TDel3etv&vEKW9u(A|F!Q`@yOFk6;0BJ`H7$FZbxuX46<2t`memgK(DG?2W zM!?_8pUo<#<;j&K7b8YnsY0x!Cf2`OZ{K_`a)RU)#Z2~$D63dYkGiDo=U_KK^WPI{ zdr6{F(8FogTS-#14c4xw^Eet+CDbc3OY)m_YWxW)At)X|VHk2>lJ@~Yqw2c;tI)AJ z9xN}AIrG1AKZI3X?S9_qom9`%*c5kDPLkT+LwXo(0Qh?jy@y|>1nievkRN4kq42Gq zLad;A6MSzG+!sM@!jaR$cQ{oZ6A3Ejp-CHETcjIy^!|F_*x2!6f*NktKV0j5L$1Cz z&dnk*Kmb4<{{TKdi@-%np`Zt? zF88E#END7->K#kOk?*Q&ORNst1AhL3)~9lXVQita=1B-rdaNyEpZ!={7cW#|!Q~pe zk3Mco?>gZ(?O+rD1IzWc*kUvDev|hMlm7te{{Y2}MxmX1MveKm{{R*R_viT8`X_6n zwAjSS{{Zj*0Mw>AVw)<4+y3`dex&Q95L_op0P+N%JV3a)n*~MosZrbuX@jleld)f6 z^dG+-=DnS!vZl1Q%2X^%D{Us-+| zfnoej*Q9Ss9Ww_WNZ~xW;DUF$+@4Q1eV3|w0BjR}x7!PyrlM10LHo^sPnrI0kCgDp zVJRxIiQHWI;npgcQi7DCl>^j^+w19UZa9!v$C%p`R8iQ=Wx|yti+9J)Sto9|p0yc= z`C%zb={pjhy}y|?{vrF5!vWF^G}h3eFFo7pF~ZTfz{ELX*)ZvdX^1rh_Ra4SlJ z1@Vz(y}e4`x~2)^6B{z^LJe~0}499D@scAr9C|X@3`&j-x(PU!$4Yv z+yINU;<*L4oHfIFT40Ls{NNQ{XDgoCL;IxS_cz-~`VUi*uD zwm5AQLiGhaG$9*ZDK_kX&er`p2kfgwdok7+hZ$r&E#TT*adtyP{{Wid9|}{sDkEWX zb{7Ix6gOG|+DnQIW5%z4IwS7TtHRFS1vwt_b*f>2EkQ2iAYkd8>)5}Sg8P4BrkxCY%f z>%H-z`ikQzE*E(!DoRqKcQ*iO18bY7&~1E6vY!i=nB~+WikpR)jJD}^G*a`x6%bHc z)D#YsxI#wdMIZyJ;Yr~gEJbRd_Hl%!NO6^|CAUvGv?M8(!cWgI;UPMlQcj?4YxgGiJuPxD?HNxmR^=@?0#UG7NgodP z@Y~Yk%$@H%%zP}SncY%J3A=6!1{}O@ukEAw(|f zyEaHwwjWNr8;@S3APMIzHzgW~-$^{Xf^^>GT=xCu_rXp-1d|a-MP{~W?X9FZ@@6zy zIuihRca)yLB{?ppZyyO_FbI zMPs%nNgSxw9Cl1{^o0H3Pc1-%t8{{`u5POi-EH$5W8_Hoa44iL)F#SxN;*&gH#YC` z`3U{5yZ^Dp8-Kb?|q~aX+X57%y{3T(qbc^1@PgAh(_34c;>QG?E z46)5sx3?`tOHuW=Q-`|7P_0p4Oj)oLi72pf3sN>EL;y6B2FX3Xw!^(AB3Eh+i81L; zJlknYj(zK7wwtLSsUderDoTJ+usThS*j`9mAOXvNruB(BS##iPbsp!R%XBk#n>pDJ zKI>B#Vm+Zfrmn zJ29w%KrBZe5#{f7lezrV85Bm_TG~@cYf4jcr4SGeh1KWiF`}hTjSQ)l$^b%2xrcCz zrr>=0-?x7Fo3X>J=Oy(u7KthMwV~3K=qX6jwIG{pJU1X;u=5w!M&Zt4s;X3$sm>}q zM1{QJcoxYdgqIboNhF1AI-R|77JI1jk+L61%c4ZIA*5X(sHtJy$8FQ!^Y7Ped`4U- zWqi41datQO0k9n|YytTL^ubbZ26KpcwWlq*gqt?X+*^9CNFW4jxVEj*cL0J&>xE5l zlQg>00n4%Ci)wPHYb^xdpe?19B%#r73R))S`vYsimbB2mP8>%+6Xt zACiV9zZ8pwFU$RszlJ@gxWdz@DZ)JYO8yv}L*SllSxnVs`9(mju)RpLWG_iJ)DMMT z8=u8+08qxUlB#Nys0xE3D#B0|9ZArjRD`Vw0NZsXNhI!f?P777aN-`TydN3$2Y(BG zhx({e>#QUl-8SqRQ2pZAkLDHCt3fQHD%gqfX;B)LZs&UegJm~`wTX*i&#{~LcbgoS zRUxIJ)F_0dNm7@kS1JQyE~O{Z{{U*d9nF!dN{cpwG)75Fsz?EPRN(*;5_{@Bt`AU= zd>SYtiQ0g&vU-oiS=~w#1Kb+Z$Zps3=VTs*UzXHnS~TL~kbo}RqQniaYhlHTg+@RM zO)Yv3;YHvFr*G%-#MUldsMMsPnsqvK*XKB-wuClPg)3090n^-+*aKizLEiXut8mvb zMQ%G1X%DGNE;jeOq%TdHQkD`Bqq-7(I)T)TRO77GI#yhJuiZ}zG^~$ ztBwfkc_~A#t+A}Q0SG=Tl10tU$8*~awSE)Sa@tx{sH=dN07@HuNK)MwBT&+!enbP; zW77>r)<8UhmIqMJ%j&NODos_#Ve|+39cKg%?AnLyKFB zDs>x`BwY$uU`@8|Z9A`_X<;ON+N?=EFR`)Qci7t#th>TI(Op7>8gr+XN>tm9 zC9T3r%79S-iyPc_Af1RO&TrvPWytW=F1H1`dun(`1Kv=jYa>`mLR3!a1nxUx6#UdF z)DYqt0Hs{Jse4%${5Bs?mi}iNQsS%vETpInDkD)>TbpgLBd^yAoN@4y5}yvE)FhvU zBhP-9>Dvg(bPY==j;(+xUia&<`k$Z3V!=VK%gK^brEBHfo7vRdk4^n=jKT-pCBj1P z2nOL7{{SpzEkRPs#w8V{2||jjH$qQeo+T8=viO39PDM%DiY@;DXH!L?bzB=L5~E|@ z+n+A5xXe5QjwJ(1Q)7L_{{Wlfb(JzsW($EebO~-iacFazsGQ^}3;bFY;a0?vbG`N> z65s-}Tu&)0uG78Ur8s972E?zH6MJvbM}Ob?;dM4uAnNhYX@Y<}D?+Yrk~bg?J^FRG zKre^v!4AosM4p`W5{KuP?zLLZ7&dy0I^Mlf>PK>zu_aG z81XMKJ30?4OxfxVhUq05 znuwL!aw4W;W+7qF_q|6-km3MZG%Wa0W2dPfn6@M{^F+qe2{3EQ4TEM2`$bn)&!&IoT)?ua!WXwT%D$ypI%V<$Zy|!^&#QER!>4mUhznW?u?x;^N zmg9vHPoqas0PIwtl7X>3?nvwa0}*T7rneORR&qV%r<^U0TP-y603{;igxG0FB;42w z-27HJT@m@Sz1ob2-+7Rfg@s9sf?5kMDH`=`okS4Ym22;9u=MQ;p+b68R%lYDF(KPB zWl)$>*0O-5gqwJDq!K_rL|c2YE`sArl8Uo4sV^&2h-HdnM5q-Kr5#QrCd7}2YjoUO z9=l%QZd>wlyKcjUDy;~Uq%-ePTt_Kl>jVSw6|~vyvH{=2jd^Yy*IcMO3ZYYFiAZs! zrJA&8{Pzh2>q%Jf*+-x|sPE;a^7>-LOR!Mej3}2RN2bPX8z#!S$Hmv>zos&6B1$Qy zrS^Qkc6n$@BrX$S4){p`UvDFExw!daZB~+|^9@=%jmT=PRZ2sAhY;mKr8J}`#FPZy z%1Aa)2LUb?(dlls^?sFEtgfKTRSLCL=w&XY2x_YtZfm*}eia*TloNaWH{6Y*ZBiSF z8a!nxVxCpY?3iq&C<92aUZPc~f;ZD{-kYGJJBwQ9CHQQ%pc+$D_8vlp`ig>_M&n4e zuX~%Gm#x~hFS27lPo0Ua%DIMTCB_)2m&+O>va zB`Rn)5_4dr5H(m51+?Gvw?l+M<|r^`y(lNDQS~kQJp{C@CP=k+=u2C9ZQ+;>wXbPUojl+jEZ( zRToNSm+Li!Gf=3mt6Nk^vDCm)>amir<&sTMDUu~VxAY6VV- zO(oYBp`}GiK^IWEfE%jBZaU-Kio}QE6-%2|c3N5qQ;TvrNpTvAQVAtmcOEUsC04b- z4HX$N<~o^?n03c@ZD7*aVJJdMbd4xlw>DQ!zg#&*s6Pb=Z|vq&RHJ7kQe(WeD_*4w zs3OsR2@xHV+=MutFZ<&NUDIt>CB&QB;9B7Hy@t(8 zkM7MS2!!u|fRXOa8!Pj*zv0|(d^%828<6v|kn0XKlqI(Q&SFz)Bq$P6;(!P4)8=~I zj_^&ZG*-#ojLj}J+Nstnq0sVxEJ|p$i==+i>_(LlVYflP_-Cm-U8%)QO>^q5Q>41e z)TtF1?mg9LA9hp~e;Tc1iwho>!;7#{Swu&iW^!X(NCq}qirs>~B2A`WwfG%coeeI3W8N+qyU?Q+yQU~Hc88H z;ke6k*s4KNu92>Y!gV>ND!r8GC#l}s0ye#@iMJ6BDPkNXNn|KGUY$;lsVY$$c#6Cm z4UcakaqbkI)|#zZ!m%s!3UIQV?kDc#3`|#~E!}qmO!woe2Rq-%?VI#@>Kie0`2ufQDX+9r?=V z5RZML$021&DpugDrk#`Oqtf_64v#u)xeP_8)ECHanCcpU+KYE8wyXRg={s813h8V{ z>ilk($j%vxOLACtvshYCkl1L{87&}#;=R;Dg|E;Z$@sU&s$E8+svE31P^=;Y$y|+a z=SF9lr3q0h1;njg5=h$RBEsh3m2u^|m2)D+j+_7ew-D@(w!*b@kHXI^U)LF9A zWUWKSNX%fcvgGm9nS|w1f?hgr!G&sP!8FEqm=9lT#{nMWTg; zHFX8YKqQ-7SOa77#hMA-P?5s%DvJB81h&%)Q-maz9!b(kwTZu{L4LRO#D0ApdfsgS z0)uZ7wEzem#r8Y?UYK`eGo&eKLdsQp5~1PKrsH#NgV!2bWd*;zN%3w??tWnQz0aS} z;ZhRfQb&hENE-uW-@S$J*1%s9N`NgYh7eR-c`Yp~Che(u0XDF>xY%FM*7#KG>_chQ zqANj4wv{)igah1yt-ALE4Xi|RMz-u6POUmnd?`)#2lwsNdYgq%X=re$7aU4kaB3kv zO~|;vZoLnemMmP&HCw0+eb`?goZUH0q_mseB&}h~6R{)>hkFz2Y$svp@>y6!Mi?ZW zPV<}~ZE!bM$Edxx^2X`xG_{nWe9^20El00#n*qM${zBKivFV8RQ!JlC4Ev z8=d;}KcB6!K|!kIxx@z>ugmsIW)>;##%Z?Uzo{o%k=}E0w_ESHJuEu!+Y4z@>EbwU zTxia$l3ZJkx`nT9no?{mMY?a(rLfB`pQD(iCd#r+wcMx+_1?pwJuE((`};GVY*Jh| z1xgABrTgu1aCax`h}w{gUBFT(av+*hjg}ylJm@~~zHc#vi;V);7Vdr`d_62ezAdO? zK~piCEwrz_F1V#O@Cxx*n-UH7w_)3CFeK|%#Y!o=gr{we!rxK*y)o^%T2O_A54=7k z0ejpIm-_kQnrnn%LzO0-8Z*&VCtL!j0-S9KebqjJxf`h<0zo3g^|kG`G%iIM=x~B! zH4SaDggMH5fa3oE6US0Tu1W3(OJX?7=TgvxEy7R6NGI0Blea^AcI}U<2vf;!B5h`nW-?g;?f&u{a>nrjgrr?TsUp1C0F zQdIiV;zx0%Hn|{N4b9H@i>XPJoh>OrRtxV_cf zk3qQJ{VnB+7}~BLQExvSoxmD*7L#`*J%y7;<=50 zR2#L9_T1mj{Rf|H5v}f5q;pLMw!bwfk1O7yz2T=cg5B)QUFY2brPdvq#)mASRYQ9+SJ(3O-y4Zp3Ay5 zCDpQ~(xZC>kVlcft-S4abQQlKhfo{|8p1+>P_R1_*qyQI42IHNEo1!ST0MD)_g7>&mR%XU+mzi6T07|sBrrTB2EnuYXFLPn?>@ANU=>dGlSZ^#ra4a~G zQ3Fzvl1NIo2L2#T$vyDM>!nvyYeG^{dyS7zsS3XP`u%sqF`1R95~meyK%@Pb2hY;S zt-VeuKyE_4T?w;!q=VeIVmxNzsul3Mz!tS{Ajq zB5Fuih}d6s8|pnRvAwX+)5XTxD{wR$0YPXWtvxJ}=dz9MYg-y(h0`BzOJzt13j43d zy~X_c-0$g%QY|T)t+noHQc)BO6{r?;6Mgn21YYL-t+jyP2?Nd-7Q)~#Tkr+C8*jp^ z9kdb@4b{2yR`$Xf5=4fYSPlyn5Y?_m!rc!2M@tQ@^W3MMd6q*;DA0{6P*Ex*r*qVf zpbhWe(*pz!LMD(_;+S#c86lY7@1(7@EP&$0?{WbHw{vR|-wWax3ZEW3?o!zkT|is1 z;=1BujllRpusVP?1nez{_)w7`yin+IB&aEF_Xt(CzTl3xH#Z+VHVT4Ws7ORqxy)>o zt=DW*Yo~F(``8P9&*d~v3I>otAxP_)iU_REWtN~NA!Ih>SfL0;!o?pjkgdSB`(F2Z zrsVqVLOclqk!aNb>Y*j*fw1#!q!ljeuq`AhB)Xyy1+H!_h)p=domr$plQA^duDq8e z$`RDzLKJMLN=4Ma3AjzJez(ELJ?D(ER)W01)n$ssb*PAePs_E0OnEUPw5zh(l9su0 z9#KefN^!u@T91WW5u2Ahu(^zhq~9iq`EkdoCty9uP-@Ag6^X%|<5|wN8X9PjVJ?^M zzi3EWTY0w8AtbO;ri#L~g#t9*+HbJA5UlT(AIQ~ME32ZL%9``&WyqQqUu~C5OL;m; z)P*T4(yI`nf&sJT{aGPwYtoXS0162z zwT_UKis!^Q(zCA@8kUGW-{nJ{)n3{ga-Fh|4650}oeo~DYmz}CW>07| zWlW2fAZ0qG26QB?)~i&wl&LWtMy1@Twp6ZHD4>!Qbg4y0Qb$1^nZ#_3RjogssdVb2 zHB7q85i<5%s5r}!+fqT~kkS$GG<7_prFh&R5OteYJiegfUSsl-K-k{Kh1mpN+tC%j z8z?$W1qzh`d3QT6DlU};>iWYmMLjXgs!OhESZc}t0KK|`R1NG&2Yo{hHH^7fYN<(X zO&*yUnNN@}+aS&m&QGHJAWj4ZPixU4W;FE|W& z4lTWRT3brAY>;*;QC15kR%2co$gBV?@5$!2ss_8=UdzI(bq|%p%GDlJ==FLmdUMq3 zS}GDAkcO1kDaD4{B}q{VQ;Je_fpU8bT;pYXf*H0AMieTX3Vk%b!lV-2N*kQ0=t+5R zxyo57KtKu#P_eoKO~?e1FNu_#*8B81`I3UzrodF=P^!~XTbWgGjzeWEv!PAILd!#1 z6rYSGHYm`=QsW#tZft5!YBcQd^+-llUZs|kq)lQn5*Uc2IMZMP;!x|P6>A7>J`kH> zW@dE)K+rCYiaym>L)7kl2dNe`M+kI|3+D%AQki!zOpe`A##)FZ6rilQ+Lx(X%5)7Q zQ7W)XZcf1BF_x#GnsVws z(yvhKe7x736D^tb9NMq4%uff)k}kR+NB?b{h`&KbKEDY}G1_(u6%RlCaaw*r=1b?|b~Qm`q zg_UHTzn=YZn9O+gP&pxLkcS#)Qq*-Uq;kqr;tBwD9RLR1zP)jVLs45skhQi{Qk5xJ zDp0uCb{n5B^2TE^;kXJ&S{snL4kXzrI*P8^h$6#b)5xFtn;@)|=nOuXL7K!eppCR0`}?CrS0Y48H~X_kcb3Y^c_QPspbCwu|jq0NVc7< z4TqmgdJExKyp_sZA+nVw?xiGxQUE>8$4@Q&PWa4bJb1O>R`%U()HL$er8JV2AqpE6 z6S*LHZD4lX`r~_S7v={2;dW9!El%s2t^*eMJ%w`5rnk+9R@QA5)!3-7XXr(tc z2~i+)w`1D<@TxQ9w%XiDPmC#UHlhhg)KhVN#kN1m#$z!K;d!Rl#%nFQmKtfafEA+Z z8x?QA=6mh7HAS2eA;mu8L#(Aq3kbOcp0~G6$nDp@GZ~4XtO+0zmA%W5`Wj4^0bmDC zl#M+v-*RjQ{{Y$b#_3Xd#JX1ERbW=~cJsLFM@_6P=Y+tCPBhXNtR+e*52O$dqtNblxVHZQhu3VzU~M;QNUBMhd>Icp zuIfSNEmtHUfSrZK`uTJiUc*XLZI+yEI>}3`UeO-L_P|}iwg?K_6NGiHb$+-FT^ZDa3n7cqbl|!)E zCuMRuI$tEX`6M)@T&XEZvFU4%=cW=lU2Tp=old1IDz<@Qd>~r(uqUrm`r|Q}BS0u_ zacgWXYLy|D9o9^C#r#VlWk&m_y@!j-Yi*2rri8jwmqW`ZNmvR&H@Ue!U3UEOn9N#& ziy&G`SE@m6q;p+Dg7qlar=pJc^8=Q*^690Vq-Mivl|AE^(O5N#q4l z!6`KPZMO}%PCBgzz|&zO)=4()^f%vbzFVa@J=8qtN)oi{QioBoCf$30J9HmBW-}iC zs-t@z$vewnpe2+k#}G9DPLqD*{{YOKc@mU_Hkk!Cut2gwNCMuMC;9ZoV=*c%Xl6nb XTpBfLR-4|#pzYfkjK*MqC}02C4c{b- literal 0 HcmV?d00001 diff --git a/MovieDabang/MovieDabang/MovieDetailView.swift b/MovieDabang/MovieDabang/MovieDetailView.swift index 01d4115..9c3a1fc 100644 --- a/MovieDabang/MovieDabang/MovieDetailView.swift +++ b/MovieDabang/MovieDabang/MovieDetailView.swift @@ -7,21 +7,23 @@ import SwiftUI +struct Movie: Codable, Identifiable { + let id: Int + let title: String + let overview: String + let posterPath: String + let releaseDate: String + let voteAverage: Double +} + struct MovieDetailView: View { - - struct Movie: Codable, Identifiable { - let id: Int - let title: String - let overview: String - let posterPath: String - let releaseDate: String - let voteAverage: Double - } - @State var like : Bool = false @Binding var movie : Movie +// @State private var movie : Movie + // let Movie = ["name" : "과속스캔들", "date" : "2007.11.14", "people" : "264K", "imageName" : "testImage"] + var body: some View { Form { Section(content: { @@ -66,6 +68,6 @@ struct MovieDetailView: View { } } -#Preview { - MovieDetailView() -} +//#Preview { +// MovieDetailView() +//} diff --git a/MovieDabang/MovieDabang/SwiftUIView.swift b/MovieDabang/MovieDabang/SwiftUIView.swift new file mode 100644 index 0000000..5215838 --- /dev/null +++ b/MovieDabang/MovieDabang/SwiftUIView.swift @@ -0,0 +1,55 @@ +// +// SwiftUIView.swift +// MovieDabang +// +// Created by 박선구 on 11/2/23. +// + +import SwiftUI + +struct SwiftUIView: View { + var body: some View { + List{ + HStack{ + Text("Hello, World!afwafafwag") + Spacer() + Image(systemName: "star") + Text("5.55") + } + HStack{ + Text("Hello, Worlag") + Spacer() + Image(systemName: "star") + Text("1.11") + } + HStack{ + Text("Hellwag") + Spacer() + Image(systemName: "star") + Text("9.99") + } + HStack{ + Text("Hello, Woaag") + Spacer() + Image(systemName: "star") + Text("1.25") + } + HStack{ + Text("Hello, Worlwag") + Spacer() + Image(systemName: "star") + Text("1.25") + } + HStack{ + Text("Hellowfawafffwfafawgawafwag") + Spacer() + Image(systemName: "star") + Text("1.25") + } + } + } +} + +#Preview { + SwiftUIView() +} From 437f64e721baf01c25f22650b9b144b37e264114 Mon Sep 17 00:00:00 2001 From: SeonKoo Date: Fri, 3 Nov 2023 17:49:31 +0900 Subject: [PATCH 18/21] nothing change --- MovieDabang/MovieDabang/ContentView.swift | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/MovieDabang/MovieDabang/ContentView.swift b/MovieDabang/MovieDabang/ContentView.swift index 30cc3e8..1df8a44 100644 --- a/MovieDabang/MovieDabang/ContentView.swift +++ b/MovieDabang/MovieDabang/ContentView.swift @@ -10,7 +10,7 @@ import SwiftUI struct ContentView: View { var body: some View { VStack { - Image(systemName: "globe") + Image(systemName: "mug") .imageScale(.large) .foregroundStyle(.tint) Text("Hello, world!") From 7e38d0304b4da7738ae63c54029dd13fdba7304b Mon Sep 17 00:00:00 2001 From: SeonKoo Date: Fri, 3 Nov 2023 17:54:24 +0900 Subject: [PATCH 19/21] test again --- MovieDabang/MovieDabang/MovieDetailView.swift | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/MovieDabang/MovieDabang/MovieDetailView.swift b/MovieDabang/MovieDabang/MovieDetailView.swift index 9c3a1fc..d031cf6 100644 --- a/MovieDabang/MovieDabang/MovieDetailView.swift +++ b/MovieDabang/MovieDabang/MovieDetailView.swift @@ -55,7 +55,7 @@ struct MovieDetailView: View { .foregroundStyle(like ? .red : .gray) .symbolEffect(.bounce, value: like) } - .padding() + .padding(15) }) } } From e6554313c339b438f60e1bd87bb68e2b2444d8b9 Mon Sep 17 00:00:00 2001 From: SeonKoo Date: Wed, 15 Nov 2023 14:27:43 +0900 Subject: [PATCH 20/21] WeatherAPP use api --- Weather/Weather.xcodeproj/project.pbxproj | 395 ++++++++++++++++++ .../contents.xcworkspacedata | 7 + .../xcshareddata/IDEWorkspaceChecks.plist | 8 + .../AccentColor.colorset/Contents.json | 11 + .../AppIcon.appiconset/Contents.json | 13 + Weather/Weather/Assets.xcassets/Contents.json | 6 + Weather/Weather/ContentView.swift | 22 + Weather/Weather/NetworkSetting/Network.swift | 46 ++ Weather/Weather/NetworkSetting/Weather.swift | 88 ++++ .../Weather/NetworkSetting/WeatherApi.swift | 23 + .../Preview Assets.xcassets/Contents.json | 6 + Weather/Weather/Property List.plist | 8 + Weather/Weather/UIView/AddTodoView.swift | 67 +++ Weather/Weather/UIView/MapView.swift | 29 ++ Weather/Weather/UIView/WeatherView.swift | 209 +++++++++ Weather/Weather/UIView/todoDetailView.swift | 41 ++ Weather/Weather/UIView/todoListVIew.swift | 124 ++++++ Weather/Weather/WeatherApp.swift | 18 + Weather/Weather/WeatherAppApp.swift | 20 + 19 files changed, 1141 insertions(+) create mode 100644 Weather/Weather.xcodeproj/project.pbxproj create mode 100644 Weather/Weather.xcodeproj/project.xcworkspace/contents.xcworkspacedata create mode 100644 Weather/Weather.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist create mode 100644 Weather/Weather/Assets.xcassets/AccentColor.colorset/Contents.json create mode 100644 Weather/Weather/Assets.xcassets/AppIcon.appiconset/Contents.json create mode 100644 Weather/Weather/Assets.xcassets/Contents.json create mode 100644 Weather/Weather/ContentView.swift create mode 100644 Weather/Weather/NetworkSetting/Network.swift create mode 100644 Weather/Weather/NetworkSetting/Weather.swift create mode 100644 Weather/Weather/NetworkSetting/WeatherApi.swift create mode 100644 Weather/Weather/Preview Content/Preview Assets.xcassets/Contents.json create mode 100644 Weather/Weather/Property List.plist create mode 100644 Weather/Weather/UIView/AddTodoView.swift create mode 100644 Weather/Weather/UIView/MapView.swift create mode 100644 Weather/Weather/UIView/WeatherView.swift create mode 100644 Weather/Weather/UIView/todoDetailView.swift create mode 100644 Weather/Weather/UIView/todoListVIew.swift create mode 100644 Weather/Weather/WeatherApp.swift create mode 100644 Weather/Weather/WeatherAppApp.swift diff --git a/Weather/Weather.xcodeproj/project.pbxproj b/Weather/Weather.xcodeproj/project.pbxproj new file mode 100644 index 0000000..dbe580c --- /dev/null +++ b/Weather/Weather.xcodeproj/project.pbxproj @@ -0,0 +1,395 @@ +// !$*UTF8*$! +{ + archiveVersion = 1; + classes = { + }; + objectVersion = 56; + objects = { + +/* Begin PBXBuildFile section */ + 614776A22B048B1A000D0C88 /* WeatherApp.swift in Sources */ = {isa = PBXBuildFile; fileRef = 614776A12B048B1A000D0C88 /* WeatherApp.swift */; }; + 614776A42B048B1A000D0C88 /* ContentView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 614776A32B048B1A000D0C88 /* ContentView.swift */; }; + 614776A62B048B1B000D0C88 /* Assets.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = 614776A52B048B1B000D0C88 /* Assets.xcassets */; }; + 614776A92B048B1B000D0C88 /* Preview Assets.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = 614776A82B048B1B000D0C88 /* Preview Assets.xcassets */; }; + 614776B02B048CA0000D0C88 /* AddTodoView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 614776AF2B048CA0000D0C88 /* AddTodoView.swift */; }; + 614776B22B048CD1000D0C88 /* MapView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 614776B12B048CD1000D0C88 /* MapView.swift */; }; + 614776B62B048CDA000D0C88 /* todoDetailView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 614776B32B048CDA000D0C88 /* todoDetailView.swift */; }; + 614776B72B048CDA000D0C88 /* WeatherView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 614776B42B048CDA000D0C88 /* WeatherView.swift */; }; + 614776B82B048CDA000D0C88 /* todoListVIew.swift in Sources */ = {isa = PBXBuildFile; fileRef = 614776B52B048CDA000D0C88 /* todoListVIew.swift */; }; + 614776BC2B048CE3000D0C88 /* WeatherApi.swift in Sources */ = {isa = PBXBuildFile; fileRef = 614776B92B048CE3000D0C88 /* WeatherApi.swift */; }; + 614776BD2B048CE3000D0C88 /* Network.swift in Sources */ = {isa = PBXBuildFile; fileRef = 614776BA2B048CE3000D0C88 /* Network.swift */; }; + 614776BE2B048CE3000D0C88 /* Weather.swift in Sources */ = {isa = PBXBuildFile; fileRef = 614776BB2B048CE3000D0C88 /* Weather.swift */; }; +/* End PBXBuildFile section */ + +/* Begin PBXFileReference section */ + 6147769E2B048B1A000D0C88 /* Weather.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = Weather.app; sourceTree = BUILT_PRODUCTS_DIR; }; + 614776A12B048B1A000D0C88 /* WeatherApp.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = WeatherApp.swift; sourceTree = ""; }; + 614776A32B048B1A000D0C88 /* ContentView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ContentView.swift; sourceTree = ""; }; + 614776A52B048B1B000D0C88 /* Assets.xcassets */ = {isa = PBXFileReference; lastKnownFileType = folder.assetcatalog; path = Assets.xcassets; sourceTree = ""; }; + 614776A82B048B1B000D0C88 /* Preview Assets.xcassets */ = {isa = PBXFileReference; lastKnownFileType = folder.assetcatalog; path = "Preview Assets.xcassets"; sourceTree = ""; }; + 614776AF2B048CA0000D0C88 /* AddTodoView.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = AddTodoView.swift; sourceTree = ""; }; + 614776B12B048CD1000D0C88 /* MapView.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = MapView.swift; sourceTree = ""; }; + 614776B32B048CDA000D0C88 /* todoDetailView.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = todoDetailView.swift; sourceTree = ""; }; + 614776B42B048CDA000D0C88 /* WeatherView.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = WeatherView.swift; sourceTree = ""; }; + 614776B52B048CDA000D0C88 /* todoListVIew.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = todoListVIew.swift; sourceTree = ""; }; + 614776B92B048CE3000D0C88 /* WeatherApi.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = WeatherApi.swift; sourceTree = ""; }; + 614776BA2B048CE3000D0C88 /* Network.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = Network.swift; sourceTree = ""; }; + 614776BB2B048CE3000D0C88 /* Weather.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = Weather.swift; sourceTree = ""; }; +/* End PBXFileReference section */ + +/* Begin PBXFrameworksBuildPhase section */ + 6147769B2B048B1A000D0C88 /* Frameworks */ = { + isa = PBXFrameworksBuildPhase; + buildActionMask = 2147483647; + files = ( + ); + runOnlyForDeploymentPostprocessing = 0; + }; +/* End PBXFrameworksBuildPhase section */ + +/* Begin PBXGroup section */ + 614776952B048B19000D0C88 = { + isa = PBXGroup; + children = ( + 614776A02B048B1A000D0C88 /* Weather */, + 6147769F2B048B1A000D0C88 /* Products */, + ); + sourceTree = ""; + }; + 6147769F2B048B1A000D0C88 /* Products */ = { + isa = PBXGroup; + children = ( + 6147769E2B048B1A000D0C88 /* Weather.app */, + ); + name = Products; + sourceTree = ""; + }; + 614776A02B048B1A000D0C88 /* Weather */ = { + isa = PBXGroup; + children = ( + 614776C02B048DE9000D0C88 /* NetworkSetting */, + 614776BF2B048D8F000D0C88 /* UIView */, + 614776A12B048B1A000D0C88 /* WeatherApp.swift */, + 614776A32B048B1A000D0C88 /* ContentView.swift */, + 614776A52B048B1B000D0C88 /* Assets.xcassets */, + 614776A72B048B1B000D0C88 /* Preview Content */, + ); + path = Weather; + sourceTree = ""; + }; + 614776A72B048B1B000D0C88 /* Preview Content */ = { + isa = PBXGroup; + children = ( + 614776A82B048B1B000D0C88 /* Preview Assets.xcassets */, + ); + path = "Preview Content"; + sourceTree = ""; + }; + 614776BF2B048D8F000D0C88 /* UIView */ = { + isa = PBXGroup; + children = ( + 614776B32B048CDA000D0C88 /* todoDetailView.swift */, + 614776B52B048CDA000D0C88 /* todoListVIew.swift */, + 614776B42B048CDA000D0C88 /* WeatherView.swift */, + 614776B12B048CD1000D0C88 /* MapView.swift */, + 614776AF2B048CA0000D0C88 /* AddTodoView.swift */, + ); + path = UIView; + sourceTree = ""; + }; + 614776C02B048DE9000D0C88 /* NetworkSetting */ = { + isa = PBXGroup; + children = ( + 614776BA2B048CE3000D0C88 /* Network.swift */, + 614776BB2B048CE3000D0C88 /* Weather.swift */, + 614776B92B048CE3000D0C88 /* WeatherApi.swift */, + ); + path = NetworkSetting; + sourceTree = ""; + }; +/* End PBXGroup section */ + +/* Begin PBXNativeTarget section */ + 6147769D2B048B1A000D0C88 /* Weather */ = { + isa = PBXNativeTarget; + buildConfigurationList = 614776AC2B048B1B000D0C88 /* Build configuration list for PBXNativeTarget "Weather" */; + buildPhases = ( + 6147769A2B048B1A000D0C88 /* Sources */, + 6147769B2B048B1A000D0C88 /* Frameworks */, + 6147769C2B048B1A000D0C88 /* Resources */, + ); + buildRules = ( + ); + dependencies = ( + ); + name = Weather; + productName = Weather; + productReference = 6147769E2B048B1A000D0C88 /* Weather.app */; + productType = "com.apple.product-type.application"; + }; +/* End PBXNativeTarget section */ + +/* Begin PBXProject section */ + 614776962B048B19000D0C88 /* Project object */ = { + isa = PBXProject; + attributes = { + BuildIndependentTargetsInParallel = 1; + LastSwiftUpdateCheck = 1500; + LastUpgradeCheck = 1500; + TargetAttributes = { + 6147769D2B048B1A000D0C88 = { + CreatedOnToolsVersion = 15.0; + }; + }; + }; + buildConfigurationList = 614776992B048B19000D0C88 /* Build configuration list for PBXProject "Weather" */; + compatibilityVersion = "Xcode 14.0"; + developmentRegion = en; + hasScannedForEncodings = 0; + knownRegions = ( + en, + Base, + ); + mainGroup = 614776952B048B19000D0C88; + productRefGroup = 6147769F2B048B1A000D0C88 /* Products */; + projectDirPath = ""; + projectRoot = ""; + targets = ( + 6147769D2B048B1A000D0C88 /* Weather */, + ); + }; +/* End PBXProject section */ + +/* Begin PBXResourcesBuildPhase section */ + 6147769C2B048B1A000D0C88 /* Resources */ = { + isa = PBXResourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + 614776A92B048B1B000D0C88 /* Preview Assets.xcassets in Resources */, + 614776A62B048B1B000D0C88 /* Assets.xcassets in Resources */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; +/* End PBXResourcesBuildPhase section */ + +/* Begin PBXSourcesBuildPhase section */ + 6147769A2B048B1A000D0C88 /* Sources */ = { + isa = PBXSourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + 614776B62B048CDA000D0C88 /* todoDetailView.swift in Sources */, + 614776A42B048B1A000D0C88 /* ContentView.swift in Sources */, + 614776B22B048CD1000D0C88 /* MapView.swift in Sources */, + 614776B72B048CDA000D0C88 /* WeatherView.swift in Sources */, + 614776BE2B048CE3000D0C88 /* Weather.swift in Sources */, + 614776B82B048CDA000D0C88 /* todoListVIew.swift in Sources */, + 614776BD2B048CE3000D0C88 /* Network.swift in Sources */, + 614776BC2B048CE3000D0C88 /* WeatherApi.swift in Sources */, + 614776A22B048B1A000D0C88 /* WeatherApp.swift in Sources */, + 614776B02B048CA0000D0C88 /* AddTodoView.swift in Sources */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; +/* End PBXSourcesBuildPhase section */ + +/* Begin XCBuildConfiguration section */ + 614776AA2B048B1B000D0C88 /* Debug */ = { + isa = XCBuildConfiguration; + buildSettings = { + ALWAYS_SEARCH_USER_PATHS = NO; + ASSETCATALOG_COMPILER_GENERATE_SWIFT_ASSET_SYMBOL_EXTENSIONS = YES; + CLANG_ANALYZER_NONNULL = YES; + CLANG_ANALYZER_NUMBER_OBJECT_CONVERSION = YES_AGGRESSIVE; + CLANG_CXX_LANGUAGE_STANDARD = "gnu++20"; + CLANG_ENABLE_MODULES = YES; + CLANG_ENABLE_OBJC_ARC = YES; + CLANG_ENABLE_OBJC_WEAK = YES; + CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES; + CLANG_WARN_BOOL_CONVERSION = YES; + CLANG_WARN_COMMA = YES; + CLANG_WARN_CONSTANT_CONVERSION = YES; + CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES; + CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; + CLANG_WARN_DOCUMENTATION_COMMENTS = YES; + CLANG_WARN_EMPTY_BODY = YES; + CLANG_WARN_ENUM_CONVERSION = YES; + CLANG_WARN_INFINITE_RECURSION = YES; + CLANG_WARN_INT_CONVERSION = YES; + CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES; + CLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES; + CLANG_WARN_OBJC_LITERAL_CONVERSION = YES; + CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; + CLANG_WARN_QUOTED_INCLUDE_IN_FRAMEWORK_HEADER = YES; + CLANG_WARN_RANGE_LOOP_ANALYSIS = YES; + CLANG_WARN_STRICT_PROTOTYPES = YES; + CLANG_WARN_SUSPICIOUS_MOVE = YES; + CLANG_WARN_UNGUARDED_AVAILABILITY = YES_AGGRESSIVE; + CLANG_WARN_UNREACHABLE_CODE = YES; + CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; + COPY_PHASE_STRIP = NO; + DEBUG_INFORMATION_FORMAT = dwarf; + ENABLE_STRICT_OBJC_MSGSEND = YES; + ENABLE_TESTABILITY = YES; + ENABLE_USER_SCRIPT_SANDBOXING = YES; + GCC_C_LANGUAGE_STANDARD = gnu17; + GCC_DYNAMIC_NO_PIC = NO; + GCC_NO_COMMON_BLOCKS = YES; + GCC_OPTIMIZATION_LEVEL = 0; + GCC_PREPROCESSOR_DEFINITIONS = ( + "DEBUG=1", + "$(inherited)", + ); + GCC_WARN_64_TO_32_BIT_CONVERSION = YES; + GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR; + GCC_WARN_UNDECLARED_SELECTOR = YES; + GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; + GCC_WARN_UNUSED_FUNCTION = YES; + GCC_WARN_UNUSED_VARIABLE = YES; + IPHONEOS_DEPLOYMENT_TARGET = 17.0; + LOCALIZATION_PREFERS_STRING_CATALOGS = YES; + MTL_ENABLE_DEBUG_INFO = INCLUDE_SOURCE; + MTL_FAST_MATH = YES; + ONLY_ACTIVE_ARCH = YES; + SDKROOT = iphoneos; + SWIFT_ACTIVE_COMPILATION_CONDITIONS = "DEBUG $(inherited)"; + SWIFT_OPTIMIZATION_LEVEL = "-Onone"; + }; + name = Debug; + }; + 614776AB2B048B1B000D0C88 /* Release */ = { + isa = XCBuildConfiguration; + buildSettings = { + ALWAYS_SEARCH_USER_PATHS = NO; + ASSETCATALOG_COMPILER_GENERATE_SWIFT_ASSET_SYMBOL_EXTENSIONS = YES; + CLANG_ANALYZER_NONNULL = YES; + CLANG_ANALYZER_NUMBER_OBJECT_CONVERSION = YES_AGGRESSIVE; + CLANG_CXX_LANGUAGE_STANDARD = "gnu++20"; + CLANG_ENABLE_MODULES = YES; + CLANG_ENABLE_OBJC_ARC = YES; + CLANG_ENABLE_OBJC_WEAK = YES; + CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES; + CLANG_WARN_BOOL_CONVERSION = YES; + CLANG_WARN_COMMA = YES; + CLANG_WARN_CONSTANT_CONVERSION = YES; + CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES; + CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; + CLANG_WARN_DOCUMENTATION_COMMENTS = YES; + CLANG_WARN_EMPTY_BODY = YES; + CLANG_WARN_ENUM_CONVERSION = YES; + CLANG_WARN_INFINITE_RECURSION = YES; + CLANG_WARN_INT_CONVERSION = YES; + CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES; + CLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES; + CLANG_WARN_OBJC_LITERAL_CONVERSION = YES; + CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; + CLANG_WARN_QUOTED_INCLUDE_IN_FRAMEWORK_HEADER = YES; + CLANG_WARN_RANGE_LOOP_ANALYSIS = YES; + CLANG_WARN_STRICT_PROTOTYPES = YES; + CLANG_WARN_SUSPICIOUS_MOVE = YES; + CLANG_WARN_UNGUARDED_AVAILABILITY = YES_AGGRESSIVE; + CLANG_WARN_UNREACHABLE_CODE = YES; + CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; + COPY_PHASE_STRIP = NO; + DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym"; + ENABLE_NS_ASSERTIONS = NO; + ENABLE_STRICT_OBJC_MSGSEND = YES; + ENABLE_USER_SCRIPT_SANDBOXING = YES; + GCC_C_LANGUAGE_STANDARD = gnu17; + GCC_NO_COMMON_BLOCKS = YES; + GCC_WARN_64_TO_32_BIT_CONVERSION = YES; + GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR; + GCC_WARN_UNDECLARED_SELECTOR = YES; + GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; + GCC_WARN_UNUSED_FUNCTION = YES; + GCC_WARN_UNUSED_VARIABLE = YES; + IPHONEOS_DEPLOYMENT_TARGET = 17.0; + LOCALIZATION_PREFERS_STRING_CATALOGS = YES; + MTL_ENABLE_DEBUG_INFO = NO; + MTL_FAST_MATH = YES; + SDKROOT = iphoneos; + SWIFT_COMPILATION_MODE = wholemodule; + VALIDATE_PRODUCT = YES; + }; + name = Release; + }; + 614776AD2B048B1B000D0C88 /* Debug */ = { + isa = XCBuildConfiguration; + buildSettings = { + ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; + ASSETCATALOG_COMPILER_GLOBAL_ACCENT_COLOR_NAME = AccentColor; + CODE_SIGN_STYLE = Automatic; + CURRENT_PROJECT_VERSION = 1; + DEVELOPMENT_ASSET_PATHS = "\"Weather/Preview Content\""; + ENABLE_PREVIEWS = YES; + GENERATE_INFOPLIST_FILE = YES; + INFOPLIST_KEY_UIApplicationSceneManifest_Generation = YES; + INFOPLIST_KEY_UIApplicationSupportsIndirectInputEvents = YES; + INFOPLIST_KEY_UILaunchScreen_Generation = YES; + INFOPLIST_KEY_UISupportedInterfaceOrientations_iPad = "UIInterfaceOrientationPortrait UIInterfaceOrientationPortraitUpsideDown UIInterfaceOrientationLandscapeLeft UIInterfaceOrientationLandscapeRight"; + INFOPLIST_KEY_UISupportedInterfaceOrientations_iPhone = "UIInterfaceOrientationPortrait UIInterfaceOrientationLandscapeLeft UIInterfaceOrientationLandscapeRight"; + LD_RUNPATH_SEARCH_PATHS = ( + "$(inherited)", + "@executable_path/Frameworks", + ); + MARKETING_VERSION = 1.0; + PRODUCT_BUNDLE_IDENTIFIER = skp.318.Weather; + PRODUCT_NAME = "$(TARGET_NAME)"; + SWIFT_EMIT_LOC_STRINGS = YES; + SWIFT_VERSION = 5.0; + TARGETED_DEVICE_FAMILY = "1,2"; + }; + name = Debug; + }; + 614776AE2B048B1B000D0C88 /* Release */ = { + isa = XCBuildConfiguration; + buildSettings = { + ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; + ASSETCATALOG_COMPILER_GLOBAL_ACCENT_COLOR_NAME = AccentColor; + CODE_SIGN_STYLE = Automatic; + CURRENT_PROJECT_VERSION = 1; + DEVELOPMENT_ASSET_PATHS = "\"Weather/Preview Content\""; + ENABLE_PREVIEWS = YES; + GENERATE_INFOPLIST_FILE = YES; + INFOPLIST_KEY_UIApplicationSceneManifest_Generation = YES; + INFOPLIST_KEY_UIApplicationSupportsIndirectInputEvents = YES; + INFOPLIST_KEY_UILaunchScreen_Generation = YES; + INFOPLIST_KEY_UISupportedInterfaceOrientations_iPad = "UIInterfaceOrientationPortrait UIInterfaceOrientationPortraitUpsideDown UIInterfaceOrientationLandscapeLeft UIInterfaceOrientationLandscapeRight"; + INFOPLIST_KEY_UISupportedInterfaceOrientations_iPhone = "UIInterfaceOrientationPortrait UIInterfaceOrientationLandscapeLeft UIInterfaceOrientationLandscapeRight"; + LD_RUNPATH_SEARCH_PATHS = ( + "$(inherited)", + "@executable_path/Frameworks", + ); + MARKETING_VERSION = 1.0; + PRODUCT_BUNDLE_IDENTIFIER = skp.318.Weather; + PRODUCT_NAME = "$(TARGET_NAME)"; + SWIFT_EMIT_LOC_STRINGS = YES; + SWIFT_VERSION = 5.0; + TARGETED_DEVICE_FAMILY = "1,2"; + }; + name = Release; + }; +/* End XCBuildConfiguration section */ + +/* Begin XCConfigurationList section */ + 614776992B048B19000D0C88 /* Build configuration list for PBXProject "Weather" */ = { + isa = XCConfigurationList; + buildConfigurations = ( + 614776AA2B048B1B000D0C88 /* Debug */, + 614776AB2B048B1B000D0C88 /* Release */, + ); + defaultConfigurationIsVisible = 0; + defaultConfigurationName = Release; + }; + 614776AC2B048B1B000D0C88 /* Build configuration list for PBXNativeTarget "Weather" */ = { + isa = XCConfigurationList; + buildConfigurations = ( + 614776AD2B048B1B000D0C88 /* Debug */, + 614776AE2B048B1B000D0C88 /* Release */, + ); + defaultConfigurationIsVisible = 0; + defaultConfigurationName = Release; + }; +/* End XCConfigurationList section */ + }; + rootObject = 614776962B048B19000D0C88 /* Project object */; +} diff --git a/Weather/Weather.xcodeproj/project.xcworkspace/contents.xcworkspacedata b/Weather/Weather.xcodeproj/project.xcworkspace/contents.xcworkspacedata new file mode 100644 index 0000000..919434a --- /dev/null +++ b/Weather/Weather.xcodeproj/project.xcworkspace/contents.xcworkspacedata @@ -0,0 +1,7 @@ + + + + + diff --git a/Weather/Weather.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist b/Weather/Weather.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist new file mode 100644 index 0000000..18d9810 --- /dev/null +++ b/Weather/Weather.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist @@ -0,0 +1,8 @@ + + + + + IDEDidComputeMac32BitWarning + + + diff --git a/Weather/Weather/Assets.xcassets/AccentColor.colorset/Contents.json b/Weather/Weather/Assets.xcassets/AccentColor.colorset/Contents.json new file mode 100644 index 0000000..eb87897 --- /dev/null +++ b/Weather/Weather/Assets.xcassets/AccentColor.colorset/Contents.json @@ -0,0 +1,11 @@ +{ + "colors" : [ + { + "idiom" : "universal" + } + ], + "info" : { + "author" : "xcode", + "version" : 1 + } +} diff --git a/Weather/Weather/Assets.xcassets/AppIcon.appiconset/Contents.json b/Weather/Weather/Assets.xcassets/AppIcon.appiconset/Contents.json new file mode 100644 index 0000000..13613e3 --- /dev/null +++ b/Weather/Weather/Assets.xcassets/AppIcon.appiconset/Contents.json @@ -0,0 +1,13 @@ +{ + "images" : [ + { + "idiom" : "universal", + "platform" : "ios", + "size" : "1024x1024" + } + ], + "info" : { + "author" : "xcode", + "version" : 1 + } +} diff --git a/Weather/Weather/Assets.xcassets/Contents.json b/Weather/Weather/Assets.xcassets/Contents.json new file mode 100644 index 0000000..73c0059 --- /dev/null +++ b/Weather/Weather/Assets.xcassets/Contents.json @@ -0,0 +1,6 @@ +{ + "info" : { + "author" : "xcode", + "version" : 1 + } +} diff --git a/Weather/Weather/ContentView.swift b/Weather/Weather/ContentView.swift new file mode 100644 index 0000000..2127521 --- /dev/null +++ b/Weather/Weather/ContentView.swift @@ -0,0 +1,22 @@ +// +// ContentView.swift +// WeatherApp +// +// Created by 박선구 on 11/13/23. +// + +import SwiftUI + +struct ContentView: View { + + var body: some View { + VStack{ + + } + } +} + +#Preview { + ContentView() + .environmentObject(Network()) +} diff --git a/Weather/Weather/NetworkSetting/Network.swift b/Weather/Weather/NetworkSetting/Network.swift new file mode 100644 index 0000000..77a04f1 --- /dev/null +++ b/Weather/Weather/NetworkSetting/Network.swift @@ -0,0 +1,46 @@ +// +// Network.swift +// WeatherApp +// +// Created by 박선구 on 11/13/23. +// + +import Foundation +import SwiftUI + +class Network: ObservableObject { + @Published var weather: Instruction = Instruction.sample + + let apiKey = "apiKey" + + func getWeather() { + guard let url = URL(string: "https://api.openweathermap.org/data/2.5/weather?q=seoul&appid=\(apiKey)") else { fatalError("Missing URL") } + + let urlRequest = URLRequest(url: url) + + // Task 만들기 + let dataTask = URLSession.shared.dataTask(with: urlRequest) { (data, response, error) in + if let error = error { + print("Request error: ", error) + return + } + + guard let response = response as? HTTPURLResponse else { return } + + // 응답 상태코드가 200(성공)일 경우에만 디코딩 + if response.statusCode == 200 { + guard let data = data else { return } + DispatchQueue.main.async { + do { + let decodedWeather = try JSONDecoder().decode(Instruction.self, from: data) + self.weather = decodedWeather + } catch let error { + print("Error decoding: ", error) + } + } + } + } + // Task 수행하기 + dataTask.resume() + } +} diff --git a/Weather/Weather/NetworkSetting/Weather.swift b/Weather/Weather/NetworkSetting/Weather.swift new file mode 100644 index 0000000..9cc9831 --- /dev/null +++ b/Weather/Weather/NetworkSetting/Weather.swift @@ -0,0 +1,88 @@ +// +// Weather.swift +// WeatherApp +// +// Created by 박선구 on 11/13/23. +// + +import Foundation + +// MARK: - Welcome +struct Welcome: Codable { + let greeting: String + let instructions: [Instruction] +} + +// MARK: - Instruction +struct Instruction: Codable { + let coord: Coord + let weather: [Weather] + let base: String + let main: Main + let visibility: Int + let wind: Wind + let clouds: Clouds + let dt: Int + let sys: Sys + let timezone, id: Int + let name: String + let cod: Int + + static let sample = Instruction( + coord: Coord(lon: 0, lat: 0), + weather: [], + base: "", + main: Main(temp: 0, feelsLike: 0, tempMin: 0, tempMax: 0, pressure: 0, humidity: 0), + visibility: 0, + wind: Wind(speed: 0, deg: 0), + clouds: Clouds(all: 0), + dt: 0, + sys: Sys(type: 0, id: 0, country: "", sunrise: 0, sunset: 0), + timezone: 0, + id: 0, + name: "", + cod: 0) +} + +// MARK: - Clouds +struct Clouds: Codable { + let all: Int +} + +// MARK: - Coord +struct Coord: Codable { + let lon, lat: Double +} + +// MARK: - Main +struct Main: Codable { + let temp, feelsLike, tempMin, tempMax: Double + let pressure, humidity: Int + + enum CodingKeys: String, CodingKey { + case temp + case feelsLike = "feels_like" + case tempMin = "temp_min" + case tempMax = "temp_max" + case pressure, humidity + } +} + +// MARK: - Sys +struct Sys: Codable { + let type, id: Int + let country: String + let sunrise, sunset: Int +} + +// MARK: - Weather +struct Weather: Codable { + let id: Int + let main, description, icon: String +} + +// MARK: - Wind +struct Wind: Codable { + let speed: Double + let deg: Int +} diff --git a/Weather/Weather/NetworkSetting/WeatherApi.swift b/Weather/Weather/NetworkSetting/WeatherApi.swift new file mode 100644 index 0000000..6db6f0d --- /dev/null +++ b/Weather/Weather/NetworkSetting/WeatherApi.swift @@ -0,0 +1,23 @@ +// +// WeatherApi.swift +// WeatherApp +// +// Created by 박선구 on 11/13/23. +// + +import Foundation + +private var apiKey: String { + get { + guard let filePath = Bundle.main.path(forResource: "KeyList", ofType: "plist") else { + fatalError("Couldn't find file 'KeyList.plist'.") + } + + let plist = NSDictionary(contentsOfFile: filePath) + + guard let value = plist?.object(forKey: "OPENWEATHERMAP_KEY") as? String else { + fatalError("Couldn't find key 'OPENWEATHERMAP_KEY' in 'KeyList.plist'.") + } + return value + } +} diff --git a/Weather/Weather/Preview Content/Preview Assets.xcassets/Contents.json b/Weather/Weather/Preview Content/Preview Assets.xcassets/Contents.json new file mode 100644 index 0000000..73c0059 --- /dev/null +++ b/Weather/Weather/Preview Content/Preview Assets.xcassets/Contents.json @@ -0,0 +1,6 @@ +{ + "info" : { + "author" : "xcode", + "version" : 1 + } +} diff --git a/Weather/Weather/Property List.plist b/Weather/Weather/Property List.plist new file mode 100644 index 0000000..86f0207 --- /dev/null +++ b/Weather/Weather/Property List.plist @@ -0,0 +1,8 @@ + + + + + OPENWEATHERMAP_KEY + + + diff --git a/Weather/Weather/UIView/AddTodoView.swift b/Weather/Weather/UIView/AddTodoView.swift new file mode 100644 index 0000000..ba72115 --- /dev/null +++ b/Weather/Weather/UIView/AddTodoView.swift @@ -0,0 +1,67 @@ +// +// AddTodoView.swift +// WeatherApp +// +// Created by 박선구 on 11/15/23. +// + +import SwiftUI + +struct AddTodoView: View { + @ObservedObject var todayListStore: TodoListStore = TodoListStore() + + @State var title: String = "" + @State var content: String = "" + + var body: some View { + VStack(alignment: .leading){ + Text(dateFormatter()) + .font(.largeTitle) + + Text("일정 추가") + .font(.title) + + Spacer() + + Text("Title") + TextField("title", text: $title) + + Text("Detail") + TextField("detail", text: $content) + + Spacer() + } + .textFieldStyle(.roundedBorder) + .padding() + + VStack(alignment: .center){ + Button(action: addContent, label: { + Text("추가") + }) + } + } + + func addContent() { + if !title.isEmpty && !content.isEmpty { + todayListStore.addList(title: title, content: content) +// TodoListStore.addList(title: title, content: content) + title = "" + content = "" + } else { + title = "" + content = "" + } + } + + func dateFormatter() -> String{ + let nowDate = Date() + let dateFormatter = DateFormatter() + dateFormatter.dateFormat = "yyyy년 MM월 dd일" + let str = dateFormatter.string(from: nowDate) + return str + } +} + +#Preview { + AddTodoView() +} diff --git a/Weather/Weather/UIView/MapView.swift b/Weather/Weather/UIView/MapView.swift new file mode 100644 index 0000000..6fd0d54 --- /dev/null +++ b/Weather/Weather/UIView/MapView.swift @@ -0,0 +1,29 @@ +// +// MapView.swift +// WeatherApp +// +// Created by 박선구 on 11/14/23. +// + +import SwiftUI +import MapKit + + + + +struct MapView: View { + + @State private var region = MKCoordinateRegion(center: CLLocationCoordinate2D(latitude: 37.5666791, longitude: 126.9782914), span: MKCoordinateSpan(latitudeDelta: 0.5, longitudeDelta: 0.5)) + + + + var body: some View { + Map(coordinateRegion: $region, interactionModes: []) + .frame(width: 350, height: 300) + .cornerRadius(10) + } +} + +#Preview { + MapView() +} diff --git a/Weather/Weather/UIView/WeatherView.swift b/Weather/Weather/UIView/WeatherView.swift new file mode 100644 index 0000000..73ea7a0 --- /dev/null +++ b/Weather/Weather/UIView/WeatherView.swift @@ -0,0 +1,209 @@ +// +// WeatherView.swift +// WeatherApp +// +// Created by 박선구 on 11/14/23. +// + +import SwiftUI + +struct WeatherView: View { + + @EnvironmentObject var network: Network + @State private var selection = 1 + @State private var title = "일정 추가" + + var bgColor : Color = .black + + //국가 + var country: String {network.weather.sys.country} + + //좌표 + var coord1: Double {network.weather.coord.lat} + var coord2: Double {network.weather.coord.lon} + + //날씨 + var clouds: String { String(format: "%.1f", (network.weather.clouds.all))} + var wind: String { String(format: "%.1f", (network.weather.wind.speed))} + + // + var weatherMain: String {network.weather.weather.first?.main ?? ""} + var weatherDescription: String {network.weather.weather.first?.description ?? ""} + + +// var temp: String { String(format: "%.1f", (network.weather.main.temp - 273.15)) } + + //온도 + var temp: String { String(format: "%.1f", (network.weather.main.temp - 273.15)) } + var tempMin: String { String(format: "%.1f", (network.weather.main.tempMin - 273.15)) } + var tempMax: String { String(format: "%.1f", (network.weather.main.tempMax - 273.15)) } + + //아이콘 + var icon: String {network.weather.weather.first?.icon ?? "" } + var humidity: Int {network.weather.main.humidity} + + + var body: some View { + NavigationStack{ + Text("\(country)") + Text("서울특별시") + .font(.headline) + + HStack{ + Text("\(coord1)") + Text("\(coord2)") + } + .font(.subheadline) + + TabView(selection: $selection) { + VStack{ + // Text("\(country)") + // Text("서울특별시") + // .font(.headline) + // + // HStack{ + // Text("\(coord1)") + // Text("\(coord2)") + // } + // .font(.subheadline) + + Spacer() + + VStack{ + HStack{ + Image(systemName: SelectIcon()) + .resizable() + .frame(width: 50, height: 50) + .foregroundColor(SelectColor()) + Text("\(weatherMain)") + .font(.largeTitle) + } + .padding() + // .foregroundColor(SelectColor()) + + VStack{ + Text("\(temp) ℃") + .font(.largeTitle) + HStack{ + Text("\(tempMin)℃") + Text(" ~ ") + Text("\(tempMax)℃") + } + } + } + .padding() + + Spacer() + + HStack{ + Spacer() + // Text("구름양") + Image(systemName: "cloud") + Text("\(clouds)") + Spacer() + // Text("풍속") + Image(systemName: "wind") + Text("\(wind)m/s") + Spacer() + // Text("습도") + Image(systemName: "humidity") + Text("\(humidity)") + Spacer() + } + } + .tag(1) + .onAppear{ + network.getWeather() + } + + MapView() + .tag(2) + } + .tabViewStyle(PageTabViewStyle()) + // .indexViewStyle(PageIndexViewStyle(backgroundDisplayMode: .never)) + + Text("") + .frame(width: 350, height: 2) + .background(SelectColor()) + + todoListVIew() + } + } + + func SelectIcon () -> String{ +// var icons: String = "" + + if icon == "01d" || icon == "01n" { + return "sun.max.fill" + } else if icon == "02d" || icon == "02n" { + return "cloud.sun.fill" + } else if icon == "03d" || icon == "03n"{ + return "cloud.fill" + } else if icon == "04d" || icon == "04n"{ + return "cloud.fill" + } else if icon == "09d" || icon == "09n"{ + return "cloud.heavyrain.fill" + } else if icon == "10d" || icon == "10n"{ + return "sun.rain.fill" + } else if icon == "11d" || icon == "11n"{ + return "cloud.bolt.fill" + } else if icon == "13d" || icon == "13n"{ + return "cloud.snow.fill" + } else if icon == "50d" || icon == "50n"{ + return "cloud.fog.fill" + } else { + return "sun.horizon.fill" + } + } + + func SelectColor () -> Color{ +// var icons: String = "" + + if icon == "01d" || icon == "01n" { + return .red + } else if icon == "02d" || icon == "02n" { + return .blue + } else if icon == "03d" || icon == "03n"{ + return .gray + } else if icon == "04d" || icon == "04n"{ + return .gray + } else if icon == "09d" || icon == "09n"{ + return .blue + } else if icon == "10d" || icon == "10n"{ + return .yellow + } else if icon == "11d" || icon == "11n"{ + return .orange + } else if icon == "13d" || icon == "13n"{ + return .gray + } else if icon == "50d" || icon == "50n"{ + return .gray + } else { + return .black + } + } + + +// mutating func dateFormatter(){ +// let nowDate = Date() +// let dateFormatter = DateFormatter() +// dateFormatter.dateFormat = "hh:mm" +// let str = dateFormatter.string(from: nowDate) +// +// if str >= "06:00" && str <= "18:00" { +// return bgColor = .mint +// +// } else if str >= "18:00" && str <= "06:00" { +// return bgColor = .indigo +// } else { +// return bgColor = .red +// } +// } + +} + + + +#Preview { + WeatherView() + .environmentObject(Network()) +} diff --git a/Weather/Weather/UIView/todoDetailView.swift b/Weather/Weather/UIView/todoDetailView.swift new file mode 100644 index 0000000..87cd2f3 --- /dev/null +++ b/Weather/Weather/UIView/todoDetailView.swift @@ -0,0 +1,41 @@ +// +// todoDetailView.swift +// WeatherApp +// +// Created by 박선구 on 11/14/23. +// + +import SwiftUI + +struct todoDetailView: View { + + let selectedList: TodoList + + + var body: some View { + Form{ + Section(content: { + Text(selectedList.title) + .font(.largeTitle) + + Text(selectedList.content) + .font(.title) + }, header: { + Text(dateFormatter()) + }) + + } + } + func dateFormatter() -> String{ + let nowDate = Date() + let dateFormatter = DateFormatter() + dateFormatter.dateFormat = "yyyy년 MM월 dd일" + let str = dateFormatter.string(from: nowDate) + return str + } +} + +//#Preview { +// todoDetailView(selectedList: TodoList[0]) +//} + diff --git a/Weather/Weather/UIView/todoListVIew.swift b/Weather/Weather/UIView/todoListVIew.swift new file mode 100644 index 0000000..cbde899 --- /dev/null +++ b/Weather/Weather/UIView/todoListVIew.swift @@ -0,0 +1,124 @@ +// +// todoListVIew.swift +// WeatherApp +// +// Created by 박선구 on 11/14/23. +// + +import SwiftUI + +struct TodoList: Hashable, Identifiable { + var id: UUID = UUID() +// var id: String + var title: String + var content: String +} + +class TodoListStore: ObservableObject { + @Published var todayList: [TodoList] + + init() { + self.todayList = [ + TodoList(title: "오늘의 할일 1", content: "오늘 해야할 일을 입력"), + TodoList(title: "오늘의 할일 2", content: "오늘 해야할 일을 입력") + ] + } + + func addList(title: String, content: String) { + let linklist: TodoList = TodoList(title: title, content: content) + todayList.append(linklist) + } + +} + + + +struct todoListVIew: View { + +// @ObservedObject var todayListStore: TodoListStore = TodoListStore() + +// @Binding var todayMyList: [TodoList] + + @StateObject var todayListStore = TodoListStore() + @State private var stackPath = NavigationPath() + @State var title: String = "" + @State var content: String = "" + +// @State var todayList: [TodoList] = [ +// TodoList(title: "오늘의 할일 1", content: "오늘 해야할 일을 입력"), +// TodoList(title: "오늘의 할일 1", content: "오늘 해야할 일을 입력") +// ] +// @State var todayList = [ +// TodoList(title: "오늘의 할일 1", content: "오늘 해야할 일을 입력"), +// TodoList(title: "오늘의 할일 1", content: "오늘 해야할 일을 입력") +// ] + + var body: some View { + Text("\(dateFormatter())") + .padding() + .foregroundColor(.black) + .font(.largeTitle) + NavigationStack(path: $stackPath){ + List{ + ForEach(todayListStore.todayList, id: \.self){ item in + NavigationLink(value: item) { +// ListCell(list: todayListStore.todayList[0]) + VStack(alignment: .leading){ + Text(item.title).font(.title2) + Text(item.content).foregroundStyle(.gray) + } + } + .listRowSeparatorTint(.black) +// .listRowBackground(Color.red) + } + .onDelete { item in + todayListStore.todayList.remove(atOffsets: item) + } + .onMove { from , to in + todayListStore.todayList.move(fromOffsets: from, toOffset: to) + } +// .toolbar { +// EditButton() +// } + } + .navigationDestination(for: Int.self) { i in todoDetailView(selectedList: todayListStore.todayList[i]) + } + .listStyle(.automatic) +// .navigationBarTitle(dateFormatter()) +// .navigationBarItems(trailing: EditButton()) +// Button(action: {}, label: { +// Text("일정추가") +// }) + + NavigationLink(destination: AddTodoView(todayListStore: self.todayListStore), label: { + VStack{ + Text("일정추가").font(.body) + } + }) + } + + } + + func dateFormatter() -> String{ + let nowDate = Date() + let dateFormatter = DateFormatter() + dateFormatter.dateFormat = "yyyy년 MM월 dd일" + let str = dateFormatter.string(from: nowDate) + return str + } +} + +struct ListCell: View { + + var list: TodoList + var body: some View { + VStack{ + Text(list.title) + } + } +} + + +#Preview { + todoListVIew() +} diff --git a/Weather/Weather/WeatherApp.swift b/Weather/Weather/WeatherApp.swift new file mode 100644 index 0000000..6036ec7 --- /dev/null +++ b/Weather/Weather/WeatherApp.swift @@ -0,0 +1,18 @@ +// +// WeatherApp.swift +// Weather +// +// Created by 박선구 on 11/15/23. +// + +import SwiftUI + +@main +struct WeatherApp: App { + var body: some Scene { + WindowGroup { + WeatherView() + .environmentObject(Network()) + } + } +} diff --git a/Weather/Weather/WeatherAppApp.swift b/Weather/Weather/WeatherAppApp.swift new file mode 100644 index 0000000..e134255 --- /dev/null +++ b/Weather/Weather/WeatherAppApp.swift @@ -0,0 +1,20 @@ +// +// WeatherAppApp.swift +// WeatherApp +// +// Created by 박선구 on 11/13/23. +// + +import SwiftUI + +@main +struct WeatherAppApp: App { + var network = Network() + + var body: some Scene { + WindowGroup { + WeatherView() + .environmentObject(network) + } + } +} From 7bc433f429bab2b2b4a99702318d81b1c55e6636 Mon Sep 17 00:00:00 2001 From: SeonKoo Date: Wed, 15 Nov 2023 14:54:13 +0900 Subject: [PATCH 21/21] WeatherAPP use api (fix) --- Weather/Weather.xcodeproj/project.pbxproj | 4 --- .../Weather/NetworkSetting/WeatherApi.swift | 23 ------------ Weather/Weather/UIView/WeatherView.swift | 36 ------------------- Weather/Weather/UIView/todoListVIew.swift | 30 ++-------------- 4 files changed, 2 insertions(+), 91 deletions(-) delete mode 100644 Weather/Weather/NetworkSetting/WeatherApi.swift diff --git a/Weather/Weather.xcodeproj/project.pbxproj b/Weather/Weather.xcodeproj/project.pbxproj index dbe580c..575cdac 100644 --- a/Weather/Weather.xcodeproj/project.pbxproj +++ b/Weather/Weather.xcodeproj/project.pbxproj @@ -16,7 +16,6 @@ 614776B62B048CDA000D0C88 /* todoDetailView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 614776B32B048CDA000D0C88 /* todoDetailView.swift */; }; 614776B72B048CDA000D0C88 /* WeatherView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 614776B42B048CDA000D0C88 /* WeatherView.swift */; }; 614776B82B048CDA000D0C88 /* todoListVIew.swift in Sources */ = {isa = PBXBuildFile; fileRef = 614776B52B048CDA000D0C88 /* todoListVIew.swift */; }; - 614776BC2B048CE3000D0C88 /* WeatherApi.swift in Sources */ = {isa = PBXBuildFile; fileRef = 614776B92B048CE3000D0C88 /* WeatherApi.swift */; }; 614776BD2B048CE3000D0C88 /* Network.swift in Sources */ = {isa = PBXBuildFile; fileRef = 614776BA2B048CE3000D0C88 /* Network.swift */; }; 614776BE2B048CE3000D0C88 /* Weather.swift in Sources */ = {isa = PBXBuildFile; fileRef = 614776BB2B048CE3000D0C88 /* Weather.swift */; }; /* End PBXBuildFile section */ @@ -32,7 +31,6 @@ 614776B32B048CDA000D0C88 /* todoDetailView.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = todoDetailView.swift; sourceTree = ""; }; 614776B42B048CDA000D0C88 /* WeatherView.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = WeatherView.swift; sourceTree = ""; }; 614776B52B048CDA000D0C88 /* todoListVIew.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = todoListVIew.swift; sourceTree = ""; }; - 614776B92B048CE3000D0C88 /* WeatherApi.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = WeatherApi.swift; sourceTree = ""; }; 614776BA2B048CE3000D0C88 /* Network.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = Network.swift; sourceTree = ""; }; 614776BB2B048CE3000D0C88 /* Weather.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = Weather.swift; sourceTree = ""; }; /* End PBXFileReference section */ @@ -102,7 +100,6 @@ children = ( 614776BA2B048CE3000D0C88 /* Network.swift */, 614776BB2B048CE3000D0C88 /* Weather.swift */, - 614776B92B048CE3000D0C88 /* WeatherApi.swift */, ); path = NetworkSetting; sourceTree = ""; @@ -184,7 +181,6 @@ 614776BE2B048CE3000D0C88 /* Weather.swift in Sources */, 614776B82B048CDA000D0C88 /* todoListVIew.swift in Sources */, 614776BD2B048CE3000D0C88 /* Network.swift in Sources */, - 614776BC2B048CE3000D0C88 /* WeatherApi.swift in Sources */, 614776A22B048B1A000D0C88 /* WeatherApp.swift in Sources */, 614776B02B048CA0000D0C88 /* AddTodoView.swift in Sources */, ); diff --git a/Weather/Weather/NetworkSetting/WeatherApi.swift b/Weather/Weather/NetworkSetting/WeatherApi.swift deleted file mode 100644 index 6db6f0d..0000000 --- a/Weather/Weather/NetworkSetting/WeatherApi.swift +++ /dev/null @@ -1,23 +0,0 @@ -// -// WeatherApi.swift -// WeatherApp -// -// Created by 박선구 on 11/13/23. -// - -import Foundation - -private var apiKey: String { - get { - guard let filePath = Bundle.main.path(forResource: "KeyList", ofType: "plist") else { - fatalError("Couldn't find file 'KeyList.plist'.") - } - - let plist = NSDictionary(contentsOfFile: filePath) - - guard let value = plist?.object(forKey: "OPENWEATHERMAP_KEY") as? String else { - fatalError("Couldn't find key 'OPENWEATHERMAP_KEY' in 'KeyList.plist'.") - } - return value - } -} diff --git a/Weather/Weather/UIView/WeatherView.swift b/Weather/Weather/UIView/WeatherView.swift index 73ea7a0..c3e49ac 100644 --- a/Weather/Weather/UIView/WeatherView.swift +++ b/Weather/Weather/UIView/WeatherView.swift @@ -31,8 +31,6 @@ struct WeatherView: View { var weatherDescription: String {network.weather.weather.first?.description ?? ""} -// var temp: String { String(format: "%.1f", (network.weather.main.temp - 273.15)) } - //온도 var temp: String { String(format: "%.1f", (network.weather.main.temp - 273.15)) } var tempMin: String { String(format: "%.1f", (network.weather.main.tempMin - 273.15)) } @@ -57,16 +55,6 @@ struct WeatherView: View { TabView(selection: $selection) { VStack{ - // Text("\(country)") - // Text("서울특별시") - // .font(.headline) - // - // HStack{ - // Text("\(coord1)") - // Text("\(coord2)") - // } - // .font(.subheadline) - Spacer() VStack{ @@ -79,7 +67,6 @@ struct WeatherView: View { .font(.largeTitle) } .padding() - // .foregroundColor(SelectColor()) VStack{ Text("\(temp) ℃") @@ -97,15 +84,12 @@ struct WeatherView: View { HStack{ Spacer() - // Text("구름양") Image(systemName: "cloud") Text("\(clouds)") Spacer() - // Text("풍속") Image(systemName: "wind") Text("\(wind)m/s") Spacer() - // Text("습도") Image(systemName: "humidity") Text("\(humidity)") Spacer() @@ -120,7 +104,6 @@ struct WeatherView: View { .tag(2) } .tabViewStyle(PageTabViewStyle()) - // .indexViewStyle(PageIndexViewStyle(backgroundDisplayMode: .never)) Text("") .frame(width: 350, height: 2) @@ -131,7 +114,6 @@ struct WeatherView: View { } func SelectIcon () -> String{ -// var icons: String = "" if icon == "01d" || icon == "01n" { return "sun.max.fill" @@ -157,7 +139,6 @@ struct WeatherView: View { } func SelectColor () -> Color{ -// var icons: String = "" if icon == "01d" || icon == "01n" { return .red @@ -182,23 +163,6 @@ struct WeatherView: View { } } - -// mutating func dateFormatter(){ -// let nowDate = Date() -// let dateFormatter = DateFormatter() -// dateFormatter.dateFormat = "hh:mm" -// let str = dateFormatter.string(from: nowDate) -// -// if str >= "06:00" && str <= "18:00" { -// return bgColor = .mint -// -// } else if str >= "18:00" && str <= "06:00" { -// return bgColor = .indigo -// } else { -// return bgColor = .red -// } -// } - } diff --git a/Weather/Weather/UIView/todoListVIew.swift b/Weather/Weather/UIView/todoListVIew.swift index cbde899..547367f 100644 --- a/Weather/Weather/UIView/todoListVIew.swift +++ b/Weather/Weather/UIView/todoListVIew.swift @@ -9,7 +9,6 @@ import SwiftUI struct TodoList: Hashable, Identifiable { var id: UUID = UUID() -// var id: String var title: String var content: String } @@ -34,25 +33,12 @@ class TodoListStore: ObservableObject { struct todoListVIew: View { - -// @ObservedObject var todayListStore: TodoListStore = TodoListStore() - -// @Binding var todayMyList: [TodoList] @StateObject var todayListStore = TodoListStore() @State private var stackPath = NavigationPath() @State var title: String = "" @State var content: String = "" -// @State var todayList: [TodoList] = [ -// TodoList(title: "오늘의 할일 1", content: "오늘 해야할 일을 입력"), -// TodoList(title: "오늘의 할일 1", content: "오늘 해야할 일을 입력") -// ] -// @State var todayList = [ -// TodoList(title: "오늘의 할일 1", content: "오늘 해야할 일을 입력"), -// TodoList(title: "오늘의 할일 1", content: "오늘 해야할 일을 입력") -// ] - var body: some View { Text("\(dateFormatter())") .padding() @@ -60,16 +46,12 @@ struct todoListVIew: View { .font(.largeTitle) NavigationStack(path: $stackPath){ List{ - ForEach(todayListStore.todayList, id: \.self){ item in - NavigationLink(value: item) { -// ListCell(list: todayListStore.todayList[0]) + ForEach(todayListStore.todayList){ item in VStack(alignment: .leading){ Text(item.title).font(.title2) Text(item.content).foregroundStyle(.gray) } - } .listRowSeparatorTint(.black) -// .listRowBackground(Color.red) } .onDelete { item in todayListStore.todayList.remove(atOffsets: item) @@ -77,18 +59,10 @@ struct todoListVIew: View { .onMove { from , to in todayListStore.todayList.move(fromOffsets: from, toOffset: to) } -// .toolbar { -// EditButton() -// } } .navigationDestination(for: Int.self) { i in todoDetailView(selectedList: todayListStore.todayList[i]) } - .listStyle(.automatic) -// .navigationBarTitle(dateFormatter()) -// .navigationBarItems(trailing: EditButton()) -// Button(action: {}, label: { -// Text("일정추가") -// }) + .listStyle(.inset) NavigationLink(destination: AddTodoView(todayListStore: self.todayListStore), label: { VStack{