백준 - 세로읽기
•
첫 번째 풀이방법
package week5.backjoon;
import java.io.*;
import java.util.ArrayList;
import java.util.List;
public class Backjoon10798 {
public static void main(String[] args) throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
List<String> stringList = new ArrayList<>();
StringBuilder sb = new StringBuilder();
int maxlength = 0;
for (int i = 0; i < 5; i++) {
stringList.add(br.readLine());
if (maxlength < stringList.get(i).length()) {
maxlength = stringList.get(i).length();
}
}
for (int i = 0; i < maxlength; i++) {
for (int j = 0; j < stringList.size(); j++) {
sb.append(stringList.get(j).charAt(i));
}
}
System.out.println(sb);
}
}
Java
복사
•
정답풀이
package week5.backjoon;
import java.io.*;
import java.util.ArrayList;
import java.util.List;
public class Backjoon10798 {
public static void main(String[] args) throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
List<String> stringList = new ArrayList<>();
StringBuilder sb = new StringBuilder();
int maxlength = 0; // 리스트 최대 길이 선언
for (int i = 0; i < 5; i++) {
stringList.add(br.readLine());
if (maxlength < stringList.get(i).length()) { // 리스트 요소의 최대 길이 찾기
maxlength = stringList.get(i).length();
}
}
for (int i = 0; i < stringList.size(); i++) {
if (stringList.get(i).length() < maxlength) { // 리스트의 요소 길이를 동일하게 맞춰주기 - repeat 메서드 사용(반복 기능)
stringList.set(i, stringList.get(i) + " ".repeat(maxlength - stringList.get(i).length()));
}
}
for (int i = 0; i < maxlength; i++) {
for (int j = 0; j < 5; j++) {
if (stringList.get(j).charAt(i) == ' ') { // 리스트 문자열의 문자가 ' ' 인 경우 추가하지 않기
continue;
}
sb.append(stringList.get(j).charAt(i));
}
}
System.out.println(sb);
}
}
Java
복사
프로그래머스 - 같은 숫자는 싫어
•
이 문제는 총 3가지 풀이방법으로 정리
◦
리스트 활용
package week5.programmers;
import java.util.*;
// 같은 숫자는 싫어
public class Programmers12906 {
public int[] solution(int[] arr) {
int[] answer = {};
ArrayList<Integer> list = new ArrayList<>();
// 이전 인덱스와 현재 인덱스를 비교하여 리스트에 담는다
for (int i = 1; i < arr.length; i++) {
if (arr[i] == arr[i - 1]) {
continue;
} else {
list.add(arr[i - 1]);
}
}
// 비교 과정에서 마지막 인덱스가 제외되므로 마지막 인덱스를 리스트에 추가시켜준다
list.add(arr[arr.length - 1]);
answer = new int[list.size()];
for (int i = 0; i < answer.length; i++) {
answer[i] = list.get(i);
}
return answer;
}
public static void main(String[] args) {
Programmers12906 T = new Programmers12906();
T.solution(new int[]{1, 1, 3, 3, 0, 1, 1});
}
}
Java
복사
◦
임의의 변수 설정 (배열의 요소가 0부터 9까지 이루어져 있다는 조건을 활용)
package week5.programmers;
import java.util.ArrayList;
import java.util.Arrays;
// 같은 숫자는 싫어
public class Programmers12906_2 {
public int[] solution(int[] arr) {
ArrayList<Integer> list = new ArrayList<>();
int tempNum = 10; // arr 원소 크기 0 ~ 9 => 무의미한 값으로 10 선언하여 배열 요소값과 비교해준다
for (int num : arr) {
if (tempNum != num) { // 같지 않으면 리스트에 추가
list.add(num);
}
tempNum = num; // 다음 진행 절차를 위해 tempNum을 num으로
}
int[] answer = new int[list.size()];
for (int i = 0; i < answer.length; i++) {
answer[i] = list.get(i);
}
return answer;
}
public static void main(String[] args) {
Programmers12906_2 T = new Programmers12906_2();
System.out.println(Arrays.toString(T.solution(new int[]{1, 1, 3, 3, 0, 1, 1})));
}
}
Java
복사
◦
스택 활용
package week5.programmers;
import java.util.Arrays;
import java.util.Stack;
// 같은 숫자는 싫어
public class Programmers12906_3 {
public int[] solution(int[] arr) {
Stack<Integer> stack = new Stack<>();
// 스택안에 비어있으면 1개를 넣기
// 제일 위에 값을 꺼내지 않고 같은 값이면 값을 넣지 않음, 값이 다를 경우 스택에 쌓기
for (int i = 0; i < arr.length; i++) {
if (stack.isEmpty() || stack.peek() != arr[i]) {
stack.push(arr[i]);
}
}
int[] answer = new int[stack.size()];
for (int i = stack.size() - 1; i >= 0; i--) {
answer[i] = stack.pop(); // 스택의 뒤에서 부터 꺼내기 때문에 반대로 반복
}
return answer;
}
public static void main(String[] args) {
Programmers12906_3 T = new Programmers12906_3();
System.out.println(Arrays.toString(T.solution(new int[]{1, 1, 3, 3, 0, 1, 1})));
}
}
Java
복사
백준 - 커트라인
•
풀이
package week5.backjoon;
import java.io.*;
import java.util.*;
// 커트라인
public class Backjoon25305 {
public static void main(String[] args) throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
StringTokenizer st = new StringTokenizer(br.readLine(), " ");
int N = Integer.parseInt(st.nextToken());
int K = Integer.parseInt(st.nextToken());
int[] numlist = new int[N];
StringTokenizer st2 = new StringTokenizer(br.readLine(), " ");
for (int i = 0; i < N; i++) {
numlist[i] = Integer.parseInt(st2.nextToken());
}
Arrays.sort(numlist);
System.out.println(numlist[numlist.length - K]);
}
}
Java
복사
백준 - 소트인사이드
package week5.backjoon;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
public class Backjoon1427 {
public static void main(String[] args) throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
String str = br.readLine();
int[] arr = new int[str.length()];
for (int i = 0; i < str.length(); i++) {
arr[i] = Integer.parseInt(str.substring(i, i + 1));
}
// 내림차순 정렬이므로 최댓값을 찾아 기준이 되는 자리와 swap 한다.
for (int i = 0; i < str.length(); i++) {
int max = i;
for (int j = i + 1; j < str.length(); j++) {
if (arr[j] > arr[max]) {
max = j;
}
}
if (arr[i] < arr[max]) {
int temp = arr[i];
arr[i] = arr[max];
arr[max] = temp;
}
}
for (int i = 0; i < str.length(); i++) {
System.out.print(arr[i]);
}
}
}
Java
복사
•
풀이과정
i | j | max | arr[j] > arr[max] | arr[i] < arr[max] | temp | arr[i] | arr[max] | 배열 상황 |
0 | i + 1 | i = 0 | arr[1] > arr[0]
1 > 2 (false) | - | - | - | - | - |
i + 2 | i = 0 | arr[2] > arr[0]
4 > 2 (true)
max = 2 | arr[0] < arr[2]
true | temp = arr[i]
temp = 2 | arr[i] = arr[max]
arr[0] = 4 | arr[max] = temp
arr[2] = 2 | 4123 | |
1 | i + 1 = 2 | i = 1 | arr[2] > arr[1]
2 > 1 (true)
max = 2 | arr[0] < arr[2]
false | - | - | - | - |
i + 1 = 3 | i = 2 | arr[3] > arr[2]
max = 3 | arr[1] < arr[3] | temp = arr[i]
temp = 1 | arr[i] = arr[max]
arr[1] = 3 | arr[max] =
temp
arr[3] = 1 | 4321 | |
2 | i + 1 = 3 | i = 2 | arr[3] > arr[2]
1 > 2 (false) | arr[2] < arr[2]
(false) | - | - | - | - |
3 | i + 1 = 4 (x) | i = 3 | arr[4] > arr[3]
(false) | arr[3] < arr[3]
(false) | - | - | - | - |
백준 - 스택
package week5.backjoon;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.Stack;
import java.util.StringTokenizer;
// 스택
public class Backjoon10828 {
public static void main(String[] args) throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
Stack<Integer> stack = new Stack<>();
int N = Integer.parseInt(br.readLine());
StringBuilder sb = new StringBuilder();
for (int i = 0; i < N; i++) {
StringTokenizer st = new StringTokenizer(br.readLine(), " "); // " " 구분자 처리
String str = st.nextToken();
if (str.equals("push")) {
stack.push(Integer.parseInt(st.nextToken()));
} else {
switch (str) {
case "pop":
sb.append((stack.isEmpty() ? -1 : stack.pop())).append("\n");
break;
case "size":
sb.append(stack.size()).append("\n");
break;
case "empty":
sb.append((stack.isEmpty()) ? 1 : 0).append("\n");
break;
case "top":
sb.append((stack.isEmpty()) ? -1 : stack.peek()).append("\n");
break;
}
}
}
System.out.println(sb);
}
}
Java
복사
백준 - 큐 2
package week5.backjoon;
import java.io.IOException;
import java.io.*;
import java.util.LinkedList;
import java.util.Queue;
// 큐 2
public class Backjoon18258 {
public static void main(String[] args) throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
int N = Integer.parseInt(br.readLine());
Queue<Integer> queue = new LinkedList<>();
StringBuilder sb = new StringBuilder();
// 큐가 먼저 들어온 데이터가 먼저 나간다는 특징을 활용 -> 큐의 가장 뒤에 있는 정수 = 가장 먼저 큐에 넣은 정수
int rearElement = 0;
for (int i = 0; i < N; i++) {
String str = br.readLine();
if (str.contains("push")) {
String[] strArr = str.split(" "); // " " 구분자 통해 처리
rearElement = Integer.parseInt(strArr[1]);
queue.add(rearElement);
} else {
switch (str) {
case "pop":
sb.append((queue.isEmpty()) ? -1 : queue.remove()).append("\n");
break;
case "size":
sb.append(queue.size()).append("\n");
break;
case "empty":
sb.append((queue.isEmpty()) ? 1 : 0).append("\n");
break;
case "front":
sb.append((queue.isEmpty()) ? -1 : queue.peek()).append("\n");
break;
case "back":
sb.append((queue.isEmpty()) ? -1 : rearElement).append("\n");
break;
}
}
}
System.out.println(sb);
}
}
Java
복사
백준 - 덱
package week5.backjoon;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.Deque;
import java.util.LinkedList;
import java.util.StringTokenizer;
// 덱
public class Backjoon10866 {
public static void main(String[] args) throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
Deque<Integer> deque = new LinkedList<>();
StringBuilder sb = new StringBuilder();
int N = Integer.parseInt(br.readLine());
for (int i = 0; i < N; i++) {
StringTokenizer st = new StringTokenizer(br.readLine(), "_");
String str = st.nextToken();
if (str.equals("push")) { // push
String pushStr = st.nextToken();
String[] pushArr = pushStr.split(" ");
if (pushArr[0].equals("front")) { // push_front
deque.addFirst(Integer.parseInt(pushArr[1]));
} else if (pushArr[0].equals("back")) { // push_back
deque.addLast(Integer.parseInt(pushArr[1]));
}
} else if (str.equals("pop")) { // pop
String popStr = st.nextToken();
String[] popArr = popStr.split(" ");
if (popArr[0].equals("front")) { // pop_front
sb.append((deque.isEmpty()) ? -1 : deque.removeFirst()).append("\n");
} else if (popArr[0].equals("back")) { // pop_back
sb.append((deque.isEmpty()) ? -1 : deque.removeLast()).append("\n");
}
} else {
switch (str) { // 나머지 명령문 처리
case "size":
sb.append(deque.size()).append("\n");
break;
case "empty":
sb.append((deque.isEmpty()) ? 1 : 0).append("\n");
break;
case "front":
sb.append((deque.isEmpty()) ? -1 : deque.getFirst()).append("\n");
break;
case "back":
sb.append((deque.isEmpty()) ? -1 : deque.getLast()).append("\n");
break;
}
}
}
System.out.println(sb);
}
}
Java
복사
백준 - 색종이
package week5.backjoon;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.*;
public class Backjoon2563 {
public static void main(String[] args) throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
int N = Integer.parseInt(br.readLine());
boolean[][] arr = new boolean[100][100]; // 방문 배열 선언
int sum = 0;
for (int i = 0; i < N; i++) {
StringTokenizer st = new StringTokenizer(br.readLine(), " ");
int x = Integer.parseInt(st.nextToken());
int y = Integer.parseInt(st.nextToken());
for (int j = x; j < x + 10; j++) {
for (int k = y; k < y + 10; k++) {
if (!arr[j][k]) {
arr[j][k] = true; // 방문하지 않았다면 true로 표시
sum++; // 합 변수 1 증가
}
}
}
}
System.out.println(sum);
}
}
Java
복사
백준 - 제로
•
풀이
package week5.recommand;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.Stack;
// 제로
public class Backjoon10773 {
public static void main(String[] args) throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
int N = Integer.parseInt(br.readLine());
Stack<Integer> stack = new Stack<>();
for (int i = 0; i < N; i++) {
int num = Integer.parseInt(br.readLine());
if (num == 0) {
stack.pop();
} else {
stack.add(num);
}
}
int[] arr = new int[stack.size()];
int sum = 0;
for (int i = 0; i < arr.length; i++) {
sum += stack.pop();
}
System.out.println(sum);
}
}
Java
복사
백준 - 괄호
•
풀이 1
package week5.recommand;
import java.io.*;
import java.util.Stack;
public class Backjoon9012 {
public static void main(String[] args) throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader((System.in)));
BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(System.out));
int N = Integer.parseInt(br.readLine());
while (N-- > 0) {
// 공백("") 기준 문자열 split
// 참고) StringTokenizer 는 공백("") 기준 문자열 split 불가
String[] targets = br.readLine().split("");
Stack<String> stack = new Stack<>();
boolean check = true;
for (String target : targets) {
if (target.equals("(")) {
stack.push(target);
} else if (target.equals(")")) {
if (!stack.isEmpty() && stack.peek().equals("(")) {
stack.pop();
continue;
}
// ")" 의 검사 대상인 "(" 을 찾으려고 하는데 스택 내에 아무런 요소가 없다면,
if (stack.isEmpty()) {
check = false;
bw.write("NO" + "\n");
break;
}
}
}
// check 가 true 인 경우는 모든 요소 검사가 정상적으로 다 이뤄졌을 때,
if (check) {
if (stack.isEmpty()) {
bw.write("YES" + "\n");
} else {
bw.write("NO" + "\n");
}
}
}
bw.flush();
bw.close();
}
}
Java
복사
•
풀이 2
package week5.recommand;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.Stack;
public class Backjoon9012_2 {
public static void main(String[] args) throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
StringBuilder sb = new StringBuilder();
int N = Integer.parseInt(br.readLine());
for (int i = 0; i < N; i++) {
sb.append(solve(br.readLine())).append('\n');
}
System.out.println(sb);
}
public static String solve(String s) {
Stack<Character> stack = new Stack<>();
for (int i = 0; i < s.length(); i++) {
char c = s.charAt(i);
// 여는 괄호 : 스택에 넣음
if (c == '(') {
stack.push(c);
}
// 아래는 모두 닫는 괄호인 경우
// 스택이 비어있는 경우. 즉, 닫는 괄호를 입력받았으나 pop할 원소가 없을 때
else if (stack.empty()) {
return "NO";
}
// 그 외의 경우 stack 원소를 pop한다
else {
stack.pop();
}
}
if (stack.empty()) {
return "YES";
} else {
return "NO";
}
}
}
Java
복사