백준

6주차_백준 문제풀이

JANNNNNN 2023. 5. 21. 17:46

목차

1. 문제 10866

2. 문제 2309

3. 문제 1978


1. 문제 10866

풀이

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.ArrayDeque;

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());
		StringBuilder sb = new StringBuilder();
		ArrayDeque<Integer> dq = new ArrayDeque<Integer>();
		
		for(int i=0; i<N;i++) {
			String[] s = br.readLine().split(" ");
			
			switch(s[0]) {
			case "push_front": {
				dq.addFirst(Integer.parseInt(s[1]));
				break;
			}
			
			case "push_back": {
				dq.addLast(Integer.parseInt(s[1]));
				break;
			}

			case "pop_front": {
				if (dq.isEmpty()) {
					sb.append(-1).append('\n');
				} 
				else {
					sb.append(dq.pollFirst()).append('\n');
				}
				break;
			}

			case "pop_back": {
				if (dq.isEmpty()) {
					sb.append(-1).append('\n');
				} 
				else {
					sb.append(dq.pollLast()).append('\n');
				}
				break;
			}

			case "size": {
				sb.append(dq.size()).append('\n');
				break;
			}

			case "empty": {
				if (dq.isEmpty()) {
					sb.append(1).append('\n');
				} 
				else {
					sb.append(0).append('\n');
				}
				break;
			}

			case "front": {
				if (dq.isEmpty()) {
					sb.append(-1).append('\n');
				} 
				else {
					sb.append(dq.peekFirst()).append('\n');
				}
				break;
			}

			case "back": {
				if (dq.isEmpty()) {
					sb.append(-1).append('\n');
				} 
				else {
					sb.append(dq.peekLast()).append('\n');
				}
				break;
			}
		}
	}
	System.out.println(sb);
}
}

기본설명

Deque덱은 Double-ended queue의 줄임말로 단방향 연결리스트가 아닌 양방향 연결리스트이다.

덱의 장점은 메서드에 따라 스택처럼 사용할 수도 있꼬 큐처럼 사용할 수도 있는 자료구조이다.

덱은 삽입, 삭제가 총 12가지가 있다. offer(add)는 offerLast(addLast)와 같고, poll(remove)은 pollFirst(removeFirst)와 같다.

즉, offerLast, offerFirst, pollFirst, pollLast만 정확하게 구현하면 된다.

peekFirst와 peekLast는 덱의 앞과 마지막 쪽 엘리먼트를 제거하지 않은 채 값을 리턴하는 것이다.

코드설명

public static void main(String[] args) throws IOException {
		BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
		
		int N = Integer.parseInt(br.readLine());
        //버퍼 리더로 읽어온 값을 정수로 변환한다.
		StringBuilder sb = new StringBuilder();
        //값이 계속 바뀌면서 출력되기 때문에 StringBuilder를 이용한다.
		ArrayDeque<Integer> dq = new ArrayDeque<Integer>();
		//Deque은 배열을 이용하므로 ArrayDeque라는 이름으로 생성한다.
		for(int i=0; i<N;i++) {
			String[] s = br.readLine().split(" ");
        // N만큼 for문을 돌고 Stirng s에 띄어쓰기를 기준으로 값을 저장한다. ex)push_back과 1
switch(s[0]) { //첫 번째 값을 기준으로 반복문을 돌린다.
			case "push_front": {
				dq.addFirst(Integer.parseInt(s[1]));
				break;
			}
			
			case "push_back": {
				dq.addLast(Integer.parseInt(s[1]));
				break;
			}

			case "pop_front": {
				if (dq.isEmpty()) {
					sb.append(-1).append('\n');
				} 
				else {
					sb.append(dq.pollFirst()).append('\n');
				}
				break;
			}

			case "pop_back": {
				if (dq.isEmpty()) {
					sb.append(-1).append('\n');
				} 
				else {
					sb.append(dq.pollLast()).append('\n');
				}
				break;
			}

			case "size": {
				sb.append(dq.size()).append('\n');
				break;
			}

			case "empty": {
				if (dq.isEmpty()) {
					sb.append(1).append('\n');
				} 
				else {
					sb.append(0).append('\n');
				}
				break;
			}

			case "front": {
				if (dq.isEmpty()) {
					sb.append(-1).append('\n');
				} 
				else {
					sb.append(dq.peekFirst()).append('\n');
				}
				break;
			}

			case "back": {
				if (dq.isEmpty()) {
					sb.append(-1).append('\n');
				} 
				else {
					sb.append(dq.peekLast()).append('\n');
				}
				break;
			}
		}
	}
	System.out.println(sb);

위와 같은 사진으로 덱에 저장된다.

메서드 정의는 덱 자료구조 원리를 이해하고 있다면 쉽게 풀 수 있으므로 자세한 설명은 생략하겠다.


2. 문제 2309

풀이

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.Arrays;

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

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

		int[] high = new int[9];
		int sum = 0;
		int spyA = 0, spyB = 0;

		for (int i = 0; i < high.length; i++) { // 난쟁이 키 입력
			high[i] = Integer.parseInt(bf.readLine());
			sum += high[i]; // sum은 난쟁이 9명의 키의 합
		}
		Arrays.sort(high); //키를 오름순서로 정렬
		
		for(int a = 0; a < high.length-1; a++) { //브루트 포스
			for(int b = a+1; b < high.length; b++) {
				if(sum - high[a] - high[b] == 100) { //핵심
					spyA = a;
					spyB = b;
					break;
				}
			}
		}
		
		for(int j = 0; j < high.length; j++) { // 진짜 난쟁이 키 출력
			if(j == spyA || j == spyB) //주의
				continue;
			System.out.println(high[j]);
		}
	}
}

코드설명

BufferedReader bf = new BufferedReader(new InputStreamReader(System.in));
//버퍼리더로 값을 받아준다.
		int[] high = new int[9];
        //9명의 난쟁이만큼 배열을 생성해준다.
		int sum = 0;//총합을 미리 초기화해준다.
		int spyA = 0, spyB = 0; //나머지 스파이 난쟁이 둘도 미리 선언해준다.

		for (int i = 0; i < high.length; i++) { // 난쟁이 키 입력
			high[i] = Integer.parseInt(bf.readLine());
			sum += high[i]; // sum은 난쟁이 9명의 키의 합
		}
        //난쟁이 9명의 키의 합을 sum에 저장한다.
		Arrays.sort(high); //키를 오름순서로 정렬
for(int a = 0; a < high.length-1; a++) { //브루트 포스
			for(int b = a+1; b < high.length; b++) {
				if(sum - high[a] - high[b] == 100) {
                //if문이 100이면 high[a], high[b]는 가짜 난쟁이일 것이다.
					spyA = a;
					spyB = b;
					break;
				}
			}
		}
		
		for(int j = 0; j < high.length; j++) { // 진짜 난쟁이 키 출력
			if(j == spyA || j == spyB) //가짜 난쟁이를 제외하고 출력한다.
				continue;
			System.out.println(high[j]);
		}
	}

3. 문제 1978

풀이

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.StringTokenizer;

public class Main {
	public static void main(String[] args)throws IOException {
		BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        int num = Integer.parseInt(br.readLine());
        StringTokenizer st = new StringTokenizer(br.readLine());
        
        int isPN;
        int cnt=0;
        
        for(int i=0; i<num; i++){
            isPN = Integer.parseInt(st.nextToken());
            for(int p=2; p<=isPN; p++){
                if(p == isPN){
                    cnt++;
                }
                if(isPN % p == 0){
                    break;
                }
            }
        }
        System.out.println(cnt);
    }
}

설명

BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        int num = Integer.parseInt(br.readLine()); //입력받을 개수 num
        StringTokenizer st = new StringTokenizer(br.readLine());
        //띄어쓰기를 기준으로 st에 값을 저장할 것.
        int isPN; //st에 값을 하나씩 받을 변수
        int cnt=0; //소수 개수 셀 변수 초기화
for(int i=0; i<num; i++){
        isPN = Integer.parseInt(st.nextToken()); //st의 값을 하나씩 받는다.
        for(int p=2; p<=isPN; p++){ //
                if(p == isPN){ //p와 isPN의 값이 같아질 정도로 나누어졌다면 소수이다.
                    cnt++;
                }
                if(isPN % p == 0){ //isPN와 p가 나누어지면 소수가 아니다.
                    break;
                }
            }
        }
        System.out.println(cnt);