문제설명
문자열에 따라 다음과 같이 두 수의 크기를 비교하려고 합니다.
- 1두 수가 n과 m이라면
- ">", "=": n >= m
- "<", "=": n <= m
- ">", "!": n > m
- "<", "!": n < m
두 문자열 ineq와 eq가 주어집니다.ineq는 "<"와 ">"중 하나고, eq는 "=" 와 "!" 중 하나입니다.그리고 두 정수 n과 m이 주어질 때, n과 m이 ineq와 eq의 조건에 맞으면 1을 아니면 0을 return하도록 solution 함수를 완성해 주세요.
제한사항
- 1 <=n, m <= 100
입/출력 예
ineq | eq | n | m | result |
"<" | "=" | 20 | 50 | 1 |
">" | "!" | 41 | 78 | 0 |
입/출력 예 #1
- 20 <= 50 은 참이기 때문에 1을 return합니다.
입/출력 예 #2
- 41 > 78 은 거짓이기 때문에 0을 return합니다.
[제출 답안]
class Solution {
public int solution(String ineq, String eq, int n, int m) {
int answer = 0;
String inequal = ineq + eq;
if (n >= 1 && n <= 100 && m >= 1 && m <= 100) {
switch (inequal) {
case ">=" :
answer = n >= m ? 1 : 0;
break;
case "<=" :
answer = n <= m ? 1 : 0;
break;
case ">!" :
answer = n > m ? 1 : 0;
break;
case "<!" :
answer = n < m ? 1 : 0;
}
}
return answer;
}
}
[풀이과정]
위와 같이 문자열을 합산한 뒤 switch case문을 활용하여 연산식을 적용하였다.
[다른 풀이]
class Solution {
public int solution(String ineq, String eq, int n, int m) {
Map<String, BiFunction<Integer, Integer, Boolean>> functions =
Map.of(
">=", (a,b) -> a >= b),
"<=", (a,b) -> a <= b),
">!", (a,b) -> a > b),
"<!", (a,b) -> a < b),
);
return functions.get(ineq + eq).apply(n,m) ? 1:0;
}
}
Map.of() 함수는 자바 9버전부터 추가되었다.
unmodifiable map 즉 수정할 수 없는 Map을 리턴한다.
위 코드와 같이 Key에는 문자열, Value에는 람다식 함수를 각각 지정한다.
이때 value의 반환타입은 BiFunction<Integer, Integer, Boolean>이다.
BiFunction<T, U, V>
BiFunction<T, U, V> 인터페이스는 Java의 함수형 프로그래밍을 구현하기 위해 java 8 버전부터 도입된 함수형 인터페이스로 두 개의 매개변수를 전달받아 특정 작업을 (람다식) 수행 후 새로운 값을 반환하는 경우 사용된다.
- Generic
- T : 첫번째 매개변수 타입
- U : 두번째 매개변수 타입.
- R : 반환 타입
- 추상메소드
- andThen(Function<? super R, ? extends V> after)
- apply(T t, U u)
public interface BiFunction<T, U, R> {
R apply(T t, U u);
default <V> BiFunction<T, U, V> andThen(Function<? super R, ? extends V> after) {
Objects.requireNonNull(after);
return (T t, U u) -> after.apply(apply(t, u));
}
}
BiFunction<Integer, Integer, Integer> biFunctionMultiple = (num1, num2) -> num1 * num2;
Integer result = biFunctionMultiple.apply(1,3); //result = 1 * 3 = 3
위와같이 람다식을 사용하여 andThen() 추상메소드를 구현하고 apply(T t, U u) 함수를 활용하여 적절한 매개변수를 적용하면 람다식을 통해 구현된 andThen() 추상메소드가 실행된 뒤 반환타입 V에 맞춰 반환된다.
따라서 처음 작성한 코드 예제의 풀이는 다음과 같다.
- Map<String, BinaryFunction<Integer, Integer, Boolean>> 타입 객체 function으로부터 get(String key)을 호출하여 매핑되는 람다식을 BinaryFunction< Integer, Integer, Boolean > 타입으로 반환받는다.
- 해당 객체로 부터 apply(Integer a, Integer b) 함수를 호출함으로써 람다식이 호출되고 boolean 타입 결과값을 리턴받는다.
- 마지막으로 리턴 받은 boolean값을 통해 적절한 값으로 반환해준다.
'코딩테스트 - 프로그래머스 > Lv. 0' 카테고리의 다른 글
[21] JAVA 두 수의 차 (0) | 2023.11.15 |
---|---|
[20] JAVA flag에 따라 다른 값 반환하기 (0) | 2023.11.15 |
[18] JAVA 홀짝에 따라 다른 값 반환하기 (0) | 2023.11.15 |
[17] JAVA 공배수 (0) | 2023.11.15 |
[16] JAVA n의 배수 (0) | 2023.11.15 |