브론즈 1

ChoRong0824·2023년 3월 23일
0

백준

목록 보기
2/14
post-thumbnail

백준, 보른즈1에 있는 문제들을 포스팅 해보도록 하겠습니다.
(바쁘면 1문제, 최소 3~5문제 목표입니다)

1110 각 문자열 덧셈

각 문자열 형변환 (모르시는 분들 참고하세요~) 2, 3

자바 입력 뜯어보기

import java.io.*;
import java.math.BigInteger;
import java.util.*;

public class Main {
    public static void main(String[] args) throws IOException {
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));

        int N = Integer.parseInt(br.readLine());
        int cp = N;
        int count =0;
        
        //  N 십의 자릿수는 나누기 10 을 하면 N이 한 자릿수이면 0,
        //  그 외에는 십의 자릿수가 그대로 반환.
        //  N % 10 일의자릿수 
        
        do {
            N = ((N % 10) * 10) + (((N / 10) + (N % 10)) % 10);
            count++;
        } while (cp != N);
        System.out.print(count);
    }
}


1546 평균 / 배열문제

import java.io.*;
import java.util.StringTokenizer;

public class Main {
    public static void main(String[] args) throws IOException {
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));

        int N = Integer.parseInt(br.readLine());
        int []arr =new int [N];
        StringTokenizer st = new StringTokenizer(br.readLine()," ");
        int max=0;
        int sum=0;
        for (int i = 0; i < N; i++) {
            arr[i] = Integer.parseInt(st.nextToken());
            max = Math.max(arr[i], arr[i + 1]);
            sum += arr[i];
        }
        System.out.print(((sum/max)*100)/3));
    }
}

바보.
당연한 것이다. 배열의 범위를 넘어가니까 에러가 뜬다. 자바에서는 배열의 범위 초과시 ArrayIndexOutOfBoundsException 에러가 발생합니다.
따라서, 다시 생각해보면 max 와 arr[i] 를 비교해서 max 값에 넣으면 되는. 간단히 소팅하면 됩니다.
수정 후 다시 돌려봤지만 계산이 제대로 되지 않았다.

  • 이유?
    int 형의 범위를 초과했기 떄문이다. 따라서 아래와 같이 수정해줘야한다.
import java.io.*;
import java.util.StringTokenizer;

public class Main {
    public static void main(String[] args) throws IOException {
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));

        int N = Integer.parseInt(br.readLine());
        double []arr =new double [N];
        StringTokenizer st = new StringTokenizer(br.readLine()," ");
        double max=0;
        double sum=0;
        // 배열의 길이만큼 반복
        for (int i = 0; i < N; i++) {
            arr[i] = Double.parseDouble(st.nextToken());
            max = Math.max(arr[i], max);
            sum += arr[i];
        }
        System.out.print((double)(((sum/max)*100)/N));
    }
}

4344, 평균 배열

import java.io.*;
import java.util.StringTokenizer;

public class Main {
    public static void main(String[] args) throws IOException {
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));

        int C = Integer.parseInt(br.readLine());

        for (int i = 0; i < C; i++) {
            StringTokenizer st = new StringTokenizer(br.readLine());
            int N = Integer.parseInt(br.readLine());
            int[] score = new int[N];
            int sum =0;
            for (int j = 0; j < N; j++) {
                score[j] = Integer.parseInt(st.nextToken());
                sum += score[j];
            }
            // 각 케이스마다 한 줄씩 평균을 넘는 학생들의 비율을 반올림해서 소수 3째자리 까지 출력.
            // -> 각 케이스마다 평균을 구해야함.
            float avg = (float) sum/N;
            int count =0;

            for (int k = 0; k < N; k++) {
                if (score[k] > avg) {
                    count++;
                }
            }
            float ratio = (count / N) *100;
            System.out.printf("%.3f", ratio);
            System.out.println("%");
        }
    }
}

필자들은 왜 에러가 발생하는지 아시겠나요?

import java.io.*;
import java.util.StringTokenizer;

public class Main {
    public static void main(String[] args) throws IOException {
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));

        int C = Integer.parseInt(br.readLine());
        // 이렇게 해야 계속 문자열 분리해서 받을 수 있음.
        StringTokenizer st;

        for (int i = 0; i < C; i++) {

            st = new StringTokenizer(br.readLine()," ");
            // 해당부분.
            int N = Integer.parseInt(st.nextToken());
            int[] score = new int[N];
            int sum =0;
            for (int j = 0; j < N; j++) {
                score[j] = Integer.parseInt(st.nextToken());
                sum += score[j];
            }
            // 각 케이스마다 한 줄씩 평균을 넘는 학생들의 비율을 반올림해서 소수 3째자리 까지 출력.
            // -> 각 케이스마다 평균을 구해야함.
            float avg = (float) sum/N;
            float count =0;

            for (int k = 0; k < N; k++) {
                if (score[k] > avg) {
                    count++;
                }
            }
            float ratio = (count / N) *100;
            System.out.printf("%.3f", ratio);
            System.out.println("%");
        }
    }
}
  • 이유,
    int N을 받을 떄, br.readLine()으로 매 문장으로 반복하니까 런타임이 뜨는 것이다.
    따라서 st.nextToken()으로 바꿔준다.
    주의하자 ! , 사소하면서도 이런 디테일을 놓쳤다.

1157 단어공부 / 아스키코드 & 문자열

필자가 생각했을 때에는,
1. 아스키코드
2. 배열 (메서드 활용)
으로 풀 수 있을 것 같다고 생각됩니다.
아스키코드,

  • 대문자 범위는 65~90, 소문자 97~122 입니다. (외우는게 좋음)
    해당 알파벳의 (인덱스) 값을 가져오기 위해서 -65를 해주면 됩니다.
    A 는 65 이므로 65를 빼면 0 // 배열 활용했다고 가정.
import java.io.*;
import java.util.Scanner;
import java.util.StringTokenizer;

public class Main {
    public static void main(String[] args) throws IOException {
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));

        // 1번 풀이
        int[] arr = new int[26];
        String str = br.readLine();

        for (int i = 0; i < str.length(); i++) {
            // 현재 i번쨰 문자가 소문자 알파벳인지 판단하는 조건
            if ('a' <= str.charAt(i) && str.charAt(i) <= 'z') {
                // 만약 소문자라면 'a'의 아스키 코드값 97을 빼줌
                arr[str.charAt(i) - 97]++;
            } else{
                // 대문자일경우, 'A' 의 아스키 코드 값
                arr[str.charAt(i)-65]++;
            }
        }
        int max = -1;
        // char ch =0; 으로 작성해도 무방.
        char ch = '?';
        // 앞에서 계산한 각 알파벳의 arr 배열(출현빈도)를 바탕으로, 가장 빈도가 높은 알파벳을 출력.
        for (int i = 0; i < 26; i++) {
            // 가장 높은 빈도 값을 저장하고, ch 변수에는 해당 알파벳을 저장함/
            if (arr[i] > max) {
                max = arr[i];
                ch = (char) (i + 65);
            } else if (arr[i]==max) {
                ch = '?';
            }
        }
        System.out.print(ch);
    }
}

2609

GCD || 유클리드 호재법,

2775 부녀회장 (아파트)

  • 클래스 사용 x
import java.io.*;
import java.util.Scanner;
import java.util.StringTokenizer;

public class Main {
    public static void main(String[] args) throws IOException {
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
//        StringTokenizer st = new StringTokenizer(br.readLine());
        StringBuilder sb = new StringBuilder();
        // 아파트에 살 수 있는 최대 값을 배열로 초기화
        int[][] APT = new int[15][15];

        // 아파트 생성
        for (int i = 0; i < 15; i++) {
            APT[i][1]=1; // 1 ㅊ으 1호
            APT[0][i]= i;// 0층 1호
        }
        for (int i = 1; i < 15; i++) {
            for (int j = 2; j < 15; j++) {
                APT[i][j] = APT[i][j - 1] + APT[i - 1][j];
            }
        }

        int T = Integer.parseInt(br.readLine());
        for (int k = 0; k < T; k++) {
            int a = Integer.parseInt(br.readLine());
            int b = Integer.parseInt(br.readLine());
            sb.append(APT[a][b]).append("\n");
        }
        System.out.println(sb);
    }
}
  • 클래스로 나눠줌.
import java.io.*;
import java.util.Scanner;
import java.util.StringTokenizer;

public class Main {
    private static int[][] APT = new int[15][15];

    public static void main(String[] args) throws IOException {
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
//        StringTokenizer st = new StringTokenizer(br.readLine());
        StringBuilder sb = new StringBuilder();
        // 아파트에 살 수 있는 최대 값을 배열로 초기화
        make_APT();

        int T = Integer.parseInt(br.readLine());
        for (int k = 0; k < T; k++) {
            int a = Integer.parseInt(br.readLine());
            int b = Integer.parseInt(br.readLine());
            sb.append(APT[a][b]).append("\n");
        }
        System.out.println(sb);
    }

    private static void make_APT(){
        // 아파트 생성
        for (int i = 0; i < 15; i++) {
            APT[i][1]=1; // 1 ㅊ으 1호
            APT[0][i]= i;// 0층 1호
        }
        for (int i = 1; i < 15; i++) {
            for (int j = 2; j < 15; j++) {
                APT[i][j] = APT[i][j - 1] + APT[i - 1][j];
            }
        }
    }
}

1271 엄청난 부자, BigInteger

import java.io.*;
import java.math.BigInteger;
import java.util.Scanner;
import java.util.StringTokenizer;

public class Main {
    public static void main(String[] args) throws IOException {
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        StringTokenizer st = new StringTokenizer(br.readLine()," ");

        BigInteger n = new BigInteger(st.nextToken());
        BigInteger m = new BigInteger(st.nextToken());

        System.out.println(n.divide(m));
        System.out.print(n.remainder(m));
    }
}

1934 최소공배수, 유클리드 호제법

import java.util.*;
import java.io.*;

public class Main{
    public static void main(String[]args)throws IOException{
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        int T = Integer.parseInt(br.readLine());
        StringTokenizer st;
        StringBuilder sb = new StringBuilder();
        
        // 입력
        for(int i=0; i<T;i++){
            st = new StringTokenizer(br.readLine());
            int A = Integer.parseInt(st.nextToken());
            int B = Integer.parseInt(st.nextToken());
            
            int result = gcd(A,B);
            
            sb.append(A*B/result).append('\n');
        }System.out.print(sb);
        
    }
    public static int gcd(int A, int B){
        while(B!=0){
            int r = A % B; // 나머지 구하기
            // gcd(a,b) = GCD(b,r)임. 즉, 변환함
            // 만약, 이해가 안된다면, 배열 소팅을 생각해보면 됨.
            A= B;
            B = r; 
        } return A;
    }
}

코드로 이해가 안된다면 유클리드 호제법에 대해 공부를 할 필요가 있습니다.
유클리드 호제법은 최소공배수 및 최대공약수를 구하는 대표적인 방법입니다.
유클리드 호제법에 대해 자세히 포스팅한 블로그가 있어, 도움이 되고자 이렇게 남깁니다.

코딩테스트 연습에 제일 중요한 것은, IDEA로 작성해서 옮기는 것이 아니라 인터넷(코테 사이트)에서 바로 푸는 것이 Best of Best 입니다.
왜냐고요? --> 필자는 코테 볼 때, IDEA가 제공해주는 툴을 사용했는데, 코테에선 이것을 사용하지 못해서 난감했던 경험이 있습니다.
이후부터 필자는 코테 사이트에서 즉시 코드를 작성하여 코테준비를 할 예정입니다.

23.05.16 최종 수정 완
profile
백엔드를 지향하며, 컴퓨터공학과를 졸업한 취준생입니다. 많이 부족하지만 열심히 노력해서 실력을 갈고 닦겠습니다. 부족하고 틀린 부분이 있을 수도 있지만 이쁘게 봐주시면 감사하겠습니다. 틀린 부분은 댓글 남겨주시면 제가 따로 학습 및 자료를 찾아봐서 제 것으로 만들도록 하겠습니다. 귀중한 시간 방문해주셔서 감사합니다.

0개의 댓글