001 숫자의 합 구하기(백준111720)
1번째 줄에 숫자의 개수 N(1=< N <= 100) . 2번째 줄에 숫자가 N개가 공백 없이 주어진다.
N=100이다. int 나 long 으로 받을 수없다.
N의 범위가 1부터 100까지 이므로 값을 int형 long형과 같은 숫자형으로 담을 수 없다.
따라서 string 형으로 받아서 숫자형으로 변환하여 더해야 한다.
예를 들어 "1234" 와 같이 문자열로 String 을 배열에 넣는다. To CharArray 를 사용한다.
ToCharArray을 사용하면 자동으로 자동으로 Char별로 배열에 들어가게 된다.
Char 을 Int형을 변환하기 위해 "아스키코드"를 사용한다.
"아스키코드" : 문자열의 1 과 숫자형의 1 은 48이 차이난다.
따라서 Char 인 1 을 1 - 48 = 47 하면 실제 int 1 이 떨어지게 된다.
손으로 풀어보기
1. 숫자의 개수만큼 입력받은 절을 String 형으로 저장합니다.
2.String 으로 입력받은 값을 Char 형으로 변환한다.
연속된 숫자를 한개씩 나눠서 변환한다는 것. --> ToCharArrat 함수를 사용한다.
3.인덱스 0부터 끝까지 배열을 탐색하며 각 값을 정수형으로 변환하고 결괏값에 더하여 누적한다.
4.각 Char 을 int 로 변환한다음 sum 으로 변환하여 더해주면 된다
5. for문을 사용하며 cNum길이만큼 반복한다.
{ 배열의 각 자릿값을 정수형으로 변환하여 sum에 더하여 누적한다.}
정수형 반환에는 아스키코드를 사용한다.
6. Sum 출력하기
코드 작성하기
package test.Num1;
import java.util.Scanner;
public class 문제1 {
//N개의 숫자가 공백 없이 써 있다. 이. 숫자를 모두 합해 출력하는 프로그램을 작성하시오.
public static void main(String[] args) {
//scanner를 사용하여 값을 입력받자
System.out.println("값을 입력하시오");
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);
}
}
002 평균구하기(백준1546번)
자기 점수 중 최댓값으 고른 다음, 그 최댓값 M을 모든 점수를 점수/M*100 으로 고쳤다.
예를 들어 세준이의 최고점이 70점 수학 점수가 50점이라면 수학 점수는 50/70*100이므로 71.43점이다.
이럴 때 새로운 평균 점수를 구하는 프로그램을 구하시오
간다하게 식으로 표현할 경우,
(A/M*100+B/M*100+C/M*100) / 3 = (A+B+C) *100 / M / 3
손으로 풀어보기
1. 시험을 본 과목의 개수로 배열안에 넣기
2. 그 중 최대값을 출력하고 별도로 저장해야 한다.
3. 모든 점수의 총합도 출력한다.
4. (A+B+C) *100 / M / 3 식을 만들어서 대입한다.
코드 작성하기
package test.Num1;
import java.util.Scanner;
public class 문제2 {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
System.out.println("과목의 수를 입력하시오");
int n = sc.nextInt();
int A[] = new int[n];
System.out.println("과목점수를 입력하시오");
for(int i=0;i<n;i++){
A[i] = sc.nextInt();
}
int sum = 0;
int max = 0;
//최댓값 구하기
for(int i=0;i<n;i++){
if(A[i]>max) max = A[i];
sum += A[i];
}
System.out.println("새로운 평균 값" + sum*100.0/max/n);
}
}
다른 풀이 법
package test.Num1;
import java.util.Scanner;
public class 문제2 {
public static void main(String[] args) {
System.out.print("과목수");
Scanner sc= new Scanner(System.in);
int N = sc.nextInt();
long sum = 0;
long max = 0;
System.out.println("과목 점수 입력");
for (int i=0; i<N; i++){
int A = sc.nextInt();
if (A>max) max = A;
sum += A;
}
System.out.println("원하는 평균값" + sum*100.0/max/N);
}
}
003구간 합 구하기(백준11659번)
수 N개가 주어졌을 때 i번째 수에서 j번째 수 까지의 합을 구하는 프로그램을 작성하기
N과 M 은 범위가 1~10000까지 가능하다.
최대 100,000 이기 때문에 구간의 합을 0.5초안에 계산을 할 수 가 없다.
이럴 때 구간의 합을 이용해야한다.
손으로 풀어보기
1. N개의 수를 입력받음과 동시에 합 배열을 생성해야한다.
합 배열 공식:
S[i] = S[i-1] + A[i]
A에서 처음에 5가 들어올 경우, S배열에는 그대로 5가 들어간다.
그 다음, A에 4가 들어온 경우, 5+4 로 S배열에 두 번째에는 9가 들어간다.
3번째에는 A가 3이 들어오면 S에는 9+3 = 12 가 들어오게 된다.
최종적으로 합 배열은 데이터를 받으면서 바로 구할 수 있다.
최악에 케이스로 최대 십만개가 들어올 경우,
2. 구간 i~j가 주어지면 구간 합을 구하는 공식으로 정답을 출력한다.
구간 합 공식:
S[j]-S[i-1]
질의1(1,3): s[3] - s[0]
코드 작성할 때,
suNo(숫자 개수), auizNo(질의 개수) 저장하기
for(숫자 개수만큼 반복하기) {
합 배열 생성하기 S[i] = S[i-1] + A[i] ) }
for (질의 개수만큼 반복하기) {
질의 범위 받기(i~j)
구간 합 출력하기(s[j] - s[i-1] )
}
코드작성하기
package test.Num1;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.StringTokenizer;
public class 문제3 {
public static void main(String[] args) throws IOException {
//값이 많을 경우에는 scanner 보다 bufferdreader 가 성능이 더 빠르다.
BufferedReader bufferedReader = new BufferedReader(new InputStreamReader(System.in));
// 값이 많을 경우, int보단 string token으로 분리하여 받는 것이 좋다
//readLine은 예저1을 읽어오는 것이다.
StringTokenizer stringTokenizer = new StringTokenizer(bufferedReader.readLine());
int suNo = Integer.parseInt(stringTokenizer.nextToken());
int quizno = Integer.parseInt(stringTokenizer.nextToken());
long[]S= new long[suNo +1];
/* 한줄로 받아 올때는 StringTokenizer 을 사용하여 받아온다.; */
stringTokenizer = new StringTokenizer(bufferedReader.readLine());
for (int i = 1; i <=suNo; i++) {
S[i] = S[i - 1] + Integer.parseInt(stringTokenizer.nextToken());
}
for(int q=0; q<quizno; q++) {
stringTokenizer = new StringTokenizer(bufferedReader.readLine());
int a = Integer.parseInt(stringTokenizer.nextToken());
int b = Integer.parseInt(stringTokenizer.nextToken());
System.out.print(S[b] - S[a-1]);
}
}
}
언어 정리
throws IOException
예외처리를 하기 위한 예약어 이다.
throws 뒤에 오는 IOException 객체로 예외를 발생시킨다.
throws는 클라이언트에게 메소드의 동작 중 어떤 예외가 발생할 수 도 있으니 예외처리 해주라는 것을 알려주는 용도이다.
BufferReader readLine() 을 사용하기 위해서는 throws Exception 을 해줘야 한다.
IOException은 checkedException 이기 때문에 반드시 예외처리를 해줘야 한다.
.Checked ExceptionUnchecked Exception
처리 여부 | 반드시 예외 처리 해야함 | 예외 처리 하지 않아도됨 |
트랜잭션 Rollback 여부 | Rollback 안됨 | Rollback 진행 |
대표 Exception | IOException, SQLException | NullPointerException, IllegalArgumentException |
예외란?
파일을 읽을려고 했을 때, 그 파일이 없는 경우
인터넷 연결이 끊겼을 경우
이런 상황에 대비해 예외 처리를 해줘야 한다.
RuntimeException 은 컴파일러가 확인하는 예외, 프로그램 실행 중 발생할 수 있는 Unchecked Exception
외부 요인(파일 없음, 네트워크 문제 등)은 Checked Exception으로 컴파일 단계에서 강제로 처리하도록 설계.
쉽게 말해서, readline 은 긴 글을 읽을 때 사용하게 되는데, 자원이 없는 상태로 강제로 read를 할 경우 장애가 날 수 있기 때문에 이를 예방하기 위해 Exception을 사용하게 된다.
InputStream==null 인 경우를 대비하기 위해 사용한다고 보면 된다.
참고 자료:
https://cheese10yun.github.io/checked-exception/
Checked Exception을 대하는 자세 - Yun Blog | 기술 블로그
Checked Exception을 대하는 자세 - Yun Blog | 기술 블로그
cheese10yun.github.io
StringTokenizer
StringTokenizer
문자열을 잘라주는 도구 이며, 기본적으로 공백을 기준으로 문자열을 잘라서 단어 단위로 나눠준다.
예시)
파일의 내용에 "사과 바나나 포도" 가 있을 경우,
BufferedReader bufferedReader = new BufferedReader(new FileReader("file.txt"));
StringTokenizer stringTokenizer = new StringTokenizer(bufferedReader.readLine());
while (stringTokenizer.hasMoreTokens()) {
System.out.println(stringTokenizer.nextToken());
}
결과:
사과
바나나
포도
로 출력
단어 단위로 데이터를 나누고 싶을 때
StringTokenizer는 문자열을 나누는 데 유용해. 공백뿐만 아니라, 다른 구분자를 사용할 수도 있다.
'코딩테스트' 카테고리의 다른 글
하루 코테 3개 풀기 - 6일차 (1) | 2024.12.16 |
---|---|
하루 코테 3개 풀기 - 5일차 (1) | 2024.12.14 |
하루 코테 3개 풀기 - 4일차 (0) | 2024.12.13 |
하루 코테 3문제풀기 - 3일차 (2) | 2024.12.13 |
하루 코테 3문제풀기-2일차 (0) | 2024.12.10 |