23.08.07 배운 문법들 개념 정리본 / 알고리즘 (직사각형 넓이 구하기)

2023. 8. 8. 16:29IOS [ Swift ]

함수의 형태

func 함수이름 (매개변수1이름: 매개변수1타입, 매개변수2이름: 매겨변수2타입 ...) -> 반환타입 {
   //함수 구현부
  return 반환값
}

func(펑션) 을 넣으면 함수 동작.

함수는 통상 기능구현을위해 사용.

 

매개변수를 넣는방법 - () 안에 123:Int, kiho:String, 1.5:Double 요런식으로 넣어준다.

반환 타입은 위에 적은 매개변수들을 어떤식으로 return 할 것 인지를 정해준다.

예를들어 123:Int -> String 이 된다면 123은 "123"으로 출력이 될 것이다.

 

 

전달 인자

// from과 to라는 전달인자레이블이 존재
// myName과 name이라는 매개변수 이름이 있는 welcome 함수
func welcome(from myname: String, to yourname: String) -> String {
    "안녕하세요 \(yourname)님! 저는 \(myname) 이라고 합니다!"
}
 
print(welcome(from: "서근", to: "미진"))
// 안녕하세요 미진님! 저는 서근 이라고 합니다!

매개변수를 넣는 괄호 안에 from과 to를 넣어 정확한 역할지정도 가능하다.

지정한 역할을 통해 프린트문을 작성할 수 있다.

 

ex) from:"서근", to:"미진"

 

 

인덱스 함수 호출방법

func getUser() -> [String] {
    ["김", "서근"]
}
 
let user = getUser()
print(user[0])

어레이 안에있는 배열함수 호출하는 방법이다.

함수의 객체를 따로만들어준후 ( ex -  user )

그 객체의 몇번째 배열을 호출할것인지 지정해준다. ( ex - user[0] = "김" )

 

그러나 이코드의 문제점 두가지가 있다고한다.

 

첫 번째, 한국이 아닌 다른 나라에서는 먼저 이름을 작성하고 그 뒤에 성을 작성하는 곳도 있을 수 있다.

 인덱스[0] 이 이름이고 인덱스[1] 이 성 이 될 수 있는 것.

 

두 번째, 중간에 이름을 삽입해야 할 수 도 있다.

그렇다고 인덱스[1]을 인덱스인덱스[2]로 바꾸면 오류가 생기게 된다.

 

즉 '김 서근' 라는 이름을 외국에서부를때는 '서근 김' 으로 칭해야하는데, 

user[0]으로 이미 지정을 해버리면 외국에서는 사용할 수 없다. 

 

그래서 사용할 수 있는 함수가 튜플!

 

func getUser() -> [String] {
  ["first": "김", "last": "서근"]
}
/*Cannot convert return expression of type '[String : String]' to return type '[String]'
 [String : String] 유형을 [String]반환 형식으로 변환 할 수 업습니다. */
 
let user = getUser()
print(user["first"])

이런식으로 : 앞에 이름을 지정해주어 사용성을 명확하게 해준다.

 

이러면 외국에서써도 성이 "김" 이라는 것을 한번에 인식한다.

 

func getUser() -> (first: String, last: String) {
    (first: "김", last: "서근")
}
 
let user = getUser()
print(user.first)

요건 좀 더 안정적인 코드!

 

코드 출처 : 서근 개발노트

 

 

그리고 오늘 풀어본 알고리즘 문제!

 

직사각형 넓이 구하기

 

⬆️문제 내용

 

import Foundation

func solution(_ dots:[[Int]]) -> Int {
    var x:[Int] = []
    var y:[Int] = []
//         [[1,2,[1]],[3,4],[5,6]][[1,2,[1]][3,4][5,6]]dots.[1][0][0]
//         x.min() , x.max() 가장 작은값과 높은값 찾아내주는 함수
        
//     dots [x][y]
    for i in 0...dots.count-1{
        x.append(dots[i][0])
        y.append(dots[i][1])
        }
        
        if let x1 = x.max(),
        let x2 = x.min(),
        let y1 = y.max(),
        let y2 = y.min(){
            width = x1 - x2
            height = y1 - y2
        }
        
        
    return width*height
    
}

 

팀원분의 코드를 참고하여 해석중이다.

 

[[x,y][x,y][x,y]] 의 형태로 주어진 dots 안에서 i의 값을 먼저 찾는다.

 

그 i 의 값은 [x,y][x,y][x,y] 뭉터기들이 i 값인데 , 

이 괄호 안의 x, y 따로 따로를 추출하기위해서는 [0][1]로 몇번째 배열인지 지정해주어야한다.

 

고로  위에 만든 객체 x:[Int] = [] 에 추출한 값이 대입되도록

 

x.append(dots[i][0]) ( i 안에서 0번째 값 즉 x의 값 )

y.append(dots[i][1]) ( i 안에서 1번째 값 즉 y의 값 )

 

의 형태로 코드를 작성.

 

위의 코드를 풀이하자면 비어있는 객체 [] 안에 append를 해주는거다.

근데 무슨값을 append 해주냐?! 하는것을 옆에 괄호로 dots[i][0] 과 같이 지정해 주는것이다.

 

그럼 현재 각각 x y 의 객체안에는 값들이 대입되는 상태.

 

그럼 그 값들의 최댓값과 최솟값을 각자 빼주면 직사각형의 길이들이 나온다.

 

예로 x는 가로길이 , y는 세로길이 

 

문제 입출력 예 2번을 보면 x의 값중 가장 큰것이 1이고 작은것은 -1인데

1-(-1) = 2

y의 값도 똑같이 가장 큰것이 1이고 작은것이 -1 인데

1-(-1) = 2

 

고로 이 내용을 함수로옮기면 

 if let x1 = x.max(),
        let x2 = x.min(),
        let y1 = y.max(),
        let y2 = y.min(){

 

}

 과 같이 정리 되고, 저 중괄호 안에는 width 와 height의 각각 뺴는값을 지정해준다.

 

그럼 리턴값에는 width*height를 출력해주면된다!

 

까지 이해했는데 처음에 for문을 쓰는곳에서 0...dots.count-1 를 쓰신게 어떤의미인지 잘 모르겠다.

이건 다음에 기회가되면 물어보도록 해야겠다.