3주차_백준 문제풀이
목차
1. 문제 10820
2. 문제 10845
3. 문제 11655
1. 문제 10820

풀이



설명
문자열 N개를 입력받아 소문자, 대문자, 숫자, 공백 순으로 각각 개수를 반환하는 문제입니다.
BufferedReader를 통해 입력을 받고 String s으로 읽어줍니다.
4개를 반환값으로 하기 때문에 sch, bch, num, blank를 초기화해줍니다.
그리고 if else문으로 각 조건에 맞을 때 마다 ++합니다.
마지막으로 printf로 값을 반환합니다.
에러
나는 처음에
Exception in thread "main" java.lang.Error: Unresolved compilation problem:
라는 에러가 났는데
찾아보니 public를 제거하면 에러가 안난다고 해서
public class baekjoon10820
를
class baekjoon10820
로 바꿨더니 해결되었다!
추가
BufferedReader와 BufferedWriter 클래스의 메소드들은 입출력에러가 발생할 경우 자체적으로 IOException을 던지도록 정의되어있습니다.
그러므로 이 메소드들을 사용할 때 반드시 예외처리를 해주어야 합니다.
메인함수를 작성할 때 throws IOException으로 처리해주면 편리합니다.
2. 문제 10845
풀이
기본설명
기본적으로 Queue은 먼저 들어간 자료가 먼저 나오는 구조 FIFO(First In FIrst Out) 구조입니다.
까먹지 않기 위해 Stack과 차이점도 살펴보겠습니다.
Stack은 후입선출(LIFO, Last In First Out) 방식의 자료구조입니다.
[Queue사용법]
import java.util.LinkedList; //import
import java.util.Queue; //import
Queue<Integer> queue = new LinkedList<>(); //int형 queue 선언, linkedlist 이용
Queue<String> queue = new LinkedList<>(); //String형 queue 선언, linkedlist 이용
자바에서 큐는 LinkedList를 활용하여 생성해야 합니다.
그렇기에 Queue와 LinkedList가 다 import되어 있어야 사용이 가능합니다.
Queue<Element> queue = new LinkedList<>()와 같이 선언해주면 됩니다.
Queue<Integer> queue = new LinkedList<>(); //int형 queue 선언
queue.add(1); // queue에 값 1 추가
queue.add(2); // queue에 값 2 추가
queue.offer(3); // queue에 값 3 추가
참고로 Queue에 값을 추가하고 싶다면 add 또는 offer를 사용하면 됩니다.
코드설명
BufferedReader br = new BufferedReader(new InputStreamReader(System.in)); //BufferedReader 사용하여 값을 읽기.
int N = Integer.parseInt(br.readLine()); //BufferedReader는 기본값이 String이기 때문에 Integer로 형변환!
StringBuilder sb = new StringBuilder(); //수정할 수 있도록 String이 아닌 StringBuilder사용.
Queue<Integer> que = new LinkedList<Integer>(); // Queue 생성
int last = 0; //기본값 초기화 진행
입력 받을 BufferedReader 생성.
읽을 객체 N.
수정할 수 있는 StringBuilder 생성.
값을 넣을 Queue 생성.
for(int i =0; i < N; i++) {
StringTokenizer st = new StringTokenizer(br.readLine());
String S = st.nextToken();
// StringBuilder은 띄어쓰기(=공백)를 기준으로 값을 분리.
switch(S) {
case "push" :
last = Integer.parseInt(st.nextToken());
que.offer(last);
break;
case "pop" :
if(que.isEmpty()) sb.append(-1).append("\n");
else sb.append(que.poll()).append("\n");
break;
case "size" :
sb.append(que.size()).append("\n");
break;
case "empty" :
if(que.isEmpty()) sb.append(1).append("\n");
else sb.append(0).append("\n");
case "front" :
if(que.isEmpty()) sb.append(-1).append("\n");
else sb.append(que.peek()).append("\n");
break;
case "back" :
if(que.isEmpty()) sb.append(-1).append("\n");
else sb.append(last).append("\n");
break;
}
}
switch문으로 S값이 push, pop, size, empty, front, back일 때 case문을 생성해준다.
- push : push 다음 공백 값을 last에 저장
- pop : 큐에 값이 없으면 -1를 출력하고 poll로 가장 앞에 있는 값을 출력
- size : size 메서드로 큐에 들어있는 개수를 출력
- empty : isEmpty값이 true면 1을 반환 아니면 0을 출력
- front : isEmpty값이 true면 -1를 출력, 아니면 peek로 큐의 첫 번째 값 출력
- back : isEmpty값이 true면 -1를 출력, 아니면 가장 최근에 넣은 last 출력
3. 문제 11655
풀이
기본설명
N or n은 알파벳 중 중간값이므로 N보다 큰 값에 +13을 하게 되면 특수문자같은 원치 않는 값이 나올 수 있기 때문에
N or n보다 작은 값은 +13, 큰 값은 -13을 해줘야한다.
코드설명
BufferedReader br = new BufferedReader(new InputStreamReader(System.in)); // 값을 읽기 위해 BufferedReader 생성
StringBuilder sb = new StringBuilder(); //값을 변경할 것이기 때문에 StringBuilder 사용
읽고 변경할 객체 생성
char[] rot13 = br.readLine().toCharArray(); //StringBuilder를 한 글자씩 toCharArray로 쪼개서 배열로 저장
for(int i = 0; i<rot13.length; i++) {
if(rot13[i] >= 'A' && rot13[i] <= 'Z') { //rot13의 i 값이 대문자면
if(rot13[i] >= 'N') { //rot13값이 N보다 크면
rot13[i] -= 13; //-13한다.
}
else {
rot13[i] += 13; //아니면 +13한다.
}
}
else if(rot13[i] >= 'a' && rot13[i] <= 'z') { //rot13값이 소문자면
if(rot13[i] >= 'n') { //그 중에서도 n보다 크면
rot13[i] -=13; //-13한다.
}
else {
rot13[i] += 13; // 아니면 +13한다.
}
}
}
for(char i : rot13) //rot13값을 char i에 하나씩 넣는 for문.
sb.append(i); //생성한 StringBuilder에 i를 추가하여
System.out.println(sb); //println한다.
}
추가설명
//toCharArray 사용법
String s1 = "Hello World";
char[] charArr = s1.toCharArray();
- String(문자열)을 char형 배열로 바꾼다.
String s2 = new String(charArr);
- 추가로, char형 배열을 합쳐서 하나의 String(문자열)로 만들 수 있다.