백준 2577번 자바
https://www.acmicpc.net/problem/2577
알고리즘
3개의 자연수가 주어진다. ( 100 <= 자연수 < 1000)
3개의 자연수를 곱한 값에 0 ~ 9 까지 각각의 숫자가 몇 번 쓰였는지 1줄씩 출력하라.
1. 10개의 값을 넣을수 있는 배열을 만든다.
2. 자연수 3개를 입력받는다.
3. 자연수 3개를 곱한다.
4. 곱한 값의 길이를 반복문으로 돌린다.
4-1. 한 글자씩 뽑아서 거기에 해당하는 숫자의 배열값을 +1씩 한다.
5. 배열을 한줄씩 출력한다.
풀이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[] arr = new int[10];
int sum = Integer.parseInt(br.readLine()) * Integer.parseInt(br.readLine()) * Integer.parseInt(br.readLine());
String str = Integer.toString(sum);
for (int i = 0; i < str.length(); i++) {
for (int j = 0; j < 10; j++) {
if ((str.charAt(i) - '0') == j) {
++arr[j];
break;
}
}
}
for(int i=0; i<10;i++) {
bw.write(arr[i]+"\n");
}
bw.flush();
}
}
0~9의 숫자가 몇개인지 저장하기위해 10개의 값을 저장할 수 있는 배열 arr[]을 만든다.
sum에 자연수 3개를 곱한 값을 저장한다.
str에 sum을 String 타입으로 바꿔서 저장한다.
str의 길이만큼 반복문을 돌린다.
한 번 돌아갈때마다 0~9를 비교할 수 있게 반복문을 한 번 더 쓴다. (이중 for문)
맞는 값이 나오면 거기에 해당하는 배열의 값을 +1 해준다.
이 때 문자 값 - 48 또는 문자 값 - '0' 을 하면 우리가 원하는 정수값을 나타낼 수 있다.
왜 이렇게 해야하는지는 더보기를 누르면 알 수 있다.
문자(char)로 읽게되면 현재 IDE 환경에서 설정한 인코딩 숫자로 표현 되는데 대부분 아스키코드와 127번까지 값이 같아서 위 표를 보면 된다. 문자인 '0' 을 보게되면 10진수로 표현했을 때 48이 된다.
그래서 문자인 숫자를 정수로 표현하기위해서 -48 을하거나 -'0'을 넣어서 우리가 원하는 숫자를 얻게 된다.
이렇게 배열에 있는 값들을 출력하면 된다.
풀이2
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[] arr = new int[10];
int sum = Integer.parseInt(br.readLine()) * Integer.parseInt(br.readLine()) * Integer.parseInt(br.readLine());
String str = Integer.toString(sum);
for (int i = 0; i < str.length(); i++) {
arr[(str.charAt(i) - '0')]++;
}
for (int i = 0; i < 10; i++) {
bw.write(arr[i] + "\n");
}
bw.flush();
}
}
풀이1번에서 굳이 이중 for문을 해서 0~9번에 맞는걸 +1씩 해주는것보다
str 문자열의 문자 값을 -48 또는 -'0' 을 해서 거기에 맞는 arr[] 배열을 +1 해주면 될 듯 하다.
그리고 배열을 출력한다.
풀이3
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[] arr = new int[10];
int sum = Integer.parseInt(br.readLine()) * Integer.parseInt(br.readLine()) * Integer.parseInt(br.readLine());
while (sum != 0) {
arr[sum % 10]++;
sum /= 10;
}
for (int i = 0; i < 10; i++) {
bw.write(arr[i] + "\n");
}
bw.flush();
}
}
내가 푼 풀이말고도 다른것이 있나 싶어서 확인하던 차에 발견한 풀이법이다.
풀이2번에는 arr[(str.charAt(i) - '0')] 으로 str의 문자를 가져와서 정수로 표현했지만
여기서는 sum % 10으로 sum의 첫 번째 자리수를 표현했다.
그 후 첫 번째 자리수를 없애기 위해 sum /= 10을 하였다.
이렇게 sum이 0이 될 때까지 반복한 후 배열을 출력한다.
위의 풀이법이 이해되지 않는다면 아래를 참고하면 될 듯 하다.
'코딩테스트 > Java - 백준' 카테고리의 다른 글
[백준] 1546번 - Java(자바) (0) | 2022.01.27 |
---|---|
[백준] 3052번 - Java(자바) (0) | 2022.01.25 |
[백준] 2562번 - Java(자바) (0) | 2022.01.18 |
[백준] 10818번 - Java(자바) (0) | 2022.01.14 |
[백준] 1110번 - Java(자바) (0) | 2022.01.11 |