Algorithm/알고리즘 문제 풀이
알고리즘 (6월 5일)
유로 청년
2022. 6. 6. 00:17
1. 문제 (코딩도장, Duplicate Numbers)
https://codingdojang.com/scode/488?answer_mode=hide
코딩도장
프로그래밍 문제풀이를 통해서 코딩 실력을 수련
codingdojang.com
2. 생각
0~9까지의 문자로 된 숫자를 입력 받았을 때, 이 입력 값이 0~9까지의 숫자가 각각 한 번 씩만 사용된 것인지 확인하는 함수를 구하시오.
- sample inputs: 0123456789 01234 01234567890 6789012345 012322456789
- sample outputs: true false false true false
- 입력받은 문자열을 숫자로 형변환(Casting)한다.
- 형변환된 숫자를 자리별로 나누어 ArrayList에 추가한다.
- 0부터 9까지 담고 있는 ArrayList와 비교하며, 하나씩 하나씩 삭제한다.
- 0부터 9까지 담고 있던 ArrayList의 원소가 다 삭제가 되어 size가 0가 되면 "true"를 출력시킨다.
3. 풀이 및 코드 분석
import java.util.Scanner;
import java.util.ArrayList;
import java.util.Arrays;
public class Main {
public static void main(String[] args) {
Scanner scan = new Scanner(System.in);
ArrayList<Integer> inputNumbers = new ArrayList<>();
ArrayList<Integer> compareNumbers = new ArrayList<>(Arrays.asList(0,1,2,3,4,5,6,7,8,9));
System.out.println("0~9까지의 숫자가 각각 한 번 씩만 사용된 문자열 입력하시오: (ex, 6789012345)");
String inputData = scan.next();
if(inputData.length() != 10) {
System.out.println("False");
}else {
long numbers = Long.parseLong(inputData);
int j = 10;
while(j>0) {
inputNumbers.add((int)(numbers%10));
numbers /= 10;
j--;
}
for(int i=0; i<inputNumbers.size(); i++) {
if(compareNumbers.remove(inputNumbers.get(i)) == false) {
System.out.println("False");
}
}
if(compareNumbers.size()== 0) {
System.out.println("True");
}
}
}
}
4. 메모
- int형의 숫자(number)를 각각의 자릿수 구하는 방법
int형의 숫자(number)를 10으로 나눈 나머지를 저장하고, 10으로 나눈 몫을 다시 int형의 숫자(number)에 대입한다.
위 과정을 반복하게 되면 일의 자리, 십의 자리, 백의 자리 ···· 순으로 얻을 수 있다. - ArrayList.remove의 리턴 값
ArrayList.remove(객체) 는 삭제한 결과(true, false)를 리턴하며,
ArrayList.remove(인덱스)는 삭제된 항목 내용을 리턴한다. - NumberFormatException 에러 원인
case 1. 숫자로 변경할시 숫자형이 아닌 문자열일 경우 ( 주로 발생 )
case 2. 변경하는 자료형보다 범위가 큰경우
case 3. null 입력시
case 4. 문자 앞뒤로 공백이 있는 경우