https://school.programmers.co.kr/learn/courses/30/lessons/120906
프로그래머스
코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.
programmers.co.kr
1차 - 학습용으로는 좋았으나..
첫 과제였던 이 문제를 마주한 때가 막 게터 세터 클래스를 배우던 때라 그런지,
이 문제를 괜히 이것저것마구덕지덕지 해결해나갔다.
프로그래머스도 처음 써보는거라, 제약사항이며 예외 오류처리 안내문이며 쓸데없이 친절해버렸다.
- 우선메인
화면에 띄워줄 안내문을 적어보았다.
문제의 제약 조건을 다 지킨 숫자로 사용자가 올바르게 입력했는지 따져서, 올바른 범위라면 계산을 진행하기 위해 입력값을 전달해주는 세터 함수를 적었다.
package programmers.자릿수_더하기;
import java.util.*;
public class PlusEachPlaceNumber {
public static void main(String[] args) {
Number num = new Number();
while (!num.isError()) {
System.out.println("숫자를 입력하세요: ");
Scanner scanner = new Scanner(System.in);
int number = scanner.nextInt();
// 올바른 범위라면 필드로 넘겨줄 예정
num.setNumber(number);
if(num.isError()==false) {
System.out.println("결과: " + num.getResult());
}else {
break;
}
}
}
}
- 클래스 구현부
length()함수를 사용해주기 위해, 전달받은 int형 변수 number를 String으로 변환해야 한다.
정석적인 방법보다는 java만의 장점을 또 써줘야하지 않겠는가?
그래서, int형 변수에 + “” 를 해주어 형변환처리 해주었다.
그럼 이제 length()함수로 number가 몇자리 자연수인지 알 수 있게 된다.
number가 몇자리인지에 따라 더할 자릿수의 갯수가 정해지므로, 대강 형식을 말로 하자면,
“만약 number가 ~자리 숫자라면,”이 되겠다.
7가지 경우에 대해서 if문을 여러번 써주는 것은 비효율적이라고 익히 들었기 때문에 이런 경우를 위해 떡하니 마련되어있는 switch문을 사용해주었다.
일의 자릿수, 십의 자릿수, 백의 자릿수 ~~~ 를 모두 다 수식으로 쓴다면 지저분할 것 같기에 약간은 이상하지만 그냥 a,b,c,d,e라고 표현해주었다.
(마지막 7자리 숫자는 무조건 1,000,000이기 때문에 반환값을 1이라 하드코딩을 해버렸,,,)
package programmers.자릿수_더하기;
public class Number {
private int number;
private boolean error;
public int getNumber() {
return number;
}
public void setNumber(int number) {
if (number < 0 || number > 1000000) {
System.out.println("숫자 범위 오류");
error=true;
} else {
this.number = number;
}
}
public boolean isError() {
return error;
}
public int getResult() {
String numberStr=number+"";
int len=numberStr.length();
int sum=0;
int a=number%10;
int b=(number%100)/10;
int c=(number%1000)/100;
int d=(number%10000)/1000;
int e=(number%100000)/10000;
switch(len) {
case 1:
sum = number;
break;
case 2:
sum = number/10+a;
break;
case 3:
sum = number/100+b+a;
break;
case 4:
sum = number/1000+c+b+a;
break;
case 5:
sum = number/10000+d+c+b+a;
break;
case 6:
sum = number/100000+e+d+c+b+a;
break;
case 7:
sum = 1;
break;
}
return sum;
}
}
문제 해결을 위한 알고리즘은 둘째치고, 딱봐도 한 클래스 내에서 해결할 수 있는 문제를 갖다가, 두 클래스로 쪼개고~호출하고~ 아오, 너무 복잡하다.
그래서 합쳐보았다.
그리고 프로그래머스는 알아서 값을 넣어준다고 하니, 제약사항도 내가 처리할 필요가 없다고 하니, 다ㅏㅏㅏ지워보았다.
2차-최종
package programmers.자릿수_더하기.sol;
public class test {
public static void main(String[] args) {
test num = new test();
int number = 1234;
System.out.println(num.solution(number));
}
public int solution(int number) {
String numberStr = number + "";
int len = numberStr.length();
int sum = 0;
int a = number % 10;
int b = (number % 100) / 10;
int c = (number % 1000) / 100;
int d = (number % 10000) / 1000;
int e = (number % 100000) / 10000;
switch (len) {
case 1:
sum = number;
break;
case 2:
sum = number / 10 + a;
break;
case 3:
sum = number / 100 + b + a;
break;
case 4:
sum = number / 1000 + c + b + a;
break;
case 5:
sum = number / 10000 + d + c + b + a;
break;
case 6:
sum = number / 100000 + e + d + c + b + a;
break;
case 7:
sum = 1;
break;
}
return sum;
}
}
확실히 기술적으로는 뭐 별로 쓸 말이 없어지긴 했으나, 훨ㄹㄹㄹㄹ씬 깔끔하고 간편해졌다.
'JAVA > 코드 과제' 카테고리의 다른 글
[JAVA] 스타트와 링크 (백준 14889번) (0) | 2023.04.01 |
---|---|
[JAVA] OX퀴즈( ' 문자열 수식 배열 '의 참/거짓 결과 반환하기) (2) | 2023.03.05 |
[JAVA] 유한소수 판별하기 (0) | 2023.02.22 |
[JAVA] 배열의 유사도 (0) | 2023.02.22 |
[JAVA] 최빈값 구하기 (0) | 2023.02.20 |