반응형
문제(출처)
어떤 양의 정수 X의 자리수가 등차수열을 이룬다면, 그 수를 한수라고 한다. 등차수열은 연속된 두 개의 수의 차이가 일정한 수열을 말한다.
N이 주어졌을 때, 1보다 크거나 같고, N보다 작거나 같은 한수의 개수를 출력하는 프로그램을 작성하시오.
입력
첫째 줄에 1,000보다 작거나 같은 자연수 N이 주어진다.
출력
첫째 줄에 1보다 크거나 같고, N보다 작거나 같은 한수의 개수를 출력한다.
예제 입력
110
예제 출력
99
내 풀이
import java.io.BufferedReader;import java.io.BufferedWriter;import java.io.IOException;import java.io.InputStreamReader;import java.io.OutputStreamWriter;
/* * 1. N을 입력 받는다. * 2. 1~N까지 등차 수열인지 각각 확인한다. * 3. 123이 입력되었다면 1 -> 2 -> 3 공차는 1인 등차 수열이다. * 123이 입력 되었다는 가정으로 의사 코드를 작성한다. * 4. 100, 10, 1의 자리를 구분 하는 방법 * 4-1 int 배열과 String.charAt(i)으로 각각 한 문자씩 저장한다. * 4-2 10 나누기 10 나머지를 이용하여 자리수를 1의 자리수로 저장한다. * 5. 1과 2, 2와 3을 빼주어 등차 수열인지 확인한다. * 1-2 = -1, 3-2 = -1 * 6. 뺀 값이 동일하다면 등차 수열이 맞으므로 카운트한다. */
public class Main { public static void main(String args[]) { BufferedReader br = new BufferedReader(new InputStreamReader(System.in)); BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(System.out));
try { int inputNum = Integer.parseInt(br.readLine());// 1부터 N까지 반복 할 수를 입력 받습니다. int count = 0;// 등차 수열 형태의 '한수'의 개수를 세어보기 위한 변수입니다. for(int i = 1; i <= inputNum; i++) {// 1부터 inputNum까지 반복하여 함수를 호출합니다. count += arrayCheck(i);// 1과 0을 입력 받아 count에 누적하여 저장합니다. } bw.write(String.valueOf(count)); bw.flush(); bw.close(); } catch (NumberFormatException e) { // TODO Auto-generated catch block e.printStackTrace(); } catch (IOException e) { // TODO Auto-generated catch block e.printStackTrace(); }
}
private static int arrayCheck(int calcNum) {// System.out.println("-----------start----------------");// System.out.println("입력 받은 수 : " + calcNum); String strNum = String.valueOf(calcNum);// 입력 받은 수를 문자화합니다. int[] numList = new int[strNum.length()-1];// System.out.println("각 항의 길이 : " + strNum.length());// int형 배열을 N-1 크기 만큼 선업합니다.
// 123이면 길이가 3이고 1-2, 2-3 두번 연산 해야 하기에 크기가 3이 아닌 2를 배열을 선언합니다.
int temp = strNum.charAt(0)-48;// 가장 첫번 째 자리를 temp에 저장합니다. for(int i = 1; i < strNum.length(); i++) {// 0이 아닌 1부터 N보다 작을 때까지 반복합니다. numList[i-1] = temp - (strNum.charAt(i) - 48);// temp와 strNum의 i자리의 숫자를 빼고 int형 배열에 저장합니다.// System.out.println("앞 뒤 숫자를 뺀 값 : " + numList[i-1]); temp = strNum.charAt(i)-48;// 방금 연산한 strNum의 i자리를 temp에 저장하고 이를 반복합니다. } boolean check = true;// int형 배열의 값이 같은지 여부를 판단하는 변수입니다. for(int i = 1; i < numList.length; i++) {// 1부터 N-1보다 작을 때까지 반복합니다. if(numList[i-1] == numList[i]) {// i-1과 i의 숫자를 비교하고 같으면 넘어가고 하나라도 다르면 false를 저장합니다.
// System.out.println("같아요"); }else {// System.out.println("달라요"); check = false; } } // System.out.println("-------------end--------------");// 같으면 1을 반환하고 다르면 0을 반환합니다. if(check) { return 1; }else { return 0; } }}
import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.OutputStreamWriter;
/*
* 1. N을 입력 받는다.
* 2. 1~N까지 등차 수열인지 각각 확인한다.
* 3. 123이 입력되었다면 1 -> 2 -> 3 공차는 1인 등차 수열이다.
* 123이 입력 되었다는 가정으로 의사 코드를 작성한다.
* 4. 100, 10, 1의 자리를 구분 하는 방법
* 4-1 int 배열과 String.charAt(i)으로 각각 한 문자씩 저장한다.
* 4-2 10 나누기 10 나머지를 이용하여 자리수를 1의 자리수로 저장한다.
* 5. 1과 2, 2와 3을 빼주어 등차 수열인지 확인한다.
* 1-2 = -1, 3-2 = -1
* 6. 뺀 값이 동일하다면 등차 수열이 맞으므로 카운트한다.
*/
public class Main {
public static void main(String args[]) {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(System.out));
try {
int inputNum = Integer.parseInt(br.readLine());
// 1부터 N까지 반복 할 수를 입력 받습니다.
int count = 0;
// 등차 수열 형태의 '한수'의 개수를 세어보기 위한 변수입니다.
for(int i = 1; i <= inputNum; i++) {
// 1부터 inputNum까지 반복하여 함수를 호출합니다.
count += arrayCheck(i);
// 1과 0을 입력 받아 count에 누적하여 저장합니다.
}
bw.write(String.valueOf(count));
bw.flush();
bw.close();
} catch (NumberFormatException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
private static int arrayCheck(int calcNum) {
// System.out.println("-----------start----------------");
// System.out.println("입력 받은 수 : " + calcNum);
String strNum = String.valueOf(calcNum);
// 입력 받은 수를 문자화합니다.
int[] numList = new int[strNum.length()-1];
// System.out.println("각 항의 길이 : " + strNum.length());
// int형 배열을 N-1 크기 만큼 선업합니다.
// 123이면 길이가 3이고 1-2, 2-3 두번 연산 해야 하기에 크기가 3이 아닌 2를 배열을 선언합니다.
int temp = strNum.charAt(0)-48;
// 가장 첫번 째 자리를 temp에 저장합니다.
for(int i = 1; i < strNum.length(); i++) {
// 0이 아닌 1부터 N보다 작을 때까지 반복합니다.
numList[i-1] = temp - (strNum.charAt(i) - 48);
// temp와 strNum의 i자리의 숫자를 빼고 int형 배열에 저장합니다.
// System.out.println("앞 뒤 숫자를 뺀 값 : " + numList[i-1]);
temp = strNum.charAt(i)-48;
// 방금 연산한 strNum의 i자리를 temp에 저장하고 이를 반복합니다.
}
boolean check = true;
// int형 배열의 값이 같은지 여부를 판단하는 변수입니다.
for(int i = 1; i < numList.length; i++) {
// 1부터 N-1보다 작을 때까지 반복합니다.
if(numList[i-1] == numList[i]) {
// i-1과 i의 숫자를 비교하고 같으면 넘어가고 하나라도 다르면 false를 저장합니다.
// System.out.println("같아요");
}else {
// System.out.println("달라요");
check = false;
}
}
// System.out.println("-------------end--------------");
// 같으면 1을 반환하고 다르면 0을 반환합니다.
if(check) {
return 1;
}else {
return 0;
}
}
}
내 풀이 해석
입력 받은 N까지 '한수'의 개수를 구하는 문제입니다.
예를 들어 110을 입력 받았으면 1부터 110까지 1씩증분하여 등차수열 형태를 가지는 숫자의 개수를 세는것입니다.
1의 경우 등차수열이고
10의 경우 1과 0으로 따로 봅니다. 1에서 0으로 가려면 -1 공차가 있으므로 등차수열입니다.
123의 경우 1과 2와 3을 따로 봅니다. 1에서 2로 가려면 1의 공차가 2에서 3으로 가려면 1의 공차가 있고 각 공차가 같으므로 등차 수열입니다.
110의 경우 1과 1과 0을 따로 봅니다. 1에서 1로 가려면 0의 공차가 1에서 0으로 가려면 -1의 공차가 있고 각 공차가 같지 않으므로 등차 수열이 아닙니다.
등차 수열인 숫자의 개수를 세어 출력합니다.
아쉬운 점
두 가지가 있습니다.(120분)
첫 번째, 문제를 이해 하지 못했습니다. 아무리 읽어도 등차수열을 구하라는건데 무슨말인지 이해가 되지 않았습니다.
두 번째, 문제를 이해 하지 못하니 중구난방 코드가 되었고 입력 한 값만 등차수열인지 여부를 확인하려고 했습니다.
손으로 써보았지만 해결이 되지 않아 디버그하면서 문제를 풀었습니다.
기타 참고
반응형
'개발(합니다) > 알고리즘&코테' 카테고리의 다른 글
알고리즘 단계별로 풀어보기 : BOJ-1152(단어의개수) (0) | 2018.12.20 |
---|---|
알고리즘 단계별로 풀어보기 : BOJ-2448(별찍기 [11]) (0) | 2018.12.19 |
알고리즘 단계별로 풀어보기 : BOJ-4673(셀프넘버) (0) | 2018.12.17 |
알고리즘 단계별로 풀어보기 : BOJ-1110(더하기싸이클) (0) | 2018.12.16 |
알고리즘 단계별로 풀어보기 : BOJ-4344(평균은넘겠지) (0) | 2018.12.16 |