반응형

** KOCW에서 반효경 교수님의 운영체제(2014년) 강의를 수강한 내용을 정리한 글입니다.

http://www.kocw.net/home/cview.do?cid=3646706b4347ef09

 

운영체제

운영체제는 컴퓨터 하드웨어 바로 위에 설치되는 소프트웨어 계층으로서 모든 컴퓨터 시스템의 필수적인 부분이다. 본 강좌에서는 이와 같은 운영체제의 개념과 역할, 운영체제를 구성하는 각

www.kocw.net

컴퓨터 시스템 구조

  • 우측 장치들은 I/O 장치
  • CPU : 명령을 처리
  • Memory : CPU의 작업 공간
  • Interrupt : 특정 이유로 작업권을 넘김 (I/O 장치의 입력, 처리 완료 등)
  • Timer : CPU를 점유하는 시간을 측정하고, 너무 길면 멈추게 하는 하드웨어
    • Time sharing 구현에 이용
  • I/O 장치들은 각각의 Controller(일종의 작은 CPU)가 관리하고 처리한다
  • 초기에는 OS가 CPU를 사용하고, 이후에는 순차적으로 사용자 프로그램과 OS가 CPU를 사용한다

 

Mode bit

  • 1 : 사용자 모드 → 사용자 프로그램 수행
  • 0 : 모니터 모드(커널 모드) → OS 코드 수행
  • 사용자 프로그램은 나쁜 짓을 할 수 있기 때문!
  • 보안을 해칠 수 있는 중요 명령어는 모니터 모드에서만 수행 가능한 ‘특권 명령’으로 규정

 

Interrupt

  • 인터럽트 당한 시점의 레지스터와 Program counter를 save한 후, CPU의 제어를 인터럽트 처리 루틴에 넘긴다.
  • 하드웨어 인터럽트 : 하드웨어(I/O 장치 등)가 발생시킴
    • Timer, I/O장치의 Controller 등
  • 소프트웨어 인터럽트(Trap) : 넓은 의미로 포함되는 개념 / Exception, System call(사용자 프로그램이 커널 함수 호출)
  • 인터럽트 벡터 : 해당 인터럽트 처리 루틴 주소를 가지고 있음
    • 인터럽트 처리 루틴(인터럽트 핸들러) : 해당 인터럽트를 처리하는 커널 함수
  • 현대의 운영체제는 인터럽트에 의해 구동됨!

 

 

입출력(I/O)의 수행

  • 모든 입출력 명령은 특권 명령 → 사용자 프로그램은 어떻게 I/O를 하는가?
    • System call(Trap의 일종) → 운영체제에 I/O 요청
    • 올바른 요청인지 OS가 확인 후 수행

 

동기식/비동기식 입출력

  • 동기식 입출력(Synchronous I/O)
    • I/O를 요청하고, 입출력 작업이 완료된 후에 사용자 프로그램에게 제어가 넘어감
      • 구현 방법 1 : I/O 끝날 때까지 CPU 낭비
      • 구현 방법 2 : I/O 완료될 때까지(해당 프로그램을 I/O 처리를 기다리는 줄에 세워 놓고) 다른 프로그램에게 CPU를 줌
  • 비동기식 입출력(Aynchronous I/O)
    • I/O 요청 직후 제어가 사용자 프로그램에 넘어감(입출력 요청과 입출력이 별도의 싸이클)

  • 두 경우 모두 I/O 완료는 인터럽트로 알려준다.

 

DMA(Direct Memory Access)

  • 입출력 장치를 빠르게 처리하기 위함
  • CPU 중재 없이, Device controller가 Device buffer storage 내용을 메모리에 Block 단위로 직접 전송
  • Byte가 아닌 Block 단위로 인터럽트를 발생시킴

 

저장장치 계층 구조

  • Primary(Registers, Cache Memory, Main Memory)
    • 빠르고 비쌈 → 용량이 낮음
    • 휘발성
    • CPU에서 직접 접근 가능(Executable)
  • Secondary
    • 느리고 쌈 → 용량이 큼
    • 비휘발성
    • CPU에서 직접 접근 불가능
  • Caching이란? → 재사용을 목적으로, 하위 메모리에서 불러온 정보를 보다 빠른 메모리에 임시로 저장하는 것

 

프로그램의 실행(Memory load)

  • File System에 저장된 파일을 실행하면 → Virtual Memory를 거쳐 → Physical memory(Virtual Memory의 반대 개념)에 프로세스로 들어감
  • Virtual Memory(가상 메모리) : 특정 프로세스 할당되는, 0번지부터 시작하는 가상의 주소 공간
  • Kernel Address space를 확대하면 아래와 같다

 

 

 

 

 

 

 

 

 

 

반응형
반응형

** KOCW에서 이석복 교수님의 네트워크(2015년) 강의를 수강한 내용을 정리한 글입니다.

http://www.kocw.net/home/search/kemView.do?kemId=1169634

 

컴퓨터네트워크

인터넷을 동작시키는 컴퓨터네트워크 프로토폴을 학습한다.

www.kocw.net

 

 

Application layer에 대해 알아볼 예정

 

계층 구조 (- 각각의 대표적인 프로토콜) → 탑 다운 방식으로 살펴볼 예정

Application - HTTP

Transport - TCP / UDP

(이상은 라우터에는 존재하지 않고, 네트워크 엣지에만 존재)

Network - IP

Link - WiFi / LTE / 3G / Ethernet

Physical

HTTP에 대해서 알아보자

 

 

Client-server architecture

  • Server
    • Always-on host
    • 고정된(Permanet) IP address
  • Client
    • Server와 통신
    • 동적 IP를 가지고 있을 것임
  • 서로 다른 host(컴퓨터)에 올라와 있는 프로세스(각각 서버, 클라이언트) 사이의 통신을 애기하는 중
  • 같은 host에 올라와 있는 프로세스 간 통신은(IPC - Inter-Process Communication) OS에서 처리
  • 통신 메시지를 주고 받는 공간을 Socket이라고 함
  • 양단을 연결하려면 주소가 특정되어야 함 → IP(컴퓨터 특정) + Port(프로세스에 물린 소켓 특정)의 조합으로 특정
    • IP를 DNS(Domain Name System)에 의해 별도의 주소(이름)로 연결할 수 있음
    • port 입력 안 하면 → 자동으로 80번
    • naver.com:80 해도 연결됨, 8080은 안됨
    • 우리가 알고 있는 모든 웹 서비스들이 80번 포트를 씀 → DNS를 쓰기 때문에, port 넘버는 80번으로 통일하자는 암묵적 합의

 

App은 Transport 계층에 이런 것을 원한다

  • Data integrity : 데이터 무결성
  • Timing : 낮은 딜레이 보장
  • Throughput : 최소한의 데이터 양 보장
  • Security : 보안

하지만 TCP에서 Data integrity를 제공하지만 UDP는 그마저도 안 해주고, 나머지 기능은 제공하지 않는다 → Application layer에서 처리해야 함

 

 

App들의 프로토콜 사용 예시

 

 

HTTP란?

  • HyperText Transfer Protocol
  • 웹의 Application layer protocol
  • Client / Server model
    • Client : 웹 오브젝트를 요청, 수신, 화면에 표시하는 브라우저
    • Server : Response에 담긴 오브젝트를 요청한 곳에 전달하는 웹 서버
    • 모두 HTTP를 사용
  • 쉽게 생각하면, Reqeust를 보내고 Response를 받아오는 프로토콜(규격, 방식)

 

 

HTTP는 기저에 TCP 서비스를 사용 → TCP Connection을 생성해야 한다.

  • Client는 서버에 TCP Connection을 실행(Socket 생성) (port 80)

→ Server는 Client에서 온 TCP Connection을 수용

→ HTTP 메시지가 브라우저(HTTP Client)와 웹 서버(HTTP Server) 사이에서 교환됨

→ TCP Connection 종료

 

 

HTTP는 “stateless(무상태)” 하다

→ Server는 Client의 과거 요청 정보(state)를 가지고 있지 않는다

만약 state를 유지하는 Protocol이라면?

  • 과거 기록이 계속 유지되어야 한다
  • 만약 Server나 Client가 충돌하면 → view의 상태는 일관성이 없어지고, 반드시 조정되어야 한다.

 

HTTP Connections

HTTP는 TCP Connection을 non-persistent(비영구적) / persistent(영구적)으로 사용하는지에 따라 분류된다.

  • Non-persistent HTTP
    • 1개의 오브젝트를 전송하면 TCP Connection을 바로 닫는다
    • 실제로는 파이프라인과 결합하여, n개의 메서드를 전송하고 Connection을 닫는 방식을 사용함

 

 

 

 

 

 

반응형
반응형

** KOCW에서 이석복 교수님의 컴퓨터네트워크(2015년) 강의를 수강한 내용을 정리한 글입니다.

http://www.kocw.net/home/search/kemView.do?kemId=1169634

[컴퓨터네트워크

인터넷을 동작시키는 컴퓨터네트워크 프로토폴을 학습한다.

www.kocw.net](http://www.kocw.net/home/search/kemView.do?kemId=1169634)

노드 4개로 시작했던 최초의 인터넷(ARPANET)

현재는 →

 

 

네트워크 구조

  • 네트워크 엣지(가장자리) : 어플리케이션, 호스트
  • 네트워크 코어(중심) : 라우터(아래 그림에서 X 표시된 동그라미) / 네트워크 속 네트워크
  • 네트워크 사이를 연결 : 통신 링크

 

 

네트워크 엣지

  • 엔드 시스템 : 어플리케이션 프로그램 실행 (Web, email)
  • 클라이언트 / 서버 모델 (웹 브라우저, 웹 서버, 이메일 클라이언트, 이메일 서버)

 

 

TCP(Transmission Control Protocol)

  • Connection-oriented(연결 지향)
  • 엔드 시스템 간 데이터 전송을 위한 프로토콜
  • Relidable(신뢰할 수 있는) / In-order byte-stream(데이터 전송 순서를 유지하는) 데이터 전송
  • Flow control : Receiver(수신자)에 맞게 전송
  • Congestion control : 과부하 등 감안
  • UDP에 비해 신뢰할 수 있다는 장점이 있지만, 비용이 많이 듦

 

 

UDP(User Datagram Protocol)

  • Connectionless(비연결)
  • 엔드 시스템 간 데이터 전송을 위한 프로토콜
  • Unreliable data transfer
  • No flow control
  • No congestion control
  • TCP에 비해 속도가 빠름 → 신뢰할 수 없어도 괜찮은 곳에 사용

TCP의 용도 : HTTP(Web), FTP(File transfer), Telnet(Remote login), SMTP(email)

UDP의 용도 : 스트리밍 미디어, 원격 회의, DNS, 전화(Telephony)

프로토콜(Protocol)이란?

쉽게 말해, 대화(통신)의 규칙, 규격

 

 

네트워크 코어

상호 연결된 라우터들의 집합(mesh)

 

어떻게 데이터는 망을 통해 전달될까?

  • 써킷 스위칭 : 호출마다 전용(dedicated) 회로 할당 → 전화망
    • 시작부터 끝까지 미리 할당해놓고 시작 (자원 예약)

  • 패킷 스위칭 : 불연속적인 덩어리 단위로 망을 통해 데이터를 보낸다 → 인터넷
    • 자원을 예약하지 않음

 

 

패킷 스위칭 vs 써킷 스위칭

  • Band width(통신망-Link 의 전송 가능 속도) : 1Mb/s 일때
  • 유저가 100kb/s를 사용할 때(When active)
  • 10%의 시간에 활성(Active)된다면
  • 써킷 스위칭 : 10명의 유저 감당 가능
  • 패킷 스위칭 : 35명의 유저를 감당해도 활성 유저가 10명 초과할 확률이 0.0004 미만
  • 인터넷에서 패킷 스위칭을 사용하는 이유 : 인터넷 사용 시, 특정 시점에만 데이터 송수신하는 경우가 많음
    • 단, 동시 접속을 해야 하는 경우 문제가 생길 수 있음

 

 

패킷 딜레이의 원인

  1. Processing delay : 패킷을 확인해야 함 (비트 에러, 목적지 등)
  2. Queueing delay : Input속도가 Output속도보다 빠르면 → queue에 저장해야 함
  3. Transmission delay : 패킷이 모두 통과하는 데에 걸리는 시간
    1. 패킷 길이(bits) / 링크 bandwidth(bps) → s(second) 단위
  4. Propagation delay : 전송에 걸리는 시간 → 거리/빛의 속도

 

 

패킷 딜레이를 줄여보자

  1. Propagation delay → 불가능
  2. Processing delay : 라우터 성능 개선
  3. Queueing delay : ??
  4. Transmission delay : 케이블 성능 개선(Bandwidth 개선)
  • 고속도로 예시
    • 톨게이트 하이패스 도입 → Processing delay 개선
    • 차선 늘리기 → Transmission delay 개선
    • 그럼에서 명절에는 막힌다 → Queueing delay는 어쩔 수 없다
      • Transmission 속도가 빨라지면 queue 처리 속도도 빠르지만, 그래도 queue가 쌓여 있다면 처리하는 시간이 걸린다.
      • 대부분의 네트워크 문제는 Queueing delay에서 발생한다.

Queue가 넘치면 → 패킷 유실! (대부분의 loss가 여기서 발생)

TCP는 Relialbe하다며?(신뢰성 있다며) → Queue에서 loss가 발생하면? → 재전송해야함 → 그 방식은?

→ 시작 단계에서 재전송한다

  • TCP는 네트워크 엣지에 존재하고, 사이에 있는 코어(라우터)는 판단을 하지 않는다.
  • → dumb core

 

 

 

 

반응형

'Computer Science > 네트워크' 카테고리의 다른 글

2강) Application layer architecture, HTTP란?  (0) 2023.01.22
반응형

** KOCW에서 반효경 교수님의 운영체제(2014년) 강의를 수강한 내용을 정리한 글입니다.

http://www.kocw.net/home/cview.do?cid=3646706b4347ef09

 

운영체제

운영체제는 컴퓨터 하드웨어 바로 위에 설치되는 소프트웨어 계층으로서 모든 컴퓨터 시스템의 필수적인 부분이다. 본 강좌에서는 이와 같은 운영체제의 개념과 역할, 운영체제를 구성하는 각

www.kocw.net

 

 

운영체제란?

  • 컴퓨터 하드웨어 바로 위에 설치되어 사용자, 소프트웨어, 하드웨어를 연결하는 소프트웨어 계층

좁은 의미(커널) : 운영체제의 핵심 / 부팅 이후로 계속 메모리에 상주하는 부분

넓은 의미 : 커널 + 각종 주변 시스템 유틸리티

전공자 입장에서, 운영체제는 커널만을 의미!

 

 

운영체제의 목적

  1. 컴퓨터 시스템의 자원을 효율적으로 관리 → 자원 관리자
    • 프로세서, 메모리, 입출력 장치 등의 자원
      • 사용자 간 형평성 있는 자원 분배
      • 주어진 자원으로 최대한의 성능
    • 사용자 및 운영체제 자신을 보호하고, 프로세스, 파일, 메시지 등을 관리

 

  1. 컴퓨터 시스템을 편리하게 사용할 수 있는 환경 제공
    • 동시 사용자/프로그램들이 각각 독자적 컴퓨터에서 수행되는 것 같은 효과를 줌

 

 

운영체제의 처리방식

  • 시분할(Time sharing)
    • 여러 작업을 수행할 때, 처리 능력을 일정한 시간 단위로 분할하여 사용
    • interactive한 방식 → 지금 우리가 쓰는 컴퓨터
  • 실시간(Realtime OS)
    • 정해진 시간 안에 어떠한 일이 반드시 종료되어야 하는 시스템을 위한 OS
    • 특수 목적으로 사용 : 원자로/공장, 미사일, 반도체 장비, 로보트 제어 등
  • 일괄 처리(Batch processing)
    • 작업 요청을 일정량 모아서 한꺼번에 처리 (종료까지 기다려야 함)
    • 역사속으로..

 

 

헷갈리는 용어

  • Multitasking
  • Multiprogramming
  • Time sharing
  • Multiprocess

위 용어들을 컴퓨터에서 여러 작업을 동시에 수행하는 것을 뜻함

Multiprogramming은 여러 프로그램이 메모리에 올라가 있음을 강조

Time sharing은 CPU의 시간을 분할하여 나누어 쓴다는 의미를 강조

  • Multiprocessor → 하나의 컴퓨터에 CPU(Processor)가 여러 개 붙어 있음을 의미

 

 

운영체제의 종류

  • 유닉스(UNIX)
    • 코드의 대부분을 C언어로 작성
    • 이식성이 높음 (C언어로 되어 있어, 기계어 종류에 영향을 받지 않고 컴파일만 하면 된다)
    • 최소한의 커널 구조
    • 확장 용이
    • 소스 코드 공개 (지금은 유료)
    • 프로그램 개발에 용이
    • 다양한 버전
      • Linux → 공개된 오픈소스 버전
  • DOS(Disk Operating System)
    • MS사에서 1981년 IBM-PC(개인용 PC)를 위해 개발
    • 단일 사용자용 운영체제, 메모리 관리 능력의 한계 (주 기억장치 : 640KB)
  • MS Windows
    • MS사의 다중 작업용 GUI 기반 OS
    • Plug and Play, 네트워크 환경 강화
    • DOS용 응용 프로그램과 호환성 제공
    • 불안정성
    • 풍부한 지원 소프트웨어
  • 그 외 Handhel device를 위한 OS, 스마트폰 용 OS(iOS 등) 등 다양한 OS가 존재

 

 

 

 

 

반응형
반응형

 

Java의 기본 라이브러리에는 Binary Search 메서드가 내장되어 있습니다.

java.util.Arrays 클래스에 존재합니다.

 

다양한 자료형의 배열을 사용할 수 있에 오버로딩되어 있는데,

본 아티클에서는, 제너릭스로 구현된(자료형에 구애받지 않고 사용할 수 있게 구현) 메서드를 사용해볼 것입니다..

 

 

 


새로운 자료형(클래스) 제너릭스로 구현

//--- 신체검사 데이터 ---//
class PhyscData {
    private final String name;          // 이름
    private final int    height;        // 키
    private final double vision;        // 시력

    //--- 생성자(constructor) ---//
    public PhyscData(String name, int height, double vision) {
        this.name = name;
        this.height = height;
        this.vision = vision;
    }

    //--- 문자열로 만들어 반환하는 메서드 --//
    public String toString() {
        return name + " " + height + " " + vision;
    }

    //--- 키의 오름차순으로 정렬하기 위한 comparator ---//
    public static final Comparator<PhyscData> HEIGHT_ORDER =
            new HeightOrderComparator();

    private static class HeightOrderComparator implements Comparator<PhyscData> {
        public int compare(PhyscData d1, PhyscData d2) {
            return (d1.height > d2.height) ?  1 :
                    (d1.height < d2.height) ? -1 : 0;
        }
    }
}

 

PhyscData라는 자료형에 대해 Binary Search를 사용하려고 합니다.

PhyscData라는 클래스 내부에 Comparator를 하나 구현했습니다. (외부에 구현해도 상관 없습니다.)

그리고 구현한 Comparator 내부에는 compare라는 메서드를 구현해야 합니다.

 

PhyscData 객체들의 순서를 비교할 때, height를 기준으로 하며,

더 큰 height를 가진 객체가 오른쪽에 오도록(오름차순) 정렬 규칙을 정한 것입니다.

 

 

 

 

binarySearch 메서드 사용

class BinarySearch1 {
    public static void main(String[] args) {
        Scanner stdIn = new Scanner(System.in);
        PhyscData[] x = {                    // 키의 오름차순으로 정렬
            new PhyscData("강민하", 162, 0.3),
            new PhyscData("이수연", 168, 0.4),
            new PhyscData("황지안", 169, 0.8),
            new PhyscData("유서범", 171, 1.5),
            new PhyscData("김찬우", 173, 0.7),
            new PhyscData("장경오", 174, 1.2),
            new PhyscData("박준서", 175, 2.0),
        };

        System.out.print("키가 몇 cm인 사람을 찾고 있나요?: ");
        int height = stdIn.nextInt();                // 킷값을 읽어 들임
        int idx = Arrays.binarySearch(
                        x,                                 // 배열 x에서
                        new PhyscData("", height, 0.0),    // 키가 height인 요소를
                        PhyscData.HEIGHT_ORDER             // HEIGHT_ORDER에 의해 검색
                     );

        if (idx < 0)
            System.out.println("그 값의 요소가 없습니다.");
        else {
            System.out.println("그 값은 x[" + idx + "]에 있습니다.");
            System.out.println("찾은 데이터: " + x[idx]);
        }
    }
}

위의 코드는 PhyscData의 배열에서 Binary Search를 실행하고 있습니다.

Arrays.binarySearch 메서드의 인자로 배열, key값, Comparator를 구현한 객체가 들어감을 확인할 수 있습니다.

 

만약 찾는 값이 존재한다면, 위치(인덱스)를 반환합니다.

존재하지 않는다면, 만약 값이 존재한다면 어디에 위치해야하는지를 알려주는 값을 음수로 반환합니다.

이를 삽입 포인트(insertion point)라고 하는데,

insertioin point = -(원래 위치했어야 하는 인덱스 값)  - 1 로 주어집니다.

 

만약 배열이 Comparator에 정의된 compare 메서드의 규칙에 따라 정렬되어 있지 않다면,

정확하지 않은 값을 반환합니다.

binarySearch 메서드는 정렬이 된 배열을 가정하고 검색을 실행하기 때문입니다.

 

 

 

 

내림차순으로 수정해보기

package chapter3;// 신체검사 데이터 배열에서 이진 검색

import java.util.Arrays;
import java.util.Comparator;
import java.util.Scanner;

class BinarySearch1 {
    public static void main(String[] args) {
        Scanner stdIn = new Scanner(System.in);
        PhyscData[] x = {                    // 시력의 내림차순으로 정렬
                new PhyscData("박준서", 175, 2.0),
                new PhyscData("유서범", 171, 1.5),
                new PhyscData("장경오", 174, 1.2),
                new PhyscData("황지안", 169, 0.8),
                new PhyscData("김찬우", 173, 0.7),
                new PhyscData("이수연", 168, 0.4),
                new PhyscData("강민하", 162, 0.3),
        };

        System.out.print("시력이 몇인 사람을 찾고 있나요?: ");
        double vision = stdIn.nextDouble();                // 킷값을 읽어 들임
        int idx = Arrays.binarySearch(
                        x,                                 // 배열 x에서
                        new PhyscData("", 0, vision),    // 시력이 vision인 요소를
                        PhyscData.VISION_ORDER             // HEIGHT_ORDER에 의해 검색
                     );

        if (idx < 0)
            System.out.println("그 값의 요소가 없습니다.");
        else {
            System.out.println("그 값은 x[" + idx + "]에 있습니다.");
            System.out.println("찾은 데이터: " + x[idx]);
        }
    }
}

//--- 신체검사 데이터 ---//
class PhyscData {
    private final String name;          // 이름
    private final int    height;        // 키
    private final double vision;        // 시력

    //--- 생성자(constructor) ---//
    public PhyscData(String name, int height, double vision) {
        this.name = name;
        this.height = height;
        this.vision = vision;
    }

    //--- 문자열로 만들어 반환하는 메서드 --//
    public String toString() {
        return name + " " + height + " " + vision;
    }

    //--- 시력의 내림차순으로 정렬하기 위한 comparator ---//
    public static final Comparator<PhyscData> VISION_ORDER =
            new HeightOrderComparator();

    private static class HeightOrderComparator implements Comparator<PhyscData> {
        public int compare(PhyscData d1, PhyscData d2) {
            return (d1.vision < d2.vision) ?  1 :
                    (d1.vision > d2.vision) ? -1 : 0;
        }
    }
}

시력의 내림차순으로 정렬된 배열에서 이진 탐색을 수행하도록 코드를 수정했습니다.

입력을 받는 자료형을 double로 바꾸고,

Comparatorcompare 메서드가 vision을 기준으로,

그리고 반대 방향으로 정렬을 수행하도록 수정했습니다.

 

System.out.println("idx: " + idx);

위와 같은 코드를 추가하여 idx의 값을 살펴봅시다.

 

idx-5가 됩니다.

만약 0.77이 존재했다면 idx4였을 것이므로,

(-4) - 1 = -5 의 값이 나온 것입니다.

 

        PhyscData[] x = {                    // 시력의 내림차순으로 정렬
                new PhyscData("박준서", 175, 2.0),
                new PhyscData("유서범", 171, 1.5),
                new PhyscData("장경오", 174, 1.2),
                new PhyscData("김찬우", 173, 0.7),
                new PhyscData("황지안", 169, 0.8),
                new PhyscData("이수연", 168, 0.4),
                new PhyscData("강민하", 162, 0.3),
        };

이번에는 위와 같이 내림차순의 순서를 망가뜨리고 프로그램을 실행해보겠습니다.

 

망가진 순서 이전의 값은 탐색이 잘 됩니다.

 

하지만 망가진 순서 이후의 값은 잘 탐색이 되지 않습니다.

 

즉, Arrays.binarySearch 메서드는

정렬이 잘 되어 있는지를 따로 확인하지 않고,

정렬이 잘 되어 있다고 가정한 채로 탐색을 수행한 결과를 반환합니다.

 

 

 

 


감사합니다.

 

 

 

 

 

 

 

 

 

 

반응형
반응형

 

 

 

 

우아한테크코스 5기 백엔드 과정에 지원했고,

2022년 12월 17일에 시험을 마치고 왔습니다.

 

지난 기수 분들의 후기를 통해 많은 도움을 받아 합격할 수 있었기에,

이번 5기 시험에 대한 정보를 나누고자 글을 적어 봅니다.

 

적고자 하는 내용은,

 

1) 우아한테크코스 최종 코딩테스트를 준비한 방법 공유

2) 5기 시험에 대한 정보 공유 (난이도 등..)

 

입니다.

 

글을 읽으시기에 앞서,

우테코 최종 코딩테스트 유형에 대해 잘 모르신다면,

아래 링크를 통해 5기 최종 코테 리파지토리를 확인하실 수 있습니다.

 

GitHub - woowacourse-precourse/java-menu

Contribute to woowacourse-precourse/java-menu development by creating an account on GitHub.

github.com

 

 

 

 

 

 


지원자 상황 공유

최종 코딩테스트와 관련한 얘기에 앞서서,

저의 상황을 대략적으로 공유드리는 것이 객관적인 정보 획득에 도움이 될 것 같아

몇 자 적어봅니다.

 

  • 비전공자(전자전기공학 전공 / 컴퓨터 관련 과목 교양 C언어, Matlab만 수강)
  • 개발 공부한지 약 10개월 차에 지원 (파이썬, 노드로 프로젝트 경험 O)
  • 자바 경험 X (위키독스 점프 투 자바 1 회독 한 경험만 있었고, 그마저도 까먹어 우테코 지원하면서 다시 1 회독했습니다.)
  • 풀타임으로 우테코에 집중할 수 있는 상황 (주 2회 아르바이트, 주 1회 학교 등교 정도 외에는 우테코에 전부 집중했습니다.)

 

 

 

 

우아한테크코스 최종 코딩테스트를 준비한 방법

 

이번 5기는 지원자 전원이 프리코스(4주)에 참여할 수 있었고,

지원서 + 프리코스(4주)의 정성적 평가로 최종 테스트 대상자를 선발했습니다.

 

프리코스부터 최종 코딩테스트를 준비하며 제가 선택한 전략은

"할 수 있는 모든 것을 하기"였습니다.

 

 

최종 코딩테스트를 위해 준비한 것을 나열해 보겠습니다.

 

  • 프리코스 기간 동안, 미션 해결하기 전에 시간 재서 풀어보기
  • 프리코스 기간 동안 받았던 피어 리뷰 복습하기
  • 5기 미션 동안 구상한 프로그램 설계 정리하기 -> 추후 문제 풀면서, 빠른 풀이에 적합한 설계 확정
  • 5기 미션 시간 재서 다시 풀어보기
  • 1~4기 프리코스 미션 시간 재서 풀어보기
  • 2~4기 최종 코딩테스트 시간 재서 풀어보기
  • 5기 프리코스 기간 동안 받은 공통 피드백 다시 읽어보고 공부하기
  • 불편한 상황에서 문제 풀기(시끄러운 카페의 기울어진 책상에서 60%의 시간 재고 문제 풀기)
  • (오픈북 시험이므로) 위의 모든 과정 동안, 시험장에서 사용할 참고 노트 작성
    • 자바 문법 관련 정리
    • 프로그램 설계 및 구현 방식 정리
    • 시험 직전 및 제출까지의 체크리스트 정리

 

문제를 풀 때는,

1. 시간 재서 문제 풀고 채점하기 (테스트 코드 동작 확인, 모든 프로그래밍 요구사항 만족 체크)

2. 어려웠던 부분, 새롭게 사용한 문법 등 -> 적절한 참고 노트에 정리

3. 다른 사람들 코드(PR) 보면서 참고할 부분 정리 -> 다만, 

 

요약하자면 아래와 같습니다.

1. 프리코스 기간에 공부한 내용을 복습하고,

2. 이번 + 지난 기수 모든 문제를 풀면서 참고 노트를 정리하고,

3. 여러 돌발 상황에 대해 대비하고,

4. 시험장에서 해야 할 일들(세팅, 설계, 구현, 검사)을 정리하고 이미지 트레이닝하기

 

프리코스가 끝나고 1차 합격자(최종 코딩테스트 대상자) 발표가 2주,

그리고 발표부터 시험까지가 3일밖에 주어지지 않았습니다.

 

3일이라는 시간은 (적어도 저에겐) 최종 코딩테스트를 준비하기에 턱없이 부족한 시간이라고 생각했고,

나름의 객관적인 판단(많은 사람들의 미션 확인, 나의 지원서에 대한 지인들의 평가 등)을 통해

1차는 합격할 것이라는 확신이 있었기 때문에,

1차 발표 전부터 코딩테스트를 계속 준비해 왔습니다.

 

그 덕에 여유를 가지고 계획한 모든 것을 잘 준비할 수 있었고,

다행히 5기 최종 코딩테스트에서 테스트 케이스 통과,

그리고 (개인적 확인으로는) 모든 요구사항을 만족시킬 수 있었습니다.

 

 

제가 정리한 노트, 기수 별 문제 링크 정리한 것 등

자료들을 전부 공유드리고 싶지만,

 

저의 공유가 도움을 주는 것 이외에

전형 자체를 너무 고이게 만들고, 그것이 결국 지원자분들의 피로를 가중시키는 일이 될까 봐

고민 끝에 자료 공유는 하지 않기로 했습니다.

 

다만 요구사항에 "테스트 코드가 통과하지 않으면 0점으로 간주한다."는 내용이 있다면

테스트 코드 통과를 최우선 목표로 하시는 것이 좋지 않을까 싶다는 생각을 전달드립니다.

 

 

그리고 제가 준비한 내용들이 누군가에겐 무난하게 보일 수도,

누군가에게는 너무 과하다고 생각이 들 수도 있을 것 같습니다.

여러 사람의 준비 과정을 보고 들은 것으로는,

제가 평균보다는 확실히 많이 투자한 것으로 이해해주셔도 될 것 같습니다.

 

무엇보다, 구글링을 통해 접할 수 있는 많은 지원자들의 후기를 통해

종합적으로 판단하시는 것을 추천드립니다.

 

 

 

 

5기 시험에 대한 정보 공유

 

우테코 5기 최종 코딩테스트 문제에 대해 간단하게 생각을 적어보고자 합니다.

아직 문제를 풀어보시기 전이라면, 문제를 풀어보고 읽어보시기를 추천드립니다.

(이건 스포를 싫어하는 제 성향이니 무시하셔도 좋습니다.)

 

 

난이도

무난하다 못해 쉽게 느껴지는 난이도였다고 생각합니다.

물론 시험 자체, 문제 자체가 쉬운 것은 아니고

제가 똑똑해서 쉬웠다는 것도 절대 아닙니다.

이전 기수의 모든 문제를 풀어본 경험 + 다른 지원자들의 얘기를 미루어볼 때 그렇습니다.

 

3기 최종 코딩테스트였던 지하철 경로 문제는 개인적으로 쉽지 않았고,

4기 최종 코딩테스트였던 페어 매칭 문제는 개인적으로 정말 어렵다고 느꼈었는데요,

그에 비해 이번 5기 점심 메뉴 추천은, 설계부터 구현까지 비교적 직관적으로 진행할 수 있었습니다.

 

 

풀이

개인적으로 Enum을 잘 활용한 것이 이번 시험을 무난하게 마칠 수 있었던 결정적 이유라고 생각합니다.

관련하여, 저의 풀이 PR 링크를 공유드립니다.

 

[점심 메뉴 추천] 이우진 미션 제출합니다. by horsehair · Pull Request #152 · woowacourse-precourse/java-menu

프로그램 설명 입력된 코치들에게 점심 메뉴를 추천해주는 프로그램 기능 구현 목록 UI InputView 코치 이름 목록 입력 (예외 처리) 시작과 끝에 있는 "," 제거 요청 못 먹는 메뉴 목록 입력 콘솔에

github.com

 

 

아래는 Enum을 사용한 코드입니다.

public enum Category {
    JAPANESE(1, "일식", Arrays.asList("규동", "우동", "미소시루", "스시", "가츠동", "오니기리", "하이라이스", "라멘", "오코노미야끼")),
    KOREAN(2, "한식", Arrays.asList("김밥", "김치찌개", "쌈밥", "된장찌개", "비빔밥", "칼국수", "불고기", "떡볶이", "제육볶음")),
    CHINESE(3, "중식", Arrays.asList("깐풍기", "볶음면", "동파육", "짜장면", "짬뽕", "마파두부", "탕수육", "토마토 달걀볶음", "고추잡채")),
    ASIAN(4, "아시안", Arrays.asList("팟타이", "카오 팟", "나시고렝", "파인애플 볶음밥", "쌀국수", "똠얌꿍", "반미", "월남쌈", "분짜")),
    WESTERN(5, "양식", Arrays.asList("라자냐", "그라탱", "뇨끼", "끼슈", "프렌치 토스트", "바게트", "스파게티", "피자", "파니니"));

    private final int number;
    private final String name;
    private final List<String> menus;

    Category(int number, String name, List<String> menus) {
        this.number = number;
        this.name = name;
        this.menus = menus;
    }

    public static void checkMenuExist(String menu) {
        boolean haveMenu = false;
        for (Category category : Category.values()) {
            if (category.haveMenu(menu)) {
                haveMenu = true;
                break;
            }
        }
        if (!haveMenu) {
            throw new IllegalArgumentException("[ERROR] 존재하지 않는 메뉴입니다.");
        }
    }

    private boolean haveMenu(String menu) {
        return menus.contains(menu);
    }

    public static Category getRandomCategory() {
        int randomNumber = Randoms.pickNumberInRange(START_NUMBER_OF_CATEGORY, COUNT_OF_CATEGORIES);
        return Arrays.stream(Category.values())
                .filter(category -> category.isNumberOf(randomNumber))
                .findAny()
                .orElseThrow(() -> new IllegalArgumentException("[ERROR] 존재하지 않는 번호의 카테고리입니다."));
    }
    
    public String getRandomMenu() {
        return Randoms.shuffle(menus).get(0);
    }
	// 이하 메서드 생략
}

 

 

시험 진행 관련 정보

1) 실제 교육 장소에서 시험을 치렀습니다.

아마 백엔드 과정은 선릉 캠퍼스에서 시험을 응시하신 것 같고,

다른 과정은 정확히는 모르겠으나 잠실 캠퍼스에서 응시하시지 않았나 싶습니다.

 

2) 넓지 않은 책상에서 시험을 응시했습니다.

노트북, 마우스와 패드, 노트와 펜, 충전기

이 정도를 사용하고자 하면 책상이 가득 찰 정도의 너비였습니다.

아무래도 많은 지원자가 교육장에서 한꺼번에 시험에 응시하니 어쩔 수 없지 않나 싶습니다.

좁은 자리에서 연습해보시는 것도 좋을 것 같습니다.

 

3) 이어폰, 노트북 거치대, 키보드는 사용 가능했습니다.

다만 기수 별로 어떻게 바뀔지는 모르겠습니다.

저는 블루투스 이어폰을 착용하고, 노래는 틀지 않은 채 노이즈 캔슬링 기능만 이용했습니다.

시끄러운 카페에서 연습하다, 이어폰에 노캔을 켜고 작업하니 세상 집중이 잘 되었습니다.

 

4) 과자, 물, 귤, 마이쮸 등 제공

당 보충용 초콜릿을 사갔는데, 간식을 엄청나게 제공해 주셨습니다.

진짜 최고최고..

 

 

그 외

영상으로만 뵈었던 코치님들을 실물로 뵈니 좋았습니다 ㅋ ㅋ

교육장에서 사진, 셀피 찍어도 되냐고 여쭤보니

당연히 된다고 하셨습니다! 일부를 공유합니다.

 

크리스마스 전 주라 테헤란로의 크리스마스 야경을 내려다볼 수 있었습니다.

 

불 꺼진 페어룸..

 

 

 

 

 


 

최종 코딩테스트가 쉽지는 않지만,

프리코스에 열심히 참여하고

코딩테스트 준비에 많은 시간(진짜 많이..ㅋㅋ) 할애하면

자바를 잘 모르던 비전공자도 만족할 만한 결과를 얻을 수 있다고 말씀드리고 싶습니다.

 

파이팅 하세요 🔥🤞

 

 

 

 

 

 

반응형
반응형

 

 

** 철저히 주관적이고 개인적인 고민과 결과를 기록하는 글입니다.

 

 

코딩테스트 공부를 본격적으로 시작하기 앞서 어떤 언어로 준비할 것인지 많은 고민을 했다.

고민의 내용과 결과를 기록해두고자 한다.

 

 

 

파이썬의 이점

문법이 간결하다.

같은 내용을 구현할 때 드는 시간이 적다.

 

자바의 이점

어차피 자바를 주력언어로 사용할 거라면 (내 상황) 언어에 익숙해질 수 있다.

 

 

 

미약하게나마 파이썬으로 코딩테스트 공부를 하면서

간결한 문법에 익숙해져 있었다.

 

간단한 문제를 자바로 풀어보며 차이를 느껴보고자 했다.

 

 

자바 코드

import java.util.*;

class Main {
  public static void main(String[] args) {
    Scanner scanner = new Scanner(System.in);
    int inputNumber = scanner.nextInt();
    for (int i = inputNumber; i > 0; i--) {
      System.out.println(i);
    }
    scanner.close();
  }
}

입력 받은 숫자를 1까지 감소시키며 출력하는 아주 간단한 문제를 자바로 구현했다.

이를 파이썬 코드로 바꾸면,

 

파이썬 코드

n = int(input())
for i in range(n):
    print(n - i)

 

ㅋㅋㅋㅋ

 

 

 

구글에 '코딩테스트 파이썬 vs 자바'로 검색해서 나오는 대부분의 글을 다 읽어봤는데,

많은 사람들이 기업 코딩테스트 수준에서는 자바로 풀어도 시간이 부족할 정도로 나오지 않을 것이라고 말한다.

 

중급자 이상이 되면, 구현을 떠올리는 과정이 어렵지

익숙한 언어로 구현하는 것은 일도 아니라고 한다.

 

하지만 분명 구현하거나 수정하는 데 소요되는 시간이 길어지면

그만큼 히든 케이스를 찾거나 고민할 수 있는 시간이 줄어드는 것은 확실할 거라 생각한다.

 

 

 

이런 저런 이유로 오래 고민하다가..

결국 자바로 공부를 시작하기로 했다.

 

코딩테스트 공부를 하면서 동시에 자바 언어로 여러 알고리즘을 구현해보고 언어에 익숙해지는 과정,

그리고 어려운 문제를 고민하면서 자바의 자료구조도 뜯어볼 수 있을테니,

일석이조의 효과를 누리는 것이 낫겠다고 판단했다.

 

웬만한 문제 풀이도 구글에 자바로 나와있고, 백준에 많은 코드도 공유되어 있으니

공부하는 데에도 큰 문제가 없겠다는 생각.

 

단기적으로 공부할 것이 아니고,

장기적으로 내가 목표로 하는 수준(골드 2~3)에 도달하는 데에는 언어가 큰 지장을 주지 않을 것이라고 판단했다.

적어도 자바에 더 익숙해질 수 있으니 그걸로 됐다!

 

 

 

 

 

 

 

 

 

반응형
반응형

 

 

 

String.join 메서드를 사용하면

문자열 리스트나 배열(List<String>, String[])의 각 요소들을

특정 문자로 이어붙일 수 있습니다.

 

 

 

 

String 객체 이어붙이기

// String 객체 이어붙이기
String str1 = "감자";
String str2 = "고구마";

String strJoined = String.join(", ", str1, str2);

System.out.println(strJoined); // 감자,고구마

 

String 리스트 이어붙이기

// String 객체 이어붙이기
ArrayList foods = new ArrayList();
list.add("떡볶이");
list.add("마라탕");

String strJoined = String.join(", ", foods);

System.out.println(strJoined); // 떡볶이, 마라탕

 

String 배열 이어붙이기

// String 객체 이어붙이기
String[] foods = new String[2]
foods[0] = "떡볶이";
foods[1] = "마라탕";

String strJoined = String.join(", ", foods);

System.out.println(strJoined); // 떡볶이, 마라탕

 

 

 

 

 

 

반응형

+ Recent posts