CODING/스파르타 내일배움캠프 TIL

17_정수 제곱근 판별_개인 과제 진행 Lv3 도전_25.1.6(월)

codingTrip 2025. 1. 6. 21:24

코트카타

19) 정수 제곱근 판별

나의 풀이

class Solution {
    public long solution(long n) {
        long answer = 0;
        long x = (long)Math.sqrt(n);
        answer = (n==Math.pow(x,2))?(long)Math.pow((x+1),2):-1;
        return answer;
    }
}

 

매번 if문을 사용하는 것 같아, 이번에는 삼항 연산자를 사용해보았다.

만약 x가 n의 제곱근이 아니라면 타입을 double아닌 소수점이 없는 long타입으로 했을 때 값 손실이 발생할 것이다.

나는 이를 이용하고자 했다.

 

형변환을 잘 해야 하는 중요성에 대해 깨닫는 요즘이다.

 

다른 분들의 풀이

class Solution {
  public long solution(long n) {
      if (Math.pow((int)Math.sqrt(n), 2) == n) {
            return (long) Math.pow(Math.sqrt(n) + 1, 2);
        }

        return -1;
  }
}

출처:https://school.programmers.co.kr/learn/courses/30/lessons/12934/solution_groups?language=java

 

int로 형변환을 하셨다.


개인 과제 진행

Lv3  트러블슈팅

Enum 타입

강의에서는 해당 타입에 대해 제대로 배우지 못한 것 같다.

그래서 이에 대해 공부하는 것부터 시작해야 해야 한다.

public enum OperatorType {+,-,*,/} //error
public enum OperatorType {PLUS,MINUS,MULTIPLY,DIVIDE}

위와 같이 상수의 형태로 지정해주는 것을 알 수 있다.

출처 : https://inpa.tistory.com/entry/JAVA-%E2%98%95-%EC%97%B4%EA%B1%B0%ED%98%95Enum-%ED%83%80%EC%9E%85-%EB%AC%B8%EB%B2%95-%ED%99%9C%EC%9A%A9-%EC%A0%95%EB%A6%AC

 

ArithmeticCalculator 클래스에서 어떻게 불러올지도 고민이었다.

그래서 튜터님께 문의를 드렸다.

튜터님께서는 calculate 메서드 안에서 enum으로 변환하는 코드를 쓰면 좋겠다고 하셨다.

그래서 연산자(operator)를 String 타입으로 변환하고

valueOf() : 매개변수로 주어진 String(operator)과 열거형에서 일치하는 이름을 갖는 원소를 반환했다.

    public int calculate(int num1, int num2, char operator) {

        OperatorType op = OperatorType.valueOf(Character.toString(operator));

        switch (op) {
            case PLUS:
                result = num1+num2;
                break;
            case MINUS:
                result = num1 - num2;
                break;
            case MULTIPLY:
                result = num1 * num2;
                break;
            case DIVIDE:
                if (num2 == 0) {
                    System.out.println("나눗셈 연산에서 분모(두번째 정수)에 0이 입력될 수 없습니다.");
                    break;
                }
                result = num1 / num2;
                break;
            default:
                System.out.println("잘못된 연산자입니다. 다시 입력해주세요.");
                break;
        }

 

그랬더니 아래와 같은 예외사항이 발생했다.

Exception in thread "main" java.lang.IllegalArgumentException: No enum constant com.example.calculator3.OperatorType.- at java.base/java.lang.Enum.valueOf(Enum.java:273) at com.example.calculator3.OperatorType.valueOf(OperatorType.java:3) at com.example.calculator3.ArithmeticCalculator.calculate(ArithmeticCalculator.java:74) at com.example.calculator3.App.main(App.java:26)

주어진 String과 일치하는 원소가 없는 경우 IllegalArgumentException 예외 발생한다고 한다.

예를 들어 operator는 +이고, enum은 PLUS 등이 있다.

+와 일치하는 이름을 갖는 원소는 열거형에 없으므로 문제가 발생한 것으로 보인다.

 

그래서 아래와 같이 수정했다.

// 매개변수가 null이 아니고 enum의 값이 매개변수와 같으면 enum의 값을 리턴하라
    public static OperatorType findByVal(String val) {
        for (OperatorType v : values()) {
            if (val != null && val.equals(v.value)) {
                    return v;
            }
        }
        return null;
    }

enum의 값을 각각 가져오고

그 값이 매개변수와 같을 경우에 반환해주는 것으로 바꾸었다.

출처:https://carpet-part1.tistory.com/786

 

따라서 오늘까지 구현한 OperatorType Enum의 최종 코드는 아래와 같다.

package com.example.calculator3;

public enum OperatorType {
    PLUS("+"), MINUS("-"), MULTIPLY("*"),DIVIDE("/");

    //값을 저장할 필드(인스턴스 변수)를 추가
    private final String value;
    // 생성자를 추가
    OperatorType(String value){this.value = value; }

    public String getValue(){return value;}

    public static OperatorType findByVal(String val) {
        for (OperatorType op : values()) {
            if (val != null) {
                if (val.equals(op.value)) {
                    return op;
                }
            }
        }
        return null;
    }
}

 

 

 

참고

Git 커밋 메시지 컨벤션 - https://velog.io/@shin6403/Git-git-커밋-컨벤션-설정하기

  • feat: 새로운 기능 추가
  • fix: 버그 수정
  • docs: 문서 관련 변경 (주석 포함)
  • style: 코드 포맷팅, 세미콜론 추가 등 기능에 영향을 미치지 않는 변경
  • refactor: 코드 리팩토링 (기능 변경 없음)
  • test: 테스트 추가 또는 수정
  • chore: 빌드 과정 또는 도구 관련 설정 변경

git commit -m Feat: "Lv3 과제 Enum 타입을 활용하여 연산자 타입에 대한 정보를 관리📰”

처음 써보는 것이라 위처럼 쓰게 되어 오류가 발생했다.

 

git commit -m “Feat: Enum 타입을 활용하여 연산자 타입에 대한 정보를 관리 기능 구현📝"

이렇게 최대한 이모지와 함께 쓰는 습관을 들여야겠다.