JAVA/코드 과제

[JAVA] 자릿수 더하기

나는나는용 2023. 2. 21. 01:35
728x90

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;
	}
}

확실히 기술적으로는 뭐 별로 쓸 말이 없어지긴 했으나, 훨ㄹㄹㄹㄹ씬 깔끔하고 간편해졌다.

728x90