기초부터 탄탄히ᯓ★.ᐟ

리진아·1일 전
0

백준 풀이

목록 보기
2/3

오늘은 화요일이다. 퇴근하고 회식이 있는 날이다..
그덕에 퇴근 후 학교에 가지 않게 되었지만,, 🥲




집에 가고 싶다!!!!!




오늘은 단계별로 풀어보기 문제를 풀었다.
어디서부터 할까 하다가 그냥 1단계부터 풀어봤다.
기초가 탄탄해야 실력이 늘겠지...
....
.
..
.
열심히 하자 ^__^


실은 정말 간단한 문제들이지만, 모르거나 헷갈리는 내용이 많았다.
오늘은 그런 내용들을 정리해보려고 한다.






1. 입출력과 사칙연산

이 단계에선 사실 어려운 부분은 없었다.
그런데 개를 출력하는 문제 중 생각없이 복붙해서 출력하다 컴파일 에러가 났다.

10172 개 🐶

문제
아래 예제와 같이 개를 출력하시오.

입력
없음.

출력
개를 출력한다.🐕


class Main {
    public static void main (String[] args) throws java.lang.Exception {
        Scanner in = new Scanner(System.in);
        
        System.out.println("|\\_/|");
        System.out.println("|q p|   /} ");
        System.out.println("( 0 )\"\"\"\\ ");
        System.out.println("|\"^\"`    | ");
        System.out.println("||_/=\\\\__| ");
    }
}

자바에서 특수문자를 출력하려면 앞에 백슬래시를 추가해야 한다는 것을 까먹었다...
(그치만 너무 옛날에 배운 내용인걸요~~)



2. 조건문


2525 오븐 시계 ⏱️

이 문제도 어렵진 않았는데 예외 경우가 많아서 4번이나 다시 했다 ㅋㅋㅋ
은근 머리로 생각해야 하는 게 이런 문제 푸는 게 처음이라 재미도 있었는데 신선했다.


문제
KOI 전자에서는 건강에 좋고 맛있는 훈제오리구이 요리를 간편하게 만드는 인공지능 오븐을 개발하려고 한다. 인공지능 오븐을 사용하는 방법은 적당한 양의 오리 훈제 재료를 인공지능 오븐에 넣으면 된다. 그러면 인공지능 오븐은 오븐구이가 끝나는 시간을 분 단위로 자동적으로 계산한다.

또한, KOI 전자의 인공지능 오븐 앞면에는 사용자에게 훈제오리구이 요리가 끝나는 시각을 알려 주는 디지털 시계가 있다.

훈제오리구이를 시작하는 시각과 오븐구이를 하는 데 필요한 시간이 분단위로 주어졌을 때, 오븐구이가 끝나는 시각을 계산하는 프로그램을 작성하시오.

입력
첫째 줄에는 현재 시각이 나온다. 현재 시각은 시 A (0 ≤ A ≤ 23) 와 분 B (0 ≤ B ≤ 59)가 정수로 빈칸을 사이에 두고 순서대로 주어진다. 두 번째 줄에는 요리하는 데 필요한 시간 C (0 ≤ C ≤ 1,000)가 분 단위로 주어진다.

출력
첫째 줄에 종료되는 시각의 시와 분을 공백을 사이에 두고 출력한다. (단, 시는 0부터 23까지의 정수, 분은 0부터 59까지의 정수이다. 디지털 시계는 23시 59분에서 1분이 지나면 0시 0분이 된다.)

예제입력 1
14 30
20

예제 출력 1
14 50

예제 입력 2
17 40
80

예제 출력 2
19 0

예제 입력 3
23 48
25

예제 출력 3
0 13


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 A = in.nextInt();
        int B = in.nextInt();
        int C = in.nextInt();
        
        String result ="";
        
        
        
        if((B+C)/60 < 1){ // 합친 시간이 60분 안 됨 시X 분만 더하기
            B= B+C;
        }else{ //합친 시간이 60분 넘었어
        
            if(A+((B+C)/60) >= 24){ //근데 시간이 24시를 넘었음
                
               A = (A+((B+C)/60))%24;
               B = (B+C)%60;
            }else{ //시간은 24시를 넘지는 않았음
                
                A = (A+((B+C)/60));
                B = (B+C)%60;
            }
        }
        
        System.out.println(A+" "+B);
    }
}



3. 반복문


3단계 또한 어렵지 않게 풀었는데...






세상에!!!!!!!!!!!
별찍기가 이렇게 어려웠나?
과거의 나 반성해!!!!!! ㅜㅜ


2439 별찍기 -2 ⭐

문제
첫째 줄에는 별 1개, 둘째 줄에는 별 2개, N번째 줄에는 별 N개를 찍는 문제

하지만, 오른쪽을 기준으로 정렬한 별(예제 참고)을 출력하시오.

입력
첫째 줄에 N(1 ≤ N ≤ 100)이 주어진다.

출력
첫째 줄부터 N번째 줄까지 차례대로 별을 출력한다.



뭔가... 머리속으로 이해는 되는데 막상 하려니까 쉽지는 않았다.

그래도 성공~!!

class Main {
	public static void main (String[] args) throws java.lang.Exception {
	    Scanner in = new Scanner(System.in);
		int a = in.nextInt();
		
		for(int i=0; i<a; i++){
		    for(int j=1; j<a-i; j++){
	            System.out.print(" ");
	        }
		    for(int k=0; k<i+1; k++){
		        System.out.print("*");
		    }
		    System.out.print("\n");
		}

	}
}



15552 빠른 A+B 😵


이 문제는 푸는데 정말.. 오래걸렸다.
..
...........

이유는 BufferedReader와 BufferedWriter를 처음 사용해봤기 때문에!!


문제
본격적으로 for문 문제를 풀기 전에 주의해야 할 점이 있다. 입출력 방식이 느리면 여러 줄을 입력받거나 출력할 때 시간초과가 날 수 있다는 점이다.

C++을 사용하고 있고 cin/cout을 사용하고자 한다면, cin.tie(NULL)과 sync_with_stdio(false)를 둘 다 적용해 주고, endl 대신 개행문자(\n)를 쓰자. 단, 이렇게 하면 더 이상 scanf/printf/puts/getchar/putchar 등 C의 입출력 방식을 사용하면 안 된다.

Java를 사용하고 있다면, Scanner와 System.out.println 대신 BufferedReader와 BufferedWriter를 사용할 수 있다. BufferedWriter.flush는 맨 마지막에 한 번만 하면 된다.

Python을 사용하고 있다면, input 대신 sys.stdin.readline을 사용할 수 있다. 단, 이때는 맨 끝의 개행문자까지 같이 입력받기 때문에 문자열을 저장하고 싶을 경우 .rstrip()을 추가로 해 주는 것이 좋다.

또한 입력과 출력 스트림은 별개이므로, 테스트케이스를 전부 입력받아서 저장한 뒤 전부 출력할 필요는 없다. 테스트케이스를 하나 받은 뒤 하나 출력해도 된다.

자세한 설명 및 다른 언어의 경우는 이 글에 설명되어 있다.

입력
첫 줄에 테스트케이스의 개수 T가 주어진다. T는 최대 1,000,000이다. 다음 T줄에는 각각 두 정수 A와 B가 주어진다. A와 B는 1 이상, 1,000 이하이다.

출력
각 테스트케이스마다 A+B를 한 줄에 하나씩 순서대로 출력한다.

예제 입력
5
1 1
12 34
5 500
40 60
1000 1000

예제 출력
2
46
505
100
2000



class Main {
	public static void main (String[] args) throws java.lang.Exception {
	    /*Scanner in = new Scanner(System.in);
		int a = in.nextInt();*/
		
		//Scanner와 Sysout를 사용하지 않고 BufferedReader와 BufferedWriter를 사용하기
		
        BufferedReader bf = new BufferedReader(new InputStreamReader(System.in)); //입력 선언
        BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(System.out)); //출력 선언
        
        /*String s = bf.readLine(); */ // String변수 readLine은 한 줄 입력받는 것
        
        int number = Integer.parseInt(bf.readLine()); //Int변수 readLine사용
        
        for(int i= 0; i<number; i++){
            String [] input = bf.readLine().split(" "); //공백으로 나눠서 받아야 됨 Int로 인식을 못하기 때문에
            //String으로 받고 Integer로 형변환환
            int n1_i = Integer.parseInt(input[0]);
            int n2_i = Integer.parseInt(input[1]);
            
            bw.write(n1_i+n2_i+"\n");
             
        }
        
        bw.close();   //스트림을 닫음

	}
}

이 문제에서 readLine()read()의 차이점을 깨닫고,
공백이 포함된 숫자는 readLine()으로 읽을 때 Int로 인식 못한다는 사실을 알고
String으로 받고 Integer로 형변환해야 한다는 것을 알게 되었다.



10952 A+B - 5 🥹

문제
두 정수 A와 B를 입력받은 다음, A+B를 출력하는 프로그램을 작성하시오.

입력
입력은 여러 개의 테스트 케이스로 이루어져 있다.

각 테스트 케이스는 한 줄로 이루어져 있으며, 각 줄에 A와 B가 주어진다. (0 < A, B < 10)

입력의 마지막에는 0 두 개가 들어온다.

출력
각 테스트 케이스마다 A+B를 출력한다.

예제 입력
1 1
2 3
3 4
9 8
5 2
0 0

예제 출력
2
5
7
17
7


이문제를 적은 이유는 for문을 사용하니 에러가 났다.
단계가 반복문이라 실무에서 for문을 가장 많이 사용하기에 for문으로 구현했는데

계속 런타임 에러가 발생했다!!

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);
		
		/*
		for(int i=0; in.hasNextLine(); i++){
		    int b_i = in.nextInt();
		    int c_i = in.nextInt();
		    
		    if(b_i!=0 && c_i !=0){
    		    System.out.println(b_i+c_i);
		    }
		}
		*/
		
		// for문을 사용하니 런타임 에러가 났음 
		// 이유는 Scanner.nextInt()가 입력값이 없는 상황에서도 계속 입력을 받으려고 하기 때문
		// in.hasNextLine()는 줄이 있으면 true를 반환하지만,
        // nextInt()는 공백 기준으로 입력을 받기 때문에 엔터만 치거나 비어있는 줄에서는 예외가 발생할 수 있음
		
		while (in.hasNextInt()) {
            int b_i = in.nextInt();
            int c_i = in.nextInt();
            
            if (b_i != 0 && c_i != 0) {
                System.out.println(b_i + c_i);
            }
        }
		

	}
}


결론적으로 while문을 사용하니 정상 작동 됨.
이유는 입력받는 숫자의 갯수에 제한이 없다보니
hasNextLine()를 사용했었음.

hasNextLine() : 읽을 값이 있으면 true, 없으면 false 출력


그러다보니,, 엔터만 치거나 비어있는 줄에서는 예외가 발생할 수 있어서 에러가 났던 거였음..ㅋㅋ



4. 1차원 배열


실은 나는 학교에서 수업을 포기했을 시기가 배열을 배울 때였다..
array랑 list랑... 자료구조부터해서 너무 어려웠다......ㅜㅜ


그래서 그런지 한 문제씩 풀 때마다 시간이 많이 걸렸다.


10818 최소, 최대 🧑‍🎄

문제
N개의 정수가 주어진다. 이때, 최솟값과 최댓값을 구하는 프로그램을 작성하시오.

입력
첫째 줄에 정수의 개수 N (1 ≤ N ≤ 1,000,000)이 주어진다. 둘째 줄에는 N개의 정수를 공백으로 구분해서 주어진다. 모든 정수는 -1,000,000보다 크거나 같고, 1,000,000보다 작거나 같은 정수이다.

출력
첫째 줄에 주어진 정수 N개의 최솟값과 최댓값을 공백으로 구분해 출력한다.

예제 입력
5
20 10 35 30 7

예제 출력
7 35



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 a = in.nextInt();
	    
	    ArrayList<Integer> numbers = new ArrayList<Integer>();
	    
	    int prev = 0;
	    
	    for(int i=0; i<a; i++){
	        int num_i=in.nextInt();
	        numbers.add(num_i);
	        
	    }
	    
	    //초기 세팅을 0으로 잡으면 배열에 0보다 큰 수가 있을 경우 인식 불가.
	    int min = Integer.MAX_VALUE;
        int max = Integer.MIN_VALUE;

	    
	    for(int num : numbers){
	        min = Math.min(min, num);
            max = Math.max(max, num);
	    }
	    
	    System.out.print(min+" "+max);
	}
}

이 문제를 적은 이유는 우선 array가 아닌 arraylist를 사용했다.
그 이유는 배열의 크기가 정해지지 않았기 때문이다!


그리고 처음에는 최솟값 최댓값을 0으로 초기화를 했었는데
가장 작은 숫자가 0보다 클 경우 초기값인 0으로 잡혀서


Integer.MAX_VALUE
Integer.MIN_VALUE


을 사용했다! 그리고 최솟값과 최댓값을 구할 때 반복문으로 할까 하다가 그냥 Math 함수를 사용했다. (이래도 되나?)
결과만 잘 나온다면 뭐 ...ㅎㅎ



10813 공 바꾸기 🏀

문제
도현이는 바구니를 총 N개 가지고 있고, 각각의 바구니에는 1번부터 N번까지 번호가 매겨져 있다. 바구니에는 공이 1개씩 들어있고, 처음에는 바구니에 적혀있는 번호와 같은 번호가 적힌 공이 들어있다.

도현이는 앞으로 M번 공을 바꾸려고 한다. 도현이는 공을 바꿀 바구니 2개를 선택하고, 두 바구니에 들어있는 공을 서로 교환한다.

공을 어떻게 바꿀지가 주어졌을 때, M번 공을 바꾼 이후에 각 바구니에 어떤 공이 들어있는지 구하는 프로그램을 작성하시오.

입력
첫째 줄에 N (1 ≤ N ≤ 100)과 M (1 ≤ M ≤ 100)이 주어진다.

둘째 줄부터 M개의 줄에 걸쳐서 공을 교환할 방법이 주어진다. 각 방법은 두 정수 i j로 이루어져 있으며, i번 바구니와 j번 바구니에 들어있는 공을 교환한다는 뜻이다. (1 ≤ i ≤ j ≤ N)

도현이는 입력으로 주어진 순서대로 공을 교환한다.

출력
1번 바구니부터 N번 바구니에 들어있는 공의 번호를 공백으로 구분해 출력한다.

예제 입력
5 4
1 2
3 4
1 4
2 2

예제 출력
3 1 4 2 5


스스로도 안다... 배열에 대한 지식이 얼마나 부족한지를...

그래서

이 문제를 푸는데 솔직히 어려웠다.



import java.util.*;

class Main {
    public static void main (String[] args) throws java.lang.Exception {
        Scanner in = new Scanner(System.in);
        
        int N = in.nextInt(); //바구니 갯수
        int M = in.nextInt(); //총 4번 시행됨
         
        int[] bags = new int[N];
        
        for(int s=0; s<N; s++){
            bags[s] = s+1;   
        }
        
        for(int i=0; i<M; i++){
            int a_i = in.nextInt() ;
            int b_i = in.nextInt() ;
            
            int c_i = bags[a_i-1];
            int d_i = bags[b_i-1];
            
            bags[a_i-1] = d_i;
            bags[b_i-1] = c_i;
            
        }
        
        for(int k=0; k<N; k++){
            System.out.print(bags[k]+" ");
        }
        
    }
}



바구니를 배열로 생성할 것인지, 입력받은 숫자들을 배열로 담을 것인지 부터
....
..
....
....
bags 배열에 바구니 번호와 같은 공을 넣기 위해 처음 초기화할 때 s+1을 해주는 부분이라던지,
...
..
..
.
..
공 바꾸기를 하기 위해 세세하게 신경써야 하는 부분이라던지...
..
.
.
...

헷갈리는 것들 투성이었지만, 그래도 해냈다!
후훗






오늘은 여기까지만 포스팅 하려고 한다. 애초에 문제를 많이 풀지도 않았지만,,
곧 퇴근시간이다~~ 이만 회식하러 가보겠다

내 개발 블로그를 보는 사람은 없지만 언젠간 꾸준하게 적은 노력이
보상으로 다가올까?


profile
알맹이가 가득 찬 개발자가 되기 위해 한 걸음 더 다가가는,

0개의 댓글