PlayData 백엔드 부트캠프 정리

PlayData 백엔드 부트캠프 Start 30일차

효건 2024. 9. 23. 21:54

면접등 취업이슈로 저번주 2일을 빠졌습니다..... 그래서 그냥 넘어가보려고요 ㅎㅎ 이슈가 있었으니..

오늘 수업은 투포인터와 스텍,큐에 대해서 수업을 진행했습니다.

1.투포인터

  • 정렬된 배열에서 두 값의 합을 찾을 때
  • 특정 범위의 부분 합을 빠르게 계산해야 할 때
  • 부분 배열의 곱, 차 등도 구간에 따라 효율적으로 계산

등을 이용할때 사용합니다. 
예제를 한번 제손으로풀어보겠습니다.
EX1)
오름차순으로 정렬이 된 두 배열이 주어지면 두 배열을 오름차순으로 합쳐 출력하는 프로그램을 작성하세요.
▣ 입력설명
첫 번째 줄에 첫 번째 배열의 크기 N(1<=N<=100)이 주어집니다.
두 번째 줄에 N개의 배열 원소가 오름차순으로 주어집니다.
세 번째 줄에 두 번째 배열의 크기 M(1<=M<=100)이 주어집니다.
네 번째 줄에 M개의 배열 원소가 오름차순으로 주어집니다.
각 리스트의 원소는 int형 변수의 크기를 넘지 않습니다.

package twopointer;

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

public class Solution1 {


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

        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        int N = Integer.parseInt(br.readLine());
        int[] arr1 = new int[N];
        StringTokenizer st = new StringTokenizer(br.readLine(), " ");
        for (int i = 0; i < N; i++) {
            arr1[i] = Integer.parseInt(st.nextToken());
        }

        int M = Integer.parseInt(br.readLine());
        int[] arr2 = new int[M];
        StringTokenizer st2 = new StringTokenizer(br.readLine(), " ");
        for (int i = 0; i < M; i++) {
            arr2[i] = Integer.parseInt(st2.nextToken());
        }
        int[] arr3 = Arrays.copyOf(arr1, arr1.length + arr2.length);
        System.arraycopy(arr2, 0, arr3, arr1.length, arr2.length);
        Arrays.sort(arr3);
        System.out.println(Arrays.toString(arr3));
    }
}

버퍼리더를 통해 불러오고 이후 각 배열을 만든후그배열을 합치고 그대로 뽑아낸 결과물이다. 일단 주어진 결과는 나오는 것을 확인하였다., 
 

2. 스택과 큐

가) 스택

  • 후입선출(LIFO, Last-In-First-Out) 구조로, 마지막에 삽입된 데이터가 가장 먼저 제거
  • 연산
    • 삽입
    • 제거
    • 읽기

나) 큐

  • 선입선출(FIFO, First-In-First-Out) 구조로, 먼저 들어온 데이터가 먼저 나가는 방식
  • LinkedList를 사용하여 표현
  • 연산
    • 삽입
    • 제거
    • 읽기

EX1)
괄호가 입력되었을 때, 올바른 괄호이면 “YES", 올바르지 않으면 ”NO"를 출력합니다.
(())()
이것은 괄호의 쌍이 올바르게 위치하는 거지만,
(()()))
이것은 올바른 괄호가 아니다.
 

package stack;

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

public class Solution1 {

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

        BufferedReader bf = new BufferedReader(new InputStreamReader(System.in));
        String str = bf.readLine();

        Stack<Character> stack = new Stack<>();

        for (char c : str.toCharArray()) {
            if (c == '(') {
                stack.push(c);
            } else {
                if (stack.isEmpty()) {
                    System.out.println("NO");
                    return;
                }
                stack.pop();
            }
        }

        if (stack.isEmpty()) {
            System.out.println("YES");
        } else {
            System.out.println("NO");
        }

        bf.close();

    }
}

버퍼리더를 사용한것외 강사님께서 알려주신   풀이방법이랑 같아서 너무 기분이 좋긴한데 이렇게 외워야 할지도 모르겠다.
내가볼땐 스텍 너무 어렵다