[Java] 조건 문자열

peace w·2023년 9월 26일
0

프로그래머스

목록 보기
11/25
post-thumbnail

문제

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

  • 두 수가 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

입출력 예

  • 입출력 예 #1
    20 <= 50은 참이기 때문에 1을 return합니다.

  • 입출력 예 #2
    41 > 78은 거짓이기 때문에 0을 return합니다.

문제 풀이

  • 4가지 조건에 따라 값을 달리 출력하는 코드를 만든다.
  • ineq가 "<"와 ">"중 어떤 값인지 eq가 "="와 "!" 중 어떤 값인지 알아내야 한다.
    (값이 같은지를 비교한다.)

동등 비교 연산자 vs .equals()

맨 처음에 동등 비교 연산자 == 를 사용하여 값을 비교했는데 테스트에선 성공했으나, 제출하니 오류가 났다. 왜 그런지 찾아보니 equals를 쓰지 않아서였다.

동등 비교 연산자.equals() 가 뭐가 다른지 알아보자.

사진출처 유튜브,생활코딩 JAVA 제어문 -5.


자바에선 데이터타입을 primitive data type(원시 데이터 타입)과 non primitive data type(비 원시 데이터 타입) 으로 나눌 수 있다.
원시데이터타입에는 boolean int double short long float char 이 있다.
비 원시데이터타입에는 String Array Data type ...이 있다.
두 타입 간에는 메모리를 저장하고 처리하는 방식에 차이가 있다.


int 같은 원시데이터타입은 p1과 p2 변수가 같은 객체 1을 가리키고 있어서 두 변수가 가리키는 객체가 동일하다. 이 때 == 로 비교하면 true를 반환한다.

그러나 비 원시데이터타입은 객체의 주소 값이 다르면 같은 객체의 내용이어도 동일하다고 여기지 않기 때문에 == 로 비교하면 false를 반환한다. 비 원시데이터타입은 equals()라는 메소드를 가지고(원시데이터타입은 이 메소드를 쓸 수 없다) equals()로 비교할 경우에는 가리키는 값을 기준으로 판단한다.

비 원시데이터 중에서 String은 좀 특이하다. new 키워드를 통해 다른 String 객체를 메모리에 할당할 경우에는 o1과 o2가 가리키는 객체의 주소 값은 다르므로 동일하지 않으나, new 키워드 없이 리터럴 방식으로 같은 String인 o3과 o4를 생성하게 되면 새로 메모리 공간을 할당하지 않고 원시데이터타입처럼 기존 객체의 주소 값을 그대로 가져온다. 그래서 == 로도 비교 가능하다.

결론

String str1 = new String("abc");
String str2 = "abc";
System.out.println(str1 == str2); // false
System.out.println(str1.equals(str2)); // true

아래는 작성한 코드이다.

class Solution {
    public int solution(String ineq, String eq, int n, int m) {
        int answer = 0;
        
        if (ineq.equals(">")  && eq.equals("=")) {
           answer = (n >= m)? 1 : 0;
        } else if (ineq.equals("<") && eq.equals("=")) {
           answer = (n <= m)? 1 : 0;
        } else if (ineq.equals(">") && eq.equals("!")) {
           answer = (n > m)? 1 : 0;
        } else if (ineq.equals("<") && eq.equals("!")) {
           answer = (n < m)? 1 : 0;
        }
        
        return answer;
    }
}
profile
더 성장하자.

0개의 댓글