자바를 완벽하게 터득할 수 있는 방법은?

리진아·3일 전
0

백준 풀이

목록 보기
1/3
post-thumbnail

실무에서 개발자로 일한지 어엿 2년, 반복된 개발만 하다보니 자바에 대한 기초적인 지식을 까먹기 시작했다...

이렇게 살다간 물경력만 될 것 같아 백준을 풀어보며 기초를 다지기로 했다...!

회사에서 시간나는 틈틈히 할 거라.. 날마다 양도 다르고 안 올리는 날도 올텐데,
그럼에도 우선 꾸준히 해보려고 한다.
피드백 대환영이에요~..

1. 11720 숫자의 합

문제
N개의 숫자가 공백 없이 쓰여있다. 이 숫자를 모두 합해서 출력하는 프로그램을 작성하시오.

입력
첫째 줄에 숫자의 개수 N (1 ≤ N ≤ 100)이 주어진다. 둘째 줄에 숫자 N개가 공백없이 주어진다.

출력
입력으로 주어진 숫자 N개의 합을 출력한다.

예제 입력
5
54321

예제 출력
15


class Main {
	public static void main (String[] args) throws java.lang.Exception {
	    Scanner in = new Scanner(System.in);
	    
		int cnt = in.nextInt(); //숫자 갯수를 먼저 받고
		String numbers = in.next(); //더할 숫자들 전체를 String으로 받기
		int sum=0; //합계 초기화
		
		for(int i=0; i<cnt; i++){ //숫자 갯수만큼 반복
		    //charAt(i) : String타입의 변수에서 특정 문자를 char 타입으로 변환할 수 있는 함수
            //i자리에 int형 변수를 넣어서 원하는 위치의 문자를 가져올 수 있음.
            sum += numbers.charAt(i) - '0'; 
            // i자리에 값을 가져와서 0을 빼줘야 됨.
            //0을 빼주는 이유는 char은 유니코드(아스키코드)로 저장이 되는데, 실제 정수값을 가져오기 위해서는 0을 빼야 됨.
		}
		System.out.print(sum);
	}
}



2. 1072 게임

문제
김형택은 지금 몰래 Spider Solitaire(스파이더 카드놀이)를 하고 있다. 형택이는 이 게임을 이길 때도 있었지만, 질 때도 있었다. 누군가의 시선이 느껴진 형택이는 게임을 중단하고 코딩을 하기 시작했다. 의심을 피했다고 생각한 형택이는 다시 게임을 켰다. 그 때 형택이는 잠시 코딩을 하는 사이에 자신의 게임 실력이 눈에 띄게 향상된 것을 알았다.
이제 형택이는 앞으로의 모든 게임에서 지지 않는다. 하지만, 형택이는 게임 기록을 삭제 할 수 없기 때문에, 자신의 못하던 예전 기록이 현재 자신의 엄청난 실력을 증명하지 못한다고 생각했다.
게임 기록은 다음과 같이 생겼다.
게임 횟수 : X
이긴 게임 : Y (Z%)
Z는 형택이의 승률이고, 소수점은 버린다. 예를 들어, X=53, Y=47이라면, Z=88이다.
X와 Y가 주어졌을 때, 형택이가 게임을 최소 몇 번 더 해야 Z가 변하는지 구하는 프로그램을 작성하시오.

입력
각 줄에 정수 X와 Y가 주어진다.

출력
첫째 줄에 형택이가 게임을 최소 몇 판 더 해야하는지 출력한다. 만약 Z가 절대 변하지 않는다면 -1을 출력한다.

예제 입력 1
100 80

예제 출력 1
6

예제 입력 2
47 47

예제 출력 2
-1


class Main {
	public static void main (String[] args) throws java.lang.Exception {
	    Scanner in = new Scanner(System.in);
	    
		float X = in.nextInt(); //게임횟수
        float Y = in.nextInt(); //이긴횟수

        float Z = (Y/X)*100;  //승률
        int result = (int) Z; //소수점 제외한 승률
		
		int S=0; //승률이 변하기 위한 최소의 게임 횟수
		
		if (Z >= 99) { //승률이 이미 99 이상이면 -1 출력력
            System.out.println(-1);
            return;
        }
		
		for(int i =1; i<=X; i++){
		    float Z_i; //새로운 승률
		    
		    Z_i = ((Y+i)*100) / (X+i); // 게임을 +1 씩 추가하여
		    int result_i = (int) Z_i;
		    
		    if(result != result_i) { // 승률이 변하면 stop
		        S=i;
		        break;
		    }
		}
		
		System.out.print(S);
		
	}
}



3. 15351 인생 점수

문제
어떤 사람이 무엇을 즐기느냐에 따라 그 사람의 인생 점수를 측정할 수 있다. A를 1점, B를 2점, ... , Z를 26점으로 해, 즐기는 것의 이름의 알파벳 점수를 모두 더하면 된다. 예를 들어, "OTAKU LIFE" 는 O = 15, T = 20, A = 1, K = 11, U = 21, L = 12, I = 9, F = 6, E = 5 로 모두 더하면 100점이 된다(띄어쓰기는 무시). 하지만 "GAMING LIFE"는 총 83점으로 부족한 삶이고, "PROGRAMMING"은 131점으로 너무 힘든 삶을 살고 있다. 여러분이 할 것은 여러 개의 즐기는 것 리스트를 입력받아, 그것이 각 몇 점짜리 인생인지를 계산하는 것이다.

입력
첫 번째 줄에 즐기는 것의 개수 N이 주어진다. 뒤의 N개 줄에는 즐기는 것의 이름이 모두 영어 대문자와 띄어쓰기로 적혀 있다. 이는 30자를 넘지 않는다.

출력
각 줄에 인생 점수를 입력받은 대로 출력한다. 만약 100점이라면 100 대신 "PERFECT LIFE" 를 출력한다.

예제 입력
4
OTAKU LIFE
PRODUCER
GAMING LIFE
PROGRAMMING

예제 출력
PERFECT LIFE
PERFECT LIFE
83
131


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

class Main {
	public static void main (String[] args) throws java.lang.Exception {
	    Scanner in = new Scanner(System.in);
		int number = in.nextInt(); //입력받은 숫자
		
		for(int i=0; i<=number; i++){ //숫자만큼 개행한 문자를 String_i로 넣음
		    String String_i = in.nextLine().replaceAll("\\s+","");    //공백 제거 후
		    int text_i=0;
	        String result_i=""; //결과값
	        
		    for(int k=0; k < String_i.length(); k++){ 
		        text_i += ((int)String_i.charAt(k)-64); //알파벳을 숫자로 변환하는 코드 
                
		        if(text_i == 100){
		            result_i = "PERFECT LIFE";
		        }else{
		            result_i = String.valueOf(text_i);
		        }
		    }
		    if(i!=0){
		        System.out.println(result_i);
		    }
		}
		
		
	}
}



4. 11718 그대로 출력하기

문제
입력 받은 대로 출력하는 프로그램을 작성하시오.

입력
입력이 주어진다. 입력은 최대 100줄로 이루어져 있고, 알파벳 소문자, 대문자, 공백, 숫자로만 이루어져 있다. 각 줄은 100글자를 넘지 않으며, 빈 줄은 주어지지 않는다. 또, 각 줄은 공백으로 시작하지 않고, 공백으로 끝나지 않는다.

출력
입력받은 그대로 출력한다.

예제 입력
Hello
Baekjoon
Online Judge

예제 출력
Hello
Baekjoon
Online Judge


class Main {
	public static void main (String[] args) throws java.lang.Exception {
	    Scanner in = new Scanner(System.in);
		
		//hasNextLine() : 몇 번 입력하는지 정해져 있지 않고, 입력이 없을 때까지 반복해야할 때 사용하는 메서드
		//hasNextLine()을 사용하면 읽을 값이 있으면 true, 없으면 false
		
		for (int i = 0; i < 100 && in.hasNextLine(); i++) {  // 100번 이하로 반복하고, 더 이상 입력이 없을 때 종료
		    String text_i = in.nextLine();
		    System.out.println(text_i);
		}
		in.close();
	}
}



5. 32375 불꽃놀이

문제
INU 코드페스티벌은 불꽃놀이로 행사를 마무리합니다. 광재는 올해 불꽃놀이 담당자입니다.
누군가 폭죽을 모두 사버리는 바람에 남아있는
NN개의 폭죽으로 불꽃놀이를 진행하게 되었습니다.

모든 폭죽에는 화려한 정도를 나타내는 정수
AiA_i가 적혀있습니다. 다음 규칙을 만족하도록 불꽃놀이를 구성해야 합니다. 모든 폭죽을 사용할 필요는 없습니다.

첫 번째 불꽃놀이의 화려한 정도는
KK 이상이어야 합니다.
불꽃놀이의 화려한 정도는 이전 불꽃놀이의 화려한 정도보다 작지 않아야 합니다.
안전상의 이유로 한 번에
11개 또는
22개의 폭죽만 터트릴 수 있습니다.
22개의 폭죽을 동시에 터트리는 경우 화려한 정도는 두 폭죽의 합과 같습니다.
예를 들어, 남은 폭죽의 화려한 정도가 각각
10,4,1,8,12,510, 4, 1, 8, 12, 5이고 첫 번째 불꽃놀이의 화려한 정도가
77 이상이어야 한다면, 다음과 같이 규칙을 만족하도록 불꽃놀이를 진행할 수 있습니다.

 >
8(4+5)10128 → (4+5) → 10 → 12

위와 같이 4번 진행할 수 있습니다. 이보다 더 많은 횟수의 불꽃놀이를 규칙을 만족하도록 진행할 수는 없습니다.

만약 남은 폭죽의 화려한 정도가 각각
2,32, 3이고, 첫 번째 불꽃놀이의 화려한 정도가
77 이상이어야 한다면 규칙을 만족하도록 불꽃놀이를 진행할 수 없습니다.

학생들은 불꽃놀이를 많이 할수록 만족도가 높습니다. 광재를 도와 최대한 많은 횟수의 불꽃놀이를 만들어주세요.

불꽃놀이를 한 번 이상 진행할 수 있다면, 불꽃놀이를 최대 몇 번 진행할 수 있는지 출력해주세요. 만약 불꽃놀이를 진행할 수 없다면
1-1을 출력해주세요.

입력
첫 번째 줄에
NN
KK이 주어집니다. (
1N200000,1K1091 ≤ N ≤ 200\,000, 1 ≤ K ≤ 10^9,
KK는 정수입니다.)

두 번째 줄에 가지고 있는 폭죽의 화려한 정도를 나타내는
NN개의 정수
A1,A2...ANA_1, A_2 ... A_N가 공백으로 구분되어 주어집니다.
(1Ai109)(1 ≤ A_i ≤ 10^9)

출력
불꽃놀이를 최대 몇 번 진행할 수 있는지 출력해주세요. 만약 불꽃놀이를 진행할 수 없다면
1-1을 출력해주세요.

예제 입력 1
6 7
10 4 1 8 12 5

예제 출력 1
4

예제 입력 2
2 7
2 3

예제 출력 2
-1


class Main {
    public static void main (String[] args) throws java.lang.Exception {
        Scanner in = new Scanner(System.in);
        
        int N = in.nextInt();
        int K = in.nextInt();
        
        int[] fire = new int[N];
        for(int i=0; i<fire.length; i++){
            fire[i] = in.nextInt();
        }
        
        ArrayList<Integer> BigArr = new ArrayList<>(); // K 이상
        ArrayList<Integer> SmallArr = new ArrayList<>(); // K 미만
        
        for (int i = 0; i < fire.length; i++) {
            if(fire[i] >= K){
                BigArr.add(fire[i]);
            }else{
                SmallArr.add(fire[i]);
            }
        }
        
        // 정렬
        Collections.sort(BigArr);
        Collections.sort(SmallArr);
        
        ArrayList<Integer> result = new ArrayList<>();
        
        // K 이상인 것은 바로 result에 넣고
        result.addAll(BigArr);
        
        // 작은 수들을 두 개씩 조합해서 K 이상이면 추가
        int left = 0, right = SmallArr.size() - 1;
        while(left < right){
            int sum = SmallArr.get(left) + SmallArr.get(right);
            if(sum >= K){
                result.add(sum);
                left++;
                right--;
            }else{
                left++;
            }
        }
        
        // 아무것도 못 만든 경우는 -1 출력
        if(result.size() == 0){
            System.out.println("-1");
            return;
        }
        
        // 오름차순 정렬 (불꽃놀이 순서용)
        Collections.sort(result);
        
        // 불꽃놀이 진행: 이전 값보다 크거나 같은 것만 가능
        int count = 1; // 최소 하나는 됨
        int prev = result.get(0);
        
        for(int i = 1; i < result.size(); i++){
            if(result.get(i) >= prev){
                count++;
                prev = result.get(i);
            }
        }
        
        System.out.println(count);
        
        in.close();
    }
}

이 문제는 풀다가 너무 어려워서 chatGPT에 도움을 좀 받았다.. ㅜ

profile
이것저것 개발 블로그

0개의 댓글