2023.05.05.FRI

ronglong·2023년 5월 5일
0

[ 프로그래머스 ]

  • 핸드폰 번호 가리기
    : 정답률 84%. toCharArray() 사용한 사람도 있었음.
class Solution {
    public String solution(String phone_number) {
        String tail = phone_number.substring(phone_number.length()-4);
        return "*".repeat(phone_number.length()-4)+tail;
    }
}

[ 백준 ]

  • 11659번 구간 합 구하기 4
    : 구간 합 알고리즘 사용하지 않고 구간 마다 매번 합을 계산했다가 시간 초과 났다.
    책에 나온 풀이 보면서 공부했다. 합 배열 만들기★
    값 받을 때, 기존에 쓰던 split()이 너무 불편해서, 풀이 보고 StringTokenizer를 사용해봤다.
    https://dev-coco.tistory.com/94
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)); //선언

        //숫자 개수와 연산 횟수 받기
        StringTokenizer stringTokenizer = new StringTokenizer(br.readLine());
        int m = Integer.parseInt(stringTokenizer.nextToken());
        int n = Integer.parseInt(stringTokenizer.nextToken());

        //합 배열 만들기
        long[] sum = new long[m+1];
        stringTokenizer = new StringTokenizer(br.readLine());
        for(int i=1; i<=m; i++){
            sum[i] = sum[i-1] + Integer.parseInt(stringTokenizer.nextToken());
        }

        //범위 받고 결과 출력하기
        long[] answers = new long[n];

        for(int i=0; i<n; i++){
            stringTokenizer = new StringTokenizer(br.readLine());
            int s = Integer.parseInt(stringTokenizer.nextToken());
            int e = Integer.parseInt(stringTokenizer.nextToken());
            answers[i] = sum[e] - sum[s-1];
        }

        for(long a : answers){
            System.out.println(a);
        }
    }
}
  • 1874번 스택 수열
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.Stack;

public class Main {
    public static void main(String[] args) throws IOException {
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in)); //선언

        //수열 개수 받기
        int numbers = Integer.parseInt(br.readLine());

        //수열 받기
        int[] arr = new int[numbers];
        for(int i=0; i<numbers; i++){
            arr[i] = Integer.parseInt(br.readLine());
        }

        //스택 생성
        Stack<Integer> stack = new Stack<>();
        StringBuffer sb = new StringBuffer();
        int num = 1;
        boolean result = true;

        for(int i=0; i<numbers; i++){
            int su = arr[i];
            if(num <= su){ //현재 수열 값보다 값이 작으면 계속 더하면서 스택에 값을 넣는다.
                while(num <= su){
                    stack.push(num++);
                    sb.append("+\n");
                }
                stack.pop();
                sb.append("-\n");
            }
            else { //스택의 값이 현재 수열 값보다 값이 크면
                int y = stack.pop();
                if(su < y){
                    System.out.println("NO");
                    result = false;
                    break;
                }
                else {
                    sb.append("-\n");
                }
            }
        }
       if(result) System.out.println(sb.toString());
    }
}
  • 11724번 연결 요소의 개수
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.ArrayList;
import java.util.StringTokenizer;

public class Main {
    static ArrayList<Integer>[] A;
    static boolean[] visited;

    public static void main(String[] args) throws IOException {
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in)); //선언

        StringTokenizer stringTokenizer = new StringTokenizer(br.readLine());
        int n = Integer.parseInt(stringTokenizer.nextToken());
        int m = Integer.parseInt(stringTokenizer.nextToken());

        A = new ArrayList[n + 1];
        visited = new boolean[n + 1];
        for (int i = 1; i < n + 1; i++) { //인접 리스트 초기화
            A[i] = new ArrayList<>();
        }

        for (int i = 0; i < m; i++) { //양방향 연결
            stringTokenizer = new StringTokenizer(br.readLine());
            int s = Integer.parseInt(stringTokenizer.nextToken());
            int e = Integer.parseInt(stringTokenizer.nextToken());
            A[s].add(e);
            A[e].add(s);
        }

        int count = 0;
        for (int i = 1; i < n + 1; i++) {
            if (!visited[i]) {
                count++;
                DFS(i);
            }
        }
        System.out.println(count);
    }
    static void DFS(int v) {
        if(visited[v]) {
            return;
        }
        visited[v] = true;
        for(int i : A[v]){
            if(!visited[i]){
                DFS(i);
            }
        }
    }
}

[ 자료구조 & 알고리즘 ]

  • 숫자 자료형 범위
    https://blog.munilive.com/posts/java_datetype_range.html
  • BFS, DFS 템플릿
    https://g-egg.tistory.com/57
  • 그래프
    • 유니온 파인드
      : union 연산(항상 대표 노드끼리 연결. 집합) + find 연산(배열의 인덱스와 밸류를 비교하여 대표 노드 찾기. 재귀. 밸류 업데이트)
    • 위상 정렬
      : 진입 차수 배열을 이용한 정렬. no cycle. O(노드 수+엣지 수). 결과 여러 개.
    • 다익스트라
      : 출발 노드로부터의 최단 거리 찾기. 엣지는 모두 양수. 인접리스트 이용.
    • 벨만-포드
      : 출발 노드로부터의 최단 거리 찾기. 음수 가중치 엣지 ok. 음수 사이클 존재 확인.
    • 플로이드-워셜
      : 모든 노드로부터의 최단 거리 찾기. DP 이용. No 음수 사이클. O(노드 개수의 세제곱). 3중 for문(K->S->E).
      D[S][E] = Math.min(D[S][E], D[S][K]+D[K][E])
  • 최소 신장 트리(MST)
    : 모든 노드를 연결했을 때, 엣지 가중치 최소합. No cycle. 유니온 파인드.
    • 크루스칼
    • 프림

[ 혼공컴운 ]

Chapter 07. 보조기억장치

  • 하드 디스크
    • 플래터(트랙, 섹터, 실린더), 스핀들, 헤드, 디스크 암
    • 데이터 접근 시간 = 탐색 시간 + 회전 지연 + 전송 시간
    • 다중(고정) 헤드 디스크, 단일(이동) 헤드 디스크
  • 플래시 메모리
    • USB 메모리, SD 카드, SSD 등
    • : 플래시 메모리에서 데이터를 저장하는 가장 작은 단위
    • 타입 : SLC(빠르고, 비싸고, 오래감), MLC, TLC(느리고, 싸고, 수명 짧음)
    • 단위 : 셀 < 페이지 < 블록 < 플레인 < 다이
    • 쓰기는 페이지 단위, 삭제는 블록 단위
    • 상태 : Free, Valid, Invalid
    • 가비지 컬렉션 기능 : 유효 페이지만 새 블록으로 복사 후 기존 블록 삭제하여 쓰레기값 정리
  • RAID
    : 여러 개의 물리적 보조기억장치를 하나의 논리적 보조기억장치처럼 사용하는 기술
    • RAID 레벨 : 0(스트라이핑 분산 저장), 1(미러링 백업), 4(패리티 비트), 5(패리티 비트 분산 저장), 6(패리티 비트 분산 및 더블링 저장)

Chapter 08. 입출력장치

  • 장치 컨트롤러(입출력 제어기, 입출력 모듈)
    • 다양한 입출력장치의 정보 규격화
    • 오류 검출
    • CPU와 입출력장치의 전송률 차이를 버퍼로 중재(데이터 버퍼링)
    • 데이터 레지스터, 상태 레지스터, 제어 레지스터
  • 장치 드라이버 : 소프트웨어적 연결 통로. 장치 컨트롤러와 컴퓨터 내부 연결. 프로그램
  • 입출력 방법
    • 프로그램 입출력 : 메모리 맵 입출력, 고립형 입출력(메모리, 입출력장치 주소 분리)
    • 인터럽트 기반 입출력 : 우선순위 높은 순으로 처리. PIC
    • DMA 입출력
      • DMA 컨트롤러가 CPU 거치치 않고 메모리에 직접 접근
      • 입출력 버스(PCIe)를 통해 장치 컨트롤러와 연결(시스템 버스 사용 횟수 절감).

[ 느낀 점 ]

코테 전혀 감이 안 와서, 책 <알고리즘 코딩테스트 자바>에 나온 문제들을 먼저 풀어보고 풀이를 보는 방식으로 공부하기로 했다. 혼자 먼저 풀어서 성공한 적 없음,,ㅋㅠ
채용 절차에서 코딩테스트 보는 회사에 취직 할 수 있는건지..?

0개의 댓글