코딩테스트 - 프로그래머스/Lv. 0

[19] JAVA 조건 문자열

유혁스쿨 2023. 11. 15. 16:03
728x90
반응형

문제설명

문자열에 따라 다음과 같이 두 수의 크기를 비교하려고 합니다.

  • 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
    1. T : 첫번째 매개변수 타입
    2. U : 두번째 매개변수 타입.
    3. R : 반환 타입
  • 추상메소드
    1. andThen(Function<? super R, ? extends V> after)
    2. 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에 맞춰 반환된다.

 

따라서 처음 작성한 코드 예제의 풀이는 다음과 같다.

  1.  Map<String, BinaryFunction<Integer, Integer, Boolean>> 타입 객체 function으로부터 get(String key)을 호출하여 매핑되는 람다식을 BinaryFunction< Integer, Integer, Boolean >  타입으로 반환받는다.
  2. 해당 객체로 부터 apply(Integer a, Integer b) 함수를 호출함으로써 람다식이 호출되고 boolean 타입 결과값을 리턴받는다.
  3. 마지막으로 리턴 받은 boolean값을 통해 적절한 값으로 반환해준다.
728x90
반응형