Baekjoon 브론즈 3

ChoRong0824·2023년 2월 14일
0

Java

목록 보기
6/31
post-thumbnail

이 문제에서 가장 중요한 점이 파일 종료 조건이 없이 그냥 입력이 주어졌다는 것이다.
즉 입력에서 더이상의 읽을 수 있는 데이터가 존재하지 않을 때 반복문을 종료하라는 것이다.
이렇게 데이터가 더이상 존재하지 않을 때 우리는 EOF (End of File) 즉, 파일의 끝이라 한다.

2490

StringTokenizer st = new StringTokenizer(br.readLine(),””);
while (st.haseMoreTokens()){
sum+= Integer.parseInt(st.nextToken());
}
sb.append(yut[sum] +”\n“);
}
  1. StringTokenizer
  • 사용자가 지정하는 구분자를 경계로 하여 문자열을 나눠주는 Class.

  • 만약 사용자가 구분자 지정을 생략하면 공백이나 탭이 기본 구분자로 사용된다.

  • StringTokenizer 클래스 생성자의 3번째 인수로 구분자를 토큰에 포함할지의 여부를 지정할 수 있다.

  • 3번째 인수 생략시(false) 구분자는 토큰에 포함되지 않지만, 3번째 인수에 true를 입력하면 구분자도 토큰으로 취급한다.

  • StringTokenizer 클래스 생성자의 2번째 인수로 구분자를 여러개 지정할 수 있다.

(변수에 저장된 문자열의 시작인 사과에서 끝인 대추까지 진행되어야 합니다. 그래서 while문을 사용하여, 문자열의 끝까지 구분할 수 있도록 반복문을 뺑뺑 돌리겠습니다.
이 때 함께 사용할 수 있는 메소드가 "hasMoreTokens()"와 "nextToken()"입니다.)

  1. hasMoreTokens()
  • StringTokenizer 클래스 객체에서 다음에 읽어 들일 token이 있으면 true, 없으면 false를 return한다.
  1. nextToken()
  • StringTokenizer 클래스 객체에서 다음 토큰을 읽어 들인다.

5086

 		BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        StringBuilder sb = new StringBuilder();
        StringTokenizer st;
		
        String f = "factor\n";
        String m = "multiple\n";
        String n = "neither\n";

        while (true) {

            st = new StringTokenizer(br.readLine());

            int a = Integer.parseInt(st.nextToken());
            int b = Integer.parseInt(st.nextToken());

            if (a==0&&b==0) break;

            if (b % a == 0) {
                sb.append(f);
            }
            else if (a % b == 0) {
                sb.append(m);
            } else sb.append(n);

        }
        System.out.println(sb);

0이 올 때까지 받는 방법은 while 반복문에 만약에 0일 경우 탈출로 작성.
당연지사 토큰은 새로 생성해야함 (매줄마다 =>br.readLine)

2455

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

public class Main {
    public static void main(String[] args) throws IOException {

        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        StringTokenizer st;

        int max = 0;
        int now = 0;
        int out = 0;
        int in = 0;

        for (int i = 0; i < 4; i++) {
            st = new StringTokenizer(br.readLine());
            out = Integer.parseInt(st.nextToken());
            in = Integer.parseInt(st.nextToken());

            now = now - out + in;
            max = Math.max(now, max);
        }
        System.out.print(max);
    }
}

계속 런타임 에러가 낫었는데 이유를 모르다가 이해를 하게됨.
br.readLine()," "); 를 작성해서 사용했기 때문에 인풋 값에서 런타임이 걸린거임.
한마디로 이걸 고쳐서 br.readLine(); 로 수정해주니 돌아감.

2914

올림문제. 올림하는 것을 수학적으로 생각하고, 이를 구현해낼 줄 알면 되는 문제,
한마디로 곱한값에 +1 해주면됨.
한마디로 평균은 올림되었으니까 B-1 해줘야 원래 값을 알 수 있고, 거기에 a를 곱해주고 +1 해줘야한다. 왜냐하면 조건이 1이상이기때문에.

10162

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

public class Main {
    public static void main(String[] args) throws IOException {

        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(System.out));
        int T = Integer.parseInt(br.readLine());
        int A,B,C;
        if((T % 300 % 60 % 10) == 0){
            A = T / 300;
            B = (T % 300) / 60;
            C = ((T % 300) % 60) / 10;
            bw.write(A +" "+ B +" "+ C);
        }else{
            bw.write("-1");
        }
        bw.flush();
        bw.close();
    }
}

일의 우선순위를 생각해서 큰 값을 먼저 나눠주고 그다음 값을 나눠준다. 이런식으로 순차적으로 나눠주면 된다.

2576

Math 메서드를 활용해서 풀면되는 문제입니다.
temp에는 최댓값인 100을 넣어주고, Math 메서드를 사용해서 값 비교를 해주면 됩니다.

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

public class Main {
    public static void main(String[] args) throws IOException {

        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));

        int sum = 0;
        int temp=100;
        for (int i = 0; i < 7; i++) {
            int N = Integer.parseInt(br.readLine());

            //홀수
            if (N % 2 != 0) {
                sum += N;
                temp = Math.min(temp, N);
            }
         }
        if (sum == 0) {

            System.out.print(-1);
        } else {
            System.out.println(sum);
            System.out.print(temp);
        }

    }
}

2501

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

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

        int N = Integer.parseInt(st.nextToken());
        int K = Integer.parseInt(st.nextToken());
        int temp = 0;
        int count = 0;
        for (int i = 1; i <= N; i++) {
            if (N % i == 0) {
                count++;
            }
            if (count==K){
                temp = i;
                break;
            }
        }
        System.out.print(temp);
    }
}

원래는 temp=i;를 위에 반복문(N%I)에 넣어줬는데 약수 카운터 갯수 초과를 못잡았었다.
그런데 위치를 바꾸니 약수의 갯수를 잡았다.
즉, 갯수와 입력 순서가 같을경우 temp에 i를 넣는다면 정상 출력된다는 것이다.
즉, 로직을 제대로 이해하지 못한 것이다.

10886

import java.io.*;
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 count =0;
        
        for(int i=0;i<N;i++){
            int A= Integer.parseInt(br.readLine());
             if ( A == 0) {
                count++;
            } else if (A == 1) {
               count--;
            }
        }
           

        if (count>0) {
            System.out.print("Junhee is not cute!");
        }else if (count<0){
            System.out.print("Junhee is cute!");
        }
    }
}

쫄지말자. 글을 잘 읽고 풀면 되는 문제이다.
첫 째줄에는 몇개를 입력받을 것인지 나오는 것이다.
그 이후로는 당연지사 0아니면 1을 입력 받는다.
그후 갯수를 세아려 if절 사용하면 해결.

10824

버퍼를 쓰면서 타입에 대해 제대로 이해를 못한 문제라고 생각한다.
문제는 상당히 쉬운 수준이었다.
간단히 생각한다면, A 문자열과 B 문자열을 합친 숫자와 CD는 int 범위를 초과한다.
그래서,각각의 변수 타입은 long 이고, 두 값을 더한 값 또한 long 이어야만 한다.

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

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

        long ab = Long.valueOf(st.nextToken() + st.nextToken());
        long cd = Long.valueOf(st.nextToken() + st.nextToken());
        System.out.println(ab + cd);
    }
}

2460

간단한 문제이다. 초기화 2개 현재 값과 최대 값을 초기화 해주면 되는 문제이다.

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

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

        for (int i = 0; i < 10; i++) {
            StringTokenizer st = new StringTokenizer(br.readLine());
            int out = Integer.parseInt(st.nextToken());
            int in = Integer.parseInt(st.nextToken());

            now -= out;
            now += in;
            max = Math.max(max, now);
        }
        System.out.print(max);

    }
}

이 로직만 이해하면 쉽게 풀리는 문제입니다.

// 1일 경우 카운트 해줘야하기 때문에 반복문 걸어주고,  점수 1씩 증가.
                if ( a== 1) {
                    score++;
                    total += score;
                } else {
                    score = 0; // 문제가 틀리면 리셋
                }

2935

이 문제 같은 경우 필자도 아무 생각도 안하고 long 타입으로 풀었었다.
A와 B의 범위가 long형의 범위를 초과하기 때문이다.
따라서, 이 문제에서는 큰 정수를 다루는 BigIntger를 사용해야 한다.

 long a = Long.valueOf(br.readLine());
        String sub = br.readLine();
        long b = Long.valueOf(br.readLine());

이런 식으로 풀었었다. 하지만 틀렸다, 왜냐하면 long 타입으로 하면 초과하기 때문에 BigInteger을 사용해준다 따라서

15894

간단한 문제이다. 쉽게 로직을 생각해보면 된다.
이 문제를 보면 3가지가 생각되어야한다.
1. 줄을 입력받는다 -> 1번...n
2. 사각형의 총 갯수는 1..3..6..(2n+1) 사실상 이건 필요없는 내용.
3. 길이는 사각형의 갯수를 (1+1+1+1)...(2+2+2+2)...(3+3+3+3)인셈이다.
4. int로 하면 안된다. 대부분의 사람이 여기서 틀렸을 것 같다. long,아니면 BingInteger을 사용하면 될 것 같다.
ㅋㅋㅋ 왜냐면 필자도 4번을 깜빡하고 안쓰고 간단하게만 생각했기 때문에 틀렸다

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

        System.out.print(Integer.parseInt(br.readLine())*4);
    }
}

필자는 long을 사용했습니다.

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

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

0개의 댓글