2024. 7. 16. 15:49ㆍWebBack/알고리즘
백준ㅣ11720번
1단계
문제 분석)
위 문제는 배열과 리스트 중에 어느 것이 적합할까?
-> 배열이 더 적합하다. 그 이유는 다음과 같다.
1. 첫째 줄 입력을 통해 배열의 크기를 알 수 있다. (크기 고정)
2. 배열에 있는 데이터에 모두 접근을 해야한다. (접근 빠름)
숫자 입력은 어떤 타입으로 지정해야할까?
-> 100자리까지 입력을 받는다. int는 약 10자리, long은 약 19자리를 저장할 수 있다. 100자리의 숫자를 넣으면 오버플로우가 발생한다(p.62). 더 많은 숫자를 담을 수 있는 String 타입을 사용할 필요가 있다.
-참조: <<자바의 정석 기초편>>, p.53
String의 값을 어떻게 더해야할까?
-> String 타입으로 받은 뒤에 각 자리 숫자를 char로 전환하여 하나씩 더하면 된다. 다만, char을 각각 더하기 위해 int로 형변환을 하면 문자코드로 전환된다. '0'이 48, '1'이 49 ... '9'는 57이다. 이를 해결하기 위해서는 '0'을 빼면 된다. (p.66)
-참조:<<기초편>>, p.88
2단계
구조 짜기)
1. 첫번째 입력값을 받는다. (int inputA)
2. 두번째 입력값을 받는다. (String inputB)
3. 모든 값을 더할 변수를 만든다. (int total)
4. inputA값의 크기를 가진 int[] intArr을 만들어 초기화한다.
5. for문을 통해 charAt을 통해 String의 각 자리 숫자를 char로 변환한다. (복잡도 O(n))
6. 그 과정에서 char에 '0'을 빼서 int로 전환한다.
7. 그 과정에서 그 값을 charArr에 넣는다.
8. for문을 이용해 배열의 각 값을 total에 저장한다. ( 복잡도 O(n) )
9. total값을 출력한다.
==> 총 복잡도 O(n)
//3단계 코드짜기
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
System.out.print("자릿수를 입력하세요)");
int inputA = sc.nextInt();
System.out.print("값을 입력하세요)");
String inputB = sc.nextLine(); //2번
int[] intArr = new int[inputA]; //3번
int total = 0;//4번
for(int i = 0; i < intArr.length; i++){
intArr[i] = (int)(inputB.charAt(i) - '0'); //5번 //6번 //7번
}
for(int i = 0; i < intArr.length; i++){
total += intArr[i]; //8번
}
System.out.println("모든 숫자의 합)" + total); //9번
sc.close();
}
4단계
문제 점검)
inputA를 입력하는데 아래와 같은 오류가 발생하였다. 입력을 하지 않았는데 왜 값 입력이 문제가 있다고 오류를 보낼까? 고민하다가 혹시 자릿수에 입력한 값이 그대로 값이 남아있어서 그런 것이 아닌가 생각했다. 예전에 비슷한 오류를 겪어서 해결한 기억이 떠올랐다.
이를 위해 코드 중간에
sc.nextLine();
초기화 코드를 넣어주니 해결되었다.
import java.util.Scanner;
class Main {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
int inputA = sc.nextInt();
sc.nextLine(); //입력값 초기화
String inputB = sc.nextLine(); //2번
int[] intArr = new int[inputA]; //3번
int total = 0;//4번
for(int i = 0; i < intArr.length; i++){
intArr[i] = (int)(inputB.charAt(i) - '0'); //5번 //6번 //7번
}
for(int i = 0; i < intArr.length; i++){
total += intArr[i]; //8번
}
System.out.println(total); //9번
sc.close();
}
}
해결!!!
//5단계 다른 코드 참고
class Main {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
int N = sc.nextInt();
String sNum = sc.next();
char[] cNum = sNum.toCharArray();
int sum = 0;
for (int i = 0; i < cNum.length; i++) {
sum += cNum[i] - '0';
}
System.out.println(sum);
}
}
배열을 만드는 과정을 toCharArray()를 통해 해결하여 for문을 하나 줄였다. 참고할만하다.
'WebBack > 알고리즘' 카테고리의 다른 글
[알고리즘] Stack을 이용한 올바른 괄호 확인 (0) | 2024.08.13 |
---|---|
[알고리즘] 평균 구하기 (0) | 2024.07.17 |
[알고리즘, 자료구조] 자연정렬된 키워드를 검색(Arrays.binarySearch) (0) | 2024.06.24 |
[알고리즘, 자료구조] Arrays.binarySearch에 의한 이진검색 (0) | 2024.06.24 |
[알고리즘, 자료구조] 이진 검색 (0) | 2024.06.22 |