알파벳 소문자, 대문자, 숫자 0-9중 하나가 주어졌을 때, 주어진 글자의 아스키 코드값을 출력하는 프로그램을 작성하시오.
2. 코드
import java.util.Scanner;
public class Main{
public static void main(String[] args){
Scanner sc = new Scanner(System.in);
char c = sc.next().charAt(0);
System.out.println((int)c);
sc.close();
}
}
3. 풀이
char형으로 입력받아서 int형으로 출력하기!
JAVA는 char형으로 바로 입력받을 수 없다는 것이 문제!
sc.next()는 문자열 입력이기 때문에 charAt이라는 메소드를 사용해야 한다
charAt(0)은 문자열의 첫번째 원소를 뜻하므로 문자 하나만 저장할 수 있게 된다. 만약에 next()만 사용하면, 문자를 하나 입력했다하더라도 null값과 함께 저장이 되기 때문에 "문자열"에 저장하라는 에러 메시지가 뜨게 된다.
어떤 양의 정수 X의 각 자리가 등차수열을 이룬다면, 그 수를 한수라고 한다. 등차수열은 연속된 두 개의 수의 차이가 일정한 수열을 말한다. N이 주어졌을 때, 1보다 크거나 같고, N보다 작거나 같은 한수의 개수를 출력하는 프로그램을 작성하시오.
--- More Details ---
등차수열이란?
연속하는 두 항의 차이가 모두 일정한 수열
식으로 나타내면 다음과 같다.
한수란?
각 자리수들이 등차수열을 이루는 수
한수의 예를 들어보면,
123(공차 1) , 2468(공차 2) , 951(공차 -4), 등등이 있다.
세자리 수 이상인 수는 이렇게 쉽게 한수를 생각해 낼 수 있는데, 한자리수와 두자리수는 한수를 어떻게 구할까?
한자리수와 두자리수는 모두 한수이다.
한자리수인 경우,(1,2,3,4...9) 따로 비교할 숫자가 없기 때문에 그 자체로 한수라 한다. 뭐 그래도 한수인 이유를 굳이 살펴보자면, 01(공차1) 02(공차2)... 09(공차9) 라고 볼수 있다. 두자리수인 경우, 십의자리와 일의자리의 차가 공차가 되면서 한수라 할 수 있다. 10(공차 -1) 48(공차 4) 92(공차 -7)...
따라서 모든 한자리수와 두자리수는 한수이다. 이점에 유의하며 문제를 풀어야 한다
추가로 11, 22, 99, 333, 이 수들은 한수일까?맞다. 공차가 0인 한수들이다.
2. 알고리즘 및 풀이
나는 함수를 main, getDigits, arithmetic_sequence함수 이렇게 세개 만들었다.
public static int[] getDigits(int n){
int[] digits= new int[3];
for(int i=0;i<3;i++) {
digits[i]=n%10;
n=n/10;
}
return digits;
}
이제는 바로바로 짤 수 있어야 하는 함수중에 하나이다. 일단 문제에서 n은 1000이하의 수라 하였고, 우리가 100미만인 수(한자리수와 두자리수)는 따로 계산하고, 1000은 한수가 아니기 때문에 세자리수만 판정하면 된다. 따라서 각 자릿수를 얻는 것 또한 세자리 수만 계산할 것이기 때문에 digits배열은 크기가 3이면 된다.
일의자리부터 10을 나눈 나머지를 배열[0]에 저장하고, 10을 나누어 몫만 다시 n에 저장하고, ... 이렇게 반복하면된다.
n을 d(n)의 생성자라고 한다. 위의 수열에서 33은 39의 생성자이고, 39는 51의 생성자, 51은 57의 생성자이다. 생성자가 한 개보다 많은 경우도 있다. 예를 들어, 101은 생성자가 2개(91과 100) 있다.
생성자가 없는 숫자를 셀프 넘버라고 한다. 100보다 작은 셀프 넘버는 총 13개가 있다. 1, 3, 5, 7, 9, 20, 31, 42, 53, 64, 75, 86, 97
10000보다 작거나 같은 셀프 넘버를 한 줄에 하나씩 출력하는 프로그램을 작성하시오.
2. 코드
public class Main{
public static void main(String[] args){
boolean[] check = new boolean[10001];
for(int i=1;i<10001;i++){
int n = d(i);
if(n<10001) check[n]=true;
}
for(int i=1;i<10001;i++){
if (check[i]==false) System.out.println(i);
}
}
public static int d(int n){
int cnt=n;
while(n!=0){
cnt = cnt + (n%10);
n = n/10;
}
return cnt;
}
}
3. 풀이
d 함수는 n과 각 자리수를 더하는 함수이다.
d함수에 대한 설명은 아래 주석으로 달아놓았다.
public static int d(int n){
int cnt=n; //cnt는 n과 각 자릿수를 더한 값을 저장하기 위한 변수
//cnt의 초기값을 n으로 한다.
while(n!=0){
cnt = cnt + (n%10);
//기존의 cnt값에 n의 일의 자리수를 더해 저장한다.
//cnt의 초기값을 n으로 설정한 이유이다.
n = n/10;
//일의자리를 없애준다.
}
return cnt;
}
}
n/10을 함으로써 일의 자리를 없앤다는 것은 계산을 해보면 알겠지만,
1234 -> 123 -> 12 -> 1 -> 0 이렇게 된다.
main함수로 돌아가면..
public class Main{
public static void main(String[] args){
boolean[] check = new boolean[10001];
// true false값을 저장하는 bool타입 배열을 선언한다.
for(int i=1;i<10001;i++){
int n = d(i); //i와 각 자릿수를 더한 값을 계산한 값을 n에 저장한다.
if(n<10001) check[n]=true;
//결과값들 중에서 10001보다 작은 값들만 true로 설정한다.
}
for(int i=1;i<10001;i++){
//false인 값들만 출력한다. -> false인 값들은 당연히 d함수를 통해 반환되지 않는 값들이다.
if (check[i]==false) System.out.println(i);
}
}
※ boolean 배열의 크기가 10001인 이유
이후 반복문에서 1에서 10000까지의 인덱스 숫자를 쓸 것이므로, check[10000]의 값을 저장하기 위해서는 배열의 크기를 [10001]로 설정해 주어야 한다.
※ if(n<10001) check[n]=true; 인 이유
만약 n 20000이라는 숫자가 나왔을때, if문이 없어 그대로 check[n]=true;라 실행했다면 , "java.lang.ArrayIndexOutOfBoundsException" 에러가 발생할 것이다. 즉, 배열의 인덱스 값이 범위를 넘어설 것이다. check 배열의 크기는 10001으로 설정되어있기때문에 n의 값이 10001보다 작은 경우에만 해당 실행문이 실행되도록 하면 된다.
세준이는 기말고사를 망쳤다. 세준이는 점수를 조작해서 집에 가져가기로 했다. 일단 세준이는 자기 점수 중에 최댓값을 골랐다. 이 값을 M이라고 한다. 그리고 나서 모든 점수를 점수/M*100으로 고쳤다.
예를 들어, 세준이의 최고점이 70이고, 수학점수가 50이었으면 수학점수는 50/70*100이 되어 71.43점이 된다.
세준이의 성적을 위의 방법대로 새로 계산했을 때, 새로운 평균을 구하는 프로그램을 작성하시오.
2. 코드
import java.util.Scanner;
import java.util.Arrays;
public class Main{
public static void main(String[] args){
Scanner sc = new Scanner(System.in);
int n = sc.nextInt();
int sum=0;
int[] score = new int[n];
for (int i=0;i<n;i++){
score[i]=sc.nextInt();
sum+=score[i];
}
Arrays.sort(score);
System.out.println((float)(sum*100)/(n*score[n-1]));
sc.close();
}
}
3. 풀이
현재 각각의 점수에 최고점을 나누고 100을 곱한 것이 조작한 점수이다.
즉, 현재 점수를 30, 50, 20점이라고 할 때
조작한 점수는 30/50*100, 50/50*100 , 20/50*100 이다. 이때 조작한 점수의 값을 굳이 구하지 않아도 된다.
조작한 점수의 평균을 구하는 식을 써보면,
(30/50*100 + 50/50*100 + 20/50*100)/3 이다.
"/50*100"이 공통되었으므로 묶어보면 다음과 같다.
{(30+50+20) /50*100}/3
순서를 조금 바꿔보면
(30+50+20)/3 /50*100
앞에 주황색으로 표시된 부분은 현재 점수의 평균과 같다.
따라서, 조작한 점수의 값을 굳이 구하지 않아도 조작한 점수의 평균을 구할 수 있다.
현재 점수의 평균 / 50 *100 을 하면 된다.
현재 점수의 최고점을 구하는 방법은 배열을 오름차순으로 정렬하면된다. 즉, 정렬한 후의 배열의 마지막 원소가 최고점이 된다. 오름차순으로 정렬하는 방법은 java.util.Arrays 클래스의 sort() 메소드를 사용하면 된다 .
score, score의 합, n의 값 모두 int형 변수이므로 int로 선언한다.
하지만, 문제에서 소수점 이하의 값도 표시하라고 했으니, 평균을 계산할 때 소수점도 나오게 형변환을 해주면 된다.