코딩테스트

하루 코테 3문제풀기-1일차

songsua 2024. 12. 8. 02:13

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는 문자열을 나누는 데 유용해. 공백뿐만 아니라, 다른 구분자를 사용할 수도 있다.