코트카타
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}
위와 같이 상수의 형태로 지정해주는 것을 알 수 있다.
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 타입을 활용하여 연산자 타입에 대한 정보를 관리 기능 구현📝"
이렇게 최대한 이모지와 함께 쓰는 습관을 들여야겠다.
'CODING > 스파르타 내일배움캠프 TIL' 카테고리의 다른 글
19_하샤드 수_개인 과제 진행 Lv3 도전_25.1.8(수) (0) | 2025.01.08 |
---|---|
18_정수 내림차순으로 배치하기_개인 과제 진행 Lv3 도전_25.1.7(화) (0) | 2025.01.07 |
16_코트카타 문자열을 정수로 바꾸기_개인 과제 진행_25.1.3(금) (2) | 2025.01.03 |
15_코트카타_Java 문법 종합반_25.1.2(목) (2) | 2025.01.02 |
14_코트카타_Java 문법 종합반 1,2,3주차_24.12.31(화) (1) | 2024.12.31 |