https://www.acmicpc.net/problem/2577
설명 :
세 자연수 A, B, C의 곱을 계산한 후 결과값에 0~9가 몇 번씩 쓰였는지를 구하는 문제
내 생각 :
우선 ABC를 입력받아야 하고, 입력받은 ABC를 곱한 값을 저장해야한다고 생각했다.
그래서 생각한 것이 "결과 값을 다시 문자열로 변환하고, 이 문자열을 한 문자씩 쪼개서 배열에다가 저장해야겠다"라고 생각했다.
코드를 작성하면서 왜이렇게 복잡해지고 불필요한 느낌이 들지? 라는 쎄한 생각이 들었다...
그렇게 한 문자씩 배열에 저장함과 동시에 다시 Int형으로 변환해주고 조건문을 이용해 각 자리를 count 하기 시작했는데, 이렇게 정리하면서 생각해보니까 굳이 이렇게 할 필요가 있나? 라는 생각이 들었다.
저장, 변환 과정을 거치지 않고 abc의 곱 값을 count 하면 될 것 같은 아이디어가 떠올랐다.
내가 코드를 이렇게 생각한 이유는 아마 직접 눈으로 확인해보고 싶어서이지 않을까 싶다.
내가 작성한 코드는 다음과 같다.
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
int [] swit = new int[9];
int [] count = new int[10];
String [] Arr = new String[9];
int A = Integer.parseInt(br.readLine());
int B = Integer.parseInt(br.readLine());
int C = Integer.parseInt(br.readLine());
int num = A*B*C;
String st = Integer.toString(num);
Arr=st.split("");
for(int a=0; a<st.length(); a++){
swit[a]= Integer.parseInt(Arr[a]);
}
while(num>0){
count[num%10]++;
num/=10;
}
for(int c=0; c<count.length; c++){
System.out.println(count[c]);
}
}
위에서 설명했던 것처럼 코드를 작성했었고, 굳이 뭐 이렇게 할 필요가 없을거 같았다.
위에 불필요한 배열의 선언과 변환 등의 과정을 지우고 다시 제출해서 런해보니 시간은 동일하나 메모리는 줄었다.
내가 생각한 방식에는 %연산자를 이용해 숫자를 10으로 나눈 나머지를 이용해 count를 해주는 방식을 생각했다.
이러한 방법을 abc의 곱 값이 0보다 큰 동안 반복했다.
내가 생각한 방법 말고도 charAt을 이용한 방법으로 제출한 사람들도 있었다.
결국 charAt을 이용하려면 문자를 숫자로 변환해주는 과정이 필요하다
핵심 코드이다
설명과 같이 코드를 작성해서 채점을 해본 결과 4ms가 단축되었다..
String num = Integer.toString(A * B * C);
for (int i = 0; i < 10; i++) {
int count = 0;
for (int j = 0; j < num.length(); j++) {
if ((num.charAt(j) - '0') == i) {
count++;
}
}
System.out.println(count);
}
'알고리즘 및 자료구조 > 백준(BackJoon)' 카테고리의 다른 글
백준 - 3052번 (0) | 2022.08.08 |
---|---|
백준 - 1546번 (0) | 2022.08.07 |
백준 -2562번 (0) | 2022.08.05 |
백준 - 10818번 (0) | 2022.08.05 |
백준 2588번 - 곱셈 (Scanner와 BufferedReader) (0) | 2022.07.27 |