백준 브론즈 2_2

ChoRong0824·2023년 3월 19일
0

Java

목록 보기
8/31
post-thumbnail

백준 브론즈 2

배열소팅


25305

필자는 내림차순 소팅문법을 사용했으나, 왜 안되는지 이유를 몰랐으나, 다시 확인해보니 정답을 찾았습니다.
int[]x=new int[n];이 아닌 Integer[]x= new Integer[n];으로 초기화 해줘야 (Collections.reversOrder()) 사용 가능합니다. 자세한 설명

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));
        StringTokenizer st;
        st = new StringTokenizer(br.readLine());
        int N = Integer.parseInt(st.nextToken());
        int k = Integer.parseInt(st.nextToken());

        // 주의 여기엔 Integer을 써줘야함
        int[] x = new int[N];
        st = new StringTokenizer(br.readLine());
        // k등 뽑는 로직
        for (int i = 0; i < N; i++) {
            x[i] = Integer.parseInt(st.nextToken());
            }
        Arrays.sort(x, Collections.reverseOrder());
        System.out.print(x[k - 1]);
    }
    }
}


1212

10진수로 바꾸기 위해서는 Integer형 변수에 저장해서 풀 수 있는 방법이 있으나, 이렇게 되면 초기 조건인 수의길이에 문제가 발생합니다. 이렇게 접근하면 안되고,

8진수는 한 자리씩 잘라 3자리를 2진수로 변경하는 것입니다.
예를 들면)
5 = 101
4 = 100
3 = 011
543 = 101100011

전제 조건에서 반드시 1로 시작해야 한다고 명시 되어 있습니다. 만약 0으로 시작하게 된다면 0을 제거하고 1로 시작하면 됩니다.
이렇게 10진수로 변환하고 2진수로 변환하지 않고 한 자리씩 2진수로 변환하면 자릿수를 넘는 일은 없을 것입니다.

참고 !

String은 "+" 연산자를 사용하게 되면 문자열에 새로운 문자열이 추가되는 것이 아니라 새로운 문자열 객체를 만들고 그 객체를 참조한다고 합니다 !!! (필자 처음 알게 됨) -> StringBuidler 사용 , (웬만하면, StringBuilder을 사용하여 풀도록 습관 굳히기)

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));

        String str = br.readLine();
        StringBuilder sb = new StringBuilder();
        // 각 숫자를 2진수로 나눠서 계산해줄 예정이라서 미리 배열에 초기화
        String[] arr = {"000", "001", "010", "011", "100", "101", "110", "111"};

        for (int i = 0; i < str.length(); i++) {
            // 맨 앞은 '0' 빼기
            int n = str.charAt(i) - '0';
            sb.append(arr[n]);
        }
        if (str.equals("0")) {
            System.out.print(str);
        } else {
            while (sb.charAt(0) == '0')
                // int start
                sb = new StringBuilder(sb.substring(1));
                System.out.print(sb);

        }
    }
}


10996

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());
        // 행렬을 짝수와 홀수로 나누는 로직
        for (int i = 1; i <= N * 2; i++) {
            //홀수행 짝수행 나눠주기
            if (i % 2 != 0) {
                //열 반복
                for (int j = 1; j <= N; j++) {
                    // 홀수열과 짝수열을 나눠줌
                    if (j % 2 != 0) {
                        System.out.print("*");
                    }else
                        System.out.print(" ");

                }
            }
            else {
                for (int j = 1; j <= N; j++) {
                    if (j % 2 != 0) {
                        System.out.print(" ");
                    }else
                        System.out.print("*");

                }
            }
            System.out.println();
        }
    }
}

15829 (중요!)

해시 함수

임의의 길이의 입력을 받아서 고정된 길이의 출력을 내보내는 함수로 정의한다. 해시 함수는 무궁무진한 응용 분야를 갖는데, 대표적으로 자료의 저장과 탐색에 쓰인다.
해쉬함수는 먼저, 편의상 입력으로 들어오는 문자열에는 영문 소문자(a, b, ..., z)로만 구성되어있다고 가정하자. 영어에는 총 26개의 알파벳이 존재하므로 a에는 1, b에는 2, c에는 3, ..., z에는 26으로 고유한 번호를 부여할 수 있다. 결과적으로 우리는 하나의 문자열을 수열로 변환할 수 있다. 예를 들어서 문자열 "abba"은 수열 1, 2, 2, 1로 나타낼 수 있다

해시 함수식


해당 함수 식은 자주 쓰이니까 꼭 기억해두기 !

참고,

입력받은 문자열을 통해 해싱 함수를 거쳐서 수를 출력하는 문제입니다.
(a=1, b=2, c=3 ...)
예를 들어 abc 문자를 입력받았다면,
131 + 23131 + 3313131를 출력하는 문제입니다.
Math.pow를 사용한다면 50점만 받을 수도 있습니다.
필요할 때마다 math.pow를 호출하는 것보다 이전 값에다가 31을 계속 누적으로 곱해줘서 더하는 식으로 문제를 풀어야만합니다.

다른 방법 참고

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));
        // 15829
        // 곱셈과 덧셈의 분배법칙 이용
        // 31%M이나 31이나 똑같다
        final int M = 1234567891;
        int l = Integer.parseInt(br.readLine());
        String str = br.readLine();
        long sum =0;
        long pw = 1;
        int r = 31;
        char[] arr = str.toCharArray();
        for (int i = 0; i < l; i++) {
            sum += (arr[i] - 'a' + 1) * pw % M;
//
            pw = pw * r % M;
        }
        long H = sum % M;
        System.out.print(H);
        
        // solve 2
        /*
        int n = Integer.parseInt(br.readLine());
        String str = br.readLine();
        final int M = 1234567891;
        long sum =0;
        long r = 0;
        r = Math.pow(31,0);
        for(int i=0;i<n;i++){
        //아스키코드 
        sum+=(str.charAt(i)-96)*r;
        r = r * 31 % M;}
        System.out.print(String.valueOf(sum%M));       
        */
    }
}


1076

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));
        // 색,값 저장 HashMap {{}} 2중으로 해줘야함.
        HashMap<String, String> map = new HashMap<>() {{
            put("black", "0");
            put("black","0");
            put("brown", "1");
            put("red", "2");
            put("orange", "3");
            put("yellow", "4");
            put("green", "5");
            put("blue", "6");
            put("violet", "7");
            put("grey", "8");
            put("white", "9");
        }};
        String color1 = br.readLine();
        String color2 = br.readLine();
        String color3 = br.readLine();
        long index = Long.parseLong(map.get(color1) + map.get(color2));
        index *= Math.pow(10.0, (double) Integer.parseInt(map.get(color3)));
        System.out.println(index);
    }
}
 // solve 2
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));
        String[] str = {"black", "brown", "red", "orange", "yellow", "green", "blue", "violet", "grey", "white"};

        ArrayList<String> list = new ArrayList<>(Arrays.asList(str));

        int color1 = list.indexOf(br.readLine()) * 10;
        int color2 = list.indexOf(br.readLine());
        int color3 = list.indexOf(br.readLine());

        System.out.println((long)((color1 + color2)*Math.pow(10, color3)));
    }
}


10820

해당 문제는 아스키코드를 알고있거나 문자를 읽어서 같으면 카운트 세아리는 방식으로 풀 수 있습니다.
1. a ~ z : 97 ~ 122 소문자
2. A ~ Z : 65 ~ 90 대문자
3. 0 ~ 9 : 48 ~ 57 숫자
4. ' ' : 32 공백

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));
        StringBuilder sb = new StringBuilder();

        String input = null;
        int[] count;
        while((input = br.readLine()) != null) {
            count = new int[4];
            for(int i = 0; i < input.length(); i++) {
                // 문자열 1개씩
                int code = input.charAt(i);

                if(97 <= code && code <= 122) {
                    count[0] += 1;
                }else if(65 <= code && code <= 90) {
                    count[1] += 1;
                }else if(48 <= code && code <= 57) {
                    count[2] += 1;
                }else if(code == 32) {
                    count[3] += 1;
                }
            }
            for (int i : count) {
                sb.append(i).append(" ");
            }
            System.out.println(sb);
        }
    }
}


이렇게하면 출력 초과에 걸리는 것을 알 수 있습니다.
사소한 것이지만 짚고 갑시다.
코드에 보면 StringBuilder 을 초기화를 위에 했지만 이것을 반복문 안에 넣어주면 출력 초과하지 않게됩니다.

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));
        StringBuilder sb;

        String input = null;
        int[] count;
        while((input = br.readLine()) != null) {
            count = new int[4];
            sb = new StringBuilder();

            for(int i = 0; i < input.length(); i++) {
                // 문자열 1개씩
                int code = input.charAt(i);

                if(97 <= code && code <= 122) {
                    count[0] += 1;
                }else if(65 <= code && code <= 90) {
                    count[1] += 1;
                }else if(48 <= code && code <= 57) {
                    count[2] += 1;
                }else if(code == 32) {
                    count[3] += 1;
                }
            }
            for (int i : count) {
                sb.append(i).append(" ");
            }
            System.out.println(sb);
        }
    }
}


1075 (ch)

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 F = Integer.parseInt(br.readLine());

        // N을 F로
        int num1 = N % 100; // 맨 뒤 두 수
        int num2 = N - num1; // 맨 뒤 두 수를 뺀 N 값

        // 나누어 떨어지는 수 찾기
        while ((num2 % F) != 0) {
            num2++;
        }
        int index = num2 % 100; // 최종적으로 맨 뒤 두 수
        if (index > 9) {
            System.out.println(index);
        } else {
            // 맨 뒤의 두 수가 일의 자리 수라면 0을 붙여서 출력
            System.out.print('0'+index);
        }

    }
}

당연하지만 틀린코드다.
코드를 보면 마지막에 '0'+ index 이렇게 작성하는 코드는 올바른 코드가 아니며, 다른 값이 출력될 것이다.
따라서 출력문을 분리해줘서 해주면 정답이 된다.
sout('0');
sout(index);


7567 그릇, 문자열

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));

        String str = br.readLine();

        int setting = 10;

        for (int i = 1; i < str.length(); i++) {
            // 똑같다면 5
            if (str.charAt(i) == str.charAt(i - 1)) {
                setting += 5;
            } else {
                // 다르면 10
                setting -= 10;
            } 
        }
        System.out.print(setting);

    }
}


3040

문제에 힌트가 있다.
9명 난쟁이 7명 난쟁이.
2명만 솎아내서 버리면 됨.

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));

        // 의자 7, 접시 7, 나이프 7 , 난쟁이7 광산 일하러갔으나 난쟁이 9이 돌아옴
        // 난쟁이 모자 100이하 7명 난쟁이 모자숫자 합 100
        int sum = 0;
        int[] arr = new int[9];

        for (int i = 0; i < 9; i++) {
            arr[i] = Integer.parseInt(br.readLine());
            sum += arr[i];
        }
        // 비교하는 로직
        for (int i = 0; i < 8; i++) {
            for (int j = i + 1; j < 9; j++) {
                int temp = 0;
                temp = arr[i] + arr[j];
                // 모자 총 숫자 합에서 두 난쟁이의 모자 숫자 합을 빼줬을 때 0 이라면 얘네 둘을 빼면 됨.
                if (sum - temp == 100) {
                    arr[i] = 0;
                    arr[j] = 0;
                    for (int k = 0; k < 9; k++) {
                        if (k != i && k != j) {
                            System.out.println(arr[k]);
                        }
                    }
                }

            }
        }

    }
}


1159 농구 , 아스키코드

문제 풀이는 다양할 수 있습니다.
1. 해쉬맵 이용해서 풀기
2. 아스키코드 이용
저는 아스키코드 이용해서 간단히 풀도록 하겠습니다.

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));

        // 첫 글자가 같은 선수 5명 선발. 만약 없으면 기권. PREDAJA
        // 알파벳 26개 EJOTY 라서 배열크기는 26
        int[] arr = new int[26];
        int N = Integer.parseInt(br.readLine());
        // 선별 가능한지 유무 판단하려고함
        boolean ok = false;
        for (int i = 0; i < N; i++) {
            String name = br.readLine();
            char c = name.charAt(0);
            // a의 아스키코드는 97라서, 배열에 저장할 때 arr[첫글자 -97]을 이용해서 저장할 수 있습니다.
            arr[c - 97]++;
            // 만약 5명이 된다면 5명을 선발하기
            if (arr[c - 97] == 5) {
                ok = true;
            }
        }
        // 만약 선발 가능이라면
        if (ok) {
            // 알파벳 26개
            for (int i = 0; i < 26; i++) {
                if (arr[i] >= 5) {
                    // a 아스키코드 97
                    System.out.print((char) (i + 97));
                }
            }
        } else {
            System.out.print("PREDAJA");
        }
    }
}

드디어 브론즈 2 끝났습니다.
이제 스터디 공부 및 프로젝트 준비로 인하여 하루에 1문제씩 수정해나가겠습니다.
감사합니다. 좋은 하루 보내세요.

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

0개의 댓글