문제 이해
이번 문제는 한수를 찾는 문제였습니다.
문제의 설명대로 한수는 각 자리가 등차수열 이루는 수이고 등차수열은 연속된 두개의 수가 일정한 수열을 말합니다.
예를 들어 753 같은 경우 각 자리를 7, 5, 3으로 보고 -2씩 일정하게 감소하고 있습니다.
그리고 여기서 -2를 공차라고 합니다.
다른 예로는 222이 있는데 이 경우는 공차가 0입니다.
이러한 수를 한수라 하고 이 한수의 개수를 찾는 문제입니다.
여기서 1~9까지는 기본적으로 비교할 숫자가 없으므로 한수로 보는듯 합니다.
거기에 더해 10~99까지도 공차는 존재하지만 비교할 대상이 없으므로 한수로 치는거 같습니다.
(문제에서 110을 입력했는데 99가 나온걸로 보아 1~99까지를 한수로 친거 같습니다.)
이 전재를 기본으로 깔고 문제를 풀어보았습니다.
package test;
import java.util.Scanner;
public class Main
{
public static void main(String[] args)
{
Scanner sc = new Scanner(System.in);
int num = sc.nextInt(); //숫자 N입력
int count = 0; //한수 개수 카운팅
for(int i = 1; i <= num; i++)
{
if(i <= 99){
count++;
}else if(i <= 1000){
String[] num_str = Integer.toString(i).split(""); //각 자리수를 저정할 문자열 배열 생성
if((Integer.parseInt(num_str[1]) - Integer.parseInt(num_str[0])) == (Integer.parseInt(num_str[2]) - Integer.parseInt(num_str[1]))){
count++;
}
}
}
System.out.println(count);
}
}
한수를 찾기 위해 1~99까지는 무조건 한수이므로 카운팅을 해줬고 100부터는 한수 조건을 만들어서 만족하면 +1을 해줬습니다.
여기서 숫자를 각 자리수로 나누기 위해서 나누기 대신 문자열로 변경하는 toString을 통해 숫자를 문자열로 바꾸고 String의 split을 통해 각 자리수의 숫자를 num_str배열에 저장하였습니다.
여기서 각 배열에 저장된 값은 문자이기에 숫자에서의 +- 연산이 불가능하기에 Integer.parseInt()메소드를 사용해서 숫자형으로 바꿔주었습니다.
그리고 한수의 조건을 다시 보면 975을 보면 7(십의 자리 수) - 9(백의 자리 수) == 5(일의 자리 수) - 7(십의 자리 수) 이런식으로 차이가 -2로 일정한 걸 알 수 있습니다.
이 식을 이용해서 배열의 두번째 자리인(십의 자리 수) num_str[1]에서 배열의 첫번재 자리인(백의 자리 수)num_str[0]을 뺀 값과 num_str[2](일의 자리 수) - num_str[1](십의 자리 수)의 값이 같으면 한수이므로 +1 카운팅을 해주었습니다.
출처 : 백준 1065번 https://www.acmicpc.net/problem/1065
'DEV > Algorithm' 카테고리의 다른 글
[백준] 10809번 : 알파벳 찾기 - JAVA [자바] (0) | 2022.05.18 |
---|---|
[백준] 11720번 : 숫자의 합 (0) | 2022.05.18 |
[백준] 8958번: OX퀴즈 풀이 (0) | 2022.05.10 |
[백준] 1546번: 평균 풀이 (0) | 2022.05.10 |
[JAVA] NoSuchElementjava.util.NoSuchElementException는 존재하지 않는 것을 가져오려고 할 때 발생합니다. (0) | 2022.05.03 |