[백준] 1065번: 한수
1065번: 한수
어떤 양의 정수 X의 각 자리가 등차수열을 이룬다면, 그 수를 한수라고 한다. 등차수열은 연속된 두 개의 수의 차이가 일정한 수열을 말한다. N이 주어졌을 때, 1보다 크거나 같고, N보다 작거나
www.acmicpc.net
내가 알고리즘을 좋아하지 않는 이유는 단순 논리 말고도 수학적 개념이 자주 나오기 때문인데... 이 나이가 되니 학생 때보다 수학 이해 속도가 좀 느려진 거 같다 허 허 허 (는 아직 20대 초반)
Java 풀이
우선 양의 정수인 일의 자리 수와 십의 자리 수는 무조건 한수이다. 입력받는 숫자는 1000보다 작거나 같은 수라고 하였으니 백의 자리 수만 신경 쓰면 된다. (1000은 어차피 한수가 아니다)
1~9 사이의 일의 자리 숫자인 경우는 연속된 수가 아니다. 따라서 일의 자리 수는 기본적으로 한수이다. 등차수열을 이룰 수 없는 수이기 때문이다.
10 ~ 99 십의 자리 수는 각 자릿수의 등차가 1개밖에 존재하지 않는다. 26인 경우 2와 6의 등차인 4가 존재하고, 98인 경우 9와 8의 등차인 -1이 존재하는 것이다. 등차를 비교할 수 없으므로 십의 자리 수도 모두 한수이다.
따라서 백의 자리 수인 세 자리 숫자만 한수인지 아닌지 판명하면 된다.
import java.io.*;
public class Main {
public static void main(String[] args) throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(System.out));
int x = Integer.parseInt(br.readLine());
x = x == 1000 ? 999 : x;
int cnt = x >= 100 ? 99 : x;
for (int i = 101; i <= x; ++i) {
if (((i / 100) - (i / 10 % 10)) == ((i / 10 % 10) - (i % 10))) {
++cnt;
}
}
bw.write(cnt + "");
br.close();
bw.flush();
bw.close();
}
}
우선 입력 값 x가 1000인 경우, x가 999인 경우와 결과가 같으므로(1000은 한수가 아니므로) x에 1000 대신 999를 대입해주었다.
그리고 x가 100보다 같거나 큰지, 아닌지를 판별하여 100보다 크거나 같으면 cnt 변수에 99를 먼저 대입해준다.
100보다 작은 경우는 x 값 자체가 x보다 작은 한수의 개수가 되므로 cnt 변수에 x를 대입한다.
for 문에서는 100보다 큰 수인 x 값보다 같거나 작은 한수의 개수를 구한다.
이때 100보다 작은 수는 모두 한수이고, 100은 한수가 아니므로 i 값은 101부터 시작하게 했다.
한수를 구하기 위해서는 연속된 두 수의 차이가 같은지를 판별해야 한다.
백의 자리 값은 (x / 100)으로 구하고, 십의 자리 값은 ((x / 10) % 10)으로 구하며, 일의 자리 값은 (x % 10)으로 구할 수 있다. 따라서 (백의 자리 수 - 십의 자리 수)가 (십의 자리 수 - 일의 자리 수)와 같은지 비교하여, 같다면 한수이니 cnt 값을 +1 해준다.
Python 3 풀이
x = int(input())
print(sum(((i // 100) - (i // 10 % 10)) == ((i // 10 % 10) - (i % 10)) or i < 100 for i in range(1, x + 1)))
((i // 100) - (i // 10 % 10)) == ((i // 10 % 10) - (1 % 10)) 부분은 자바 코드와 동일하다.
i < 100도 앞서 작성하였던 99보다 작거나 같은 경우는 모두 한수이므로 이 부분을 작성해준 것이다.
sum() 함수 인자를 list로 뽑아보고 결과 값을 확인하면 다음과 같다. 이때 x 값은 110으로 하였다.
list(((i // 100) - (i // 10 % 10)) == ((i // 10 % 10) - (i % 10)) or i < 100 for i in range(1, x + 1))
[True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, False, False, False, False, False, False, False, False, False, False, False]
여기서 True의 개수를 세어보면 99개가 나온다. (count(Ture)를 사용하여 True 값 개수를 구할 수 있다.)
파이썬에서 True 값은 int타입에서의 1과 같다(보통 1은 True, 1이 아닌 나머지 값은 False로 계산하니).
따라서 sum() 함수를 사용하여 한수의 개수를 구할 수 있는 것이다.
[백준] 1065번: 한수
1065번: 한수
어떤 양의 정수 X의 각 자리가 등차수열을 이룬다면, 그 수를 한수라고 한다. 등차수열은 연속된 두 개의 수의 차이가 일정한 수열을 말한다. N이 주어졌을 때, 1보다 크거나 같고, N보다 작거나
www.acmicpc.net
내가 알고리즘을 좋아하지 않는 이유는 단순 논리 말고도 수학적 개념이 자주 나오기 때문인데... 이 나이가 되니 학생 때보다 수학 이해 속도가 좀 느려진 거 같다 허 허 허 (는 아직 20대 초반)
Java 풀이
우선 양의 정수인 일의 자리 수와 십의 자리 수는 무조건 한수이다. 입력받는 숫자는 1000보다 작거나 같은 수라고 하였으니 백의 자리 수만 신경 쓰면 된다. (1000은 어차피 한수가 아니다)
1~9 사이의 일의 자리 숫자인 경우는 연속된 수가 아니다. 따라서 일의 자리 수는 기본적으로 한수이다. 등차수열을 이룰 수 없는 수이기 때문이다.
10 ~ 99 십의 자리 수는 각 자릿수의 등차가 1개밖에 존재하지 않는다. 26인 경우 2와 6의 등차인 4가 존재하고, 98인 경우 9와 8의 등차인 -1이 존재하는 것이다. 등차를 비교할 수 없으므로 십의 자리 수도 모두 한수이다.
따라서 백의 자리 수인 세 자리 숫자만 한수인지 아닌지 판명하면 된다.
import java.io.*;
public class Main {
public static void main(String[] args) throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(System.out));
int x = Integer.parseInt(br.readLine());
x = x == 1000 ? 999 : x;
int cnt = x >= 100 ? 99 : x;
for (int i = 101; i <= x; ++i) {
if (((i / 100) - (i / 10 % 10)) == ((i / 10 % 10) - (i % 10))) {
++cnt;
}
}
bw.write(cnt + "");
br.close();
bw.flush();
bw.close();
}
}
우선 입력 값 x가 1000인 경우, x가 999인 경우와 결과가 같으므로(1000은 한수가 아니므로) x에 1000 대신 999를 대입해주었다.
그리고 x가 100보다 같거나 큰지, 아닌지를 판별하여 100보다 크거나 같으면 cnt 변수에 99를 먼저 대입해준다.
100보다 작은 경우는 x 값 자체가 x보다 작은 한수의 개수가 되므로 cnt 변수에 x를 대입한다.
for 문에서는 100보다 큰 수인 x 값보다 같거나 작은 한수의 개수를 구한다.
이때 100보다 작은 수는 모두 한수이고, 100은 한수가 아니므로 i 값은 101부터 시작하게 했다.
한수를 구하기 위해서는 연속된 두 수의 차이가 같은지를 판별해야 한다.
백의 자리 값은 (x / 100)으로 구하고, 십의 자리 값은 ((x / 10) % 10)으로 구하며, 일의 자리 값은 (x % 10)으로 구할 수 있다. 따라서 (백의 자리 수 - 십의 자리 수)가 (십의 자리 수 - 일의 자리 수)와 같은지 비교하여, 같다면 한수이니 cnt 값을 +1 해준다.
Python 3 풀이
x = int(input())
print(sum(((i // 100) - (i // 10 % 10)) == ((i // 10 % 10) - (i % 10)) or i < 100 for i in range(1, x + 1)))
((i // 100) - (i // 10 % 10)) == ((i // 10 % 10) - (1 % 10)) 부분은 자바 코드와 동일하다.
i < 100도 앞서 작성하였던 99보다 작거나 같은 경우는 모두 한수이므로 이 부분을 작성해준 것이다.
sum() 함수 인자를 list로 뽑아보고 결과 값을 확인하면 다음과 같다. 이때 x 값은 110으로 하였다.
list(((i // 100) - (i // 10 % 10)) == ((i // 10 % 10) - (i % 10)) or i < 100 for i in range(1, x + 1))
[True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, False, False, False, False, False, False, False, False, False, False, False]
여기서 True의 개수를 세어보면 99개가 나온다. (count(Ture)를 사용하여 True 값 개수를 구할 수 있다.)
파이썬에서 True 값은 int타입에서의 1과 같다(보통 1은 True, 1이 아닌 나머지 값은 False로 계산하니).
따라서 sum() 함수를 사용하여 한수의 개수를 구할 수 있는 것이다.