티스토리 뷰


keyword : 등차수열
difficulty : 실버4
completion : ✅
notice :


한수

📝 문제

어떤 양의 정수 X의 각 자리가 등차수열을 이룬다면, 그 수를 한수라고 한다. 등차수열은 연속된 두 개의 수의 차이가 일정한 수열을 말한다. N이 주어졌을 때, 1보다 크거나 같고, N보다 작거나 같은 한수의 개수를 출력하는 프로그램을 작성하시오.

입력

첫째 줄에 1,000보다 작거나 같은 자연수 N이 주어진다.

출력

첫째 줄에 1보다 크거나 같고, N보다 작거나 같은 한수의 개수를 출력한다.

예제 입력 1

110

예제 출력 1

99

예제 입력 2

1

예제 출력 2

1

예제 입력 3

210

예제 출력 3

105

예제 입력 4

1000

예제 출력 4

144

예제 입력 5

500

예제 출력 5

119


🔍 정답

import java.io.BufferedReader;  
import java.io.IOException;  
import java.io.InputStreamReader;  

public class Main {  

    public static void main(String[] args) throws IOException {  

        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));  
        int N = Integer.parseInt(br.readLine());  

        int cnt = 0;  
        for (int i = 1; i <= N; i++) {  
            if (cd(i)) {  
                cnt++;  
            }  
        }  
        System.out.println(cnt);  
    }  

    public static boolean cd(int i) {  
        char[] ch = Integer.toString(i).toCharArray();  

        if (ch.length == 1 || ch.length == 2) return true;  

        int diff = ch[0] - ch[1];  
        if (ch[1] - ch[2] == diff) return true;  
        else return false;  
    }  
}

<처음에 네자릿수까지 생각해서 짰던 boolean cd 메서드>

    public static boolean cd(int i) {
        char[] ch = Integer.toString(i).toCharArray();

        if (ch.length == 1 || ch.length == 2) return true;

        int diff = ch[0] - ch[1];
        int idx = 1;
        while (true) {
            if (ch[idx] - ch[idx+1] == diff) {
                idx++;
            } else {
                return false;
            }
            return true;
        }
    }
}
  • 문제가 헷갈린다면 아래를 참고!
    1: 1하나 뿐이니까 등차수열
    2: 같은경우
    3: 같은경우
    ....
    10: 길이가 2고 각항이 1 0 인 수열. 공차가 -1인 등차수열. 체크
    1. 길이가 2이고 각항이 1 1 인 수열. 공차가 0인 등차수열.체크
      ...
      100: 길이가 3이고 각항이 1 0 0 인 수열. 등차수열이 아님
      101:길이가 3이고 각항이 1 0 1 인 수열. 등차수열 아님
      ...
      123: 길이가 3이고 각항이 1 2 3 인 수열. 공차가 1인 등차수열. 체크
  • 1부터 N까지의 숫자를 한 번씩 넣어서 등차수열이면 true를 반환하고 카운팅을 하고 아니면 false를 반환!
  • boolean cd 메서드는 int를 받아서 char 배열에 넣어주고
  • 한자릿수(초항만 있는 상태)와 두자릿수는 무조건 한수이므로 char배열의 길이 1과 2면 무조건 true를 리턴!
  • 확인할 것은 세자릿수부터 1000까지인데,
  • diff라는 변수에 0번 인덱스와 1번 인덱스의 차이를 넣어주고
  • 1번 인덱스와 2번 인덱스의 차이가 그것과 같다면 등차수열로 보고 아니면 등차수열이 아닌 것임
  • 처음에 조건이 1000까지라는 것을 잊고 네자릿수 이상일 경우까지 생각해서 while문으로 인덱스 비교하는 코드를 짰었으나 정답을 제출하고나서 다른 풀이를 보고 1000까지라는 것을 깨달았고,
  • 1000은 1번 인덱스와 2번 인덱스가 diff와 다르므로 바로 false로 반환 되기 때문에 세자릿수인 999까지만 확인하면 되었다.
반응형
댓글
반응형
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
«   2024/09   »
1 2 3 4 5 6 7
8 9 10 11 12 13 14
15 16 17 18 19 20 21
22 23 24 25 26 27 28
29 30
글 보관함