나의 답)
import Foundation
func solution(_ ineq: String, _ eq: String, _ n: Int, _ m: Int) -> Int {
switch (ineq, eq) {
case (">", "="): return n >= m ? 1 : 0
case (">", "!"): return n > m ? 1 : 0
case ("<", "="): return n <= m ? 1 : 0
case ("<", "!"): return n < m ? 1 : 0
default: return 0
}
}
주어진 문제는 비교 연산자와 논리 연산자를 조합하여 정수 n과
m의 관계를 확인하는 것인데,
문제가 조금만 길어져도 이해하기가 어려워진 나는..
읽고 이해하는데 5분 넘게 걸린 듯 하다 ㅎㅎ
입출력 예시를 보고 음 그럼 총 네가지의 예시가 필요하다는 걸 알게 되었고,
일단 필요한 건 "이거 아니면 ~ 이거." 는 뭐다?
if else 다~
그렇게 if else로 필요한 네가지 상황을 모두 논리연산자와 삼항연산자로 써봤다.
import Foundation
func solution(_ ineq: String, _ eq: String, _ n: Int, _ m: Int) -> Int {
if ineq == ">" && eq == "=" {
return n >= m ? 1 : 0
} else if ineq == ">" && eq == "!" {
return n > m ? 1 : 0
} else if ineq == "<" && eq == "=" {
return n <= m ? 1 : 0
} else if ineq == "<" && eq == "!" {
return n < m ? 1 : 0
}
return 0
}
일단 돌아가긴 하는데,
조건문이 많아지면 if-else 블록이 길어지고 복잡해져서
코드 읽기가 어려워진 것 같다.
그래서 이용해본 것이 바로 스위치문이다.
case
를 통해 나타낼수 있다.case
상태 끝에 콜론 ':'
을 붙여 패턴을 종료한다.case
문이 종료되면 switch
문이 종료된다.switch
문은 모든 경우를 커버하기 위해서 마지막에 default
키워드를 사용해야 한다.default
키워드 없이도 모든 경우가 커버 되었다면, default
키워드가 없어도 된다.import Foundation
func solution(_ ineq: String, _ eq: String, _ n: Int, _ m: Int) -> Int {
// 튜플매칭
switch (ineq, eq) {
}
우선 switch
문은 ineq
와 eq
의 조합에 따라 실행할 코드를 결정하기 때문에
튜플 매칭 (ineq, eq)
형태로 두 문자열 값을 한 번에 처리해주고,
아래의 case
와 일치하는 조합을 찾는 걸로 시작하려고 한다.
func solution(_ ineq: String, _ eq: String, _ n: Int, _ m: Int) -> Int {
switch (ineq, eq) {
case (">", "="): return n >= m ? 1 : 0
case (">", "!"): return n > m ? 1 : 0
case ("<", "="): return n <= m ? 1 : 0
case ("<", "!"): return n < m ? 1 : 0
default: return 0
}
}
맨 처음 case
로 설명을 해보자면,
ineq
가 ">"이고, eq
가 "="일 때 실행이 되고,
n >= m
을 평가한다.
그렇게 조건이 참이면 1
을 반환하고, 조건이 거짓이면 0
을 반환하게 하는 것이다.
그리고 마지막엔 어떤 case
와도 일치하지 않을 경우 실행되는 default
값을 넣어줬다.
default가 필수인 경우
switch의 모든 가능한 케이스를 다루지 않을 때.
열거형(Enums)이 아닌 정수, 문자열과 같은 일반적인 값에 대해 switch를 사용할 때는 모든 가능한 경우를 나열하기 어렵다.
이 경우 default가 필수이다.
default가 불필요한 경우
switch가 열거형(Enum) 타입에 대해 사용되고, 모든 열거형의 케이스를 다룰 때.
Swift는 열거형의 모든 케이스를 처리하는지 컴파일러가 확인할 수 있으므로, 모든 케이스를 나열하면 default를 생략할 수 있다.
나는 ineq
와 eq
의 값이 문제에서 명시된 조건을 벗어나는 경우에 대비한 안전장치로 default
를 넣었다.
switch
문과 튜플을 이용해 조건을 직관적으로 정의할 수 있었고,
혹여라도 조건이 추가되거나 변경될 경우 해당 case
만 수정하면 된다. (그럴 일은 없지만 ..ㅎ)
그리고 조건별로 구분되어 있어 한눈에 이해가 되는 로직인 점도 좋다.
스위치문은 쓸 때마다 자꾸 enum이랑 사용하는게 비슷해서 헷갈린다.
둘다 case를 다뤄서 그런가.
enum
과 switch
는 환상의 케미를 자랑한다고 하는데,
추후 예시로 연습도 다시 해봐야겠다.
킵 고잉 킵 고잉~
주말에도 열정 대단해~