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