← 목록

프로그래밍 언어 활용 · 오답노트

2025년 3회

Q1

C 언어에서 산술 연산자가 아닌 것은?

1%
2*
3<<
4/
정답 3번 · <<

핵심 해설

C 언어의 연산자는 기능에 따라 산술, 관계, 논리, 비트, 대입, 조건 연산자 등으로 나뉜다. 산술 연산자는 수치 계산을 수행하는 +, -, *, /, % 다섯 가지이며, 이 중 %는 정수 나눗셈의 나머지를 구하는 모듈로 연산자다. 반면 <<와 >>는 피연산자의 이진 비트를 왼쪽·오른쪽으로 밀어내는 비트 시프트 연산자로, &(AND), |(OR), ^(XOR), ~(NOT)과 함께 비트 연산자 범주에 속한다. 따라서 산술 연산자가 아닌 것은 <<이다.

보기별 해설

1. %는 산술 연산자다. 나눗셈의 나머지를 구하는 모듈로 연산자로 7 % 3은 1이 되며, C에서는 정수형 피연산자에만 사용할 수 있고 실수에는 쓸 수 없다.
2. *는 산술 연산자다. 두 피연산자를 곱하는 곱셈 연산자이며, 포인터 선언이나 역참조에도 같은 기호가 쓰이지만 이때는 단항 연산자로 역할이 다르다.
3. <<는 산술 연산자가 아니라 비트 왼쪽 시프트 연산자다. a << n은 a의 비트를 왼쪽으로 n칸 밀어 결과적으로 a에 2의 n제곱을 곱한 효과를 내며, &, |, ^, ~, >>와 함께 비트 연산자로 분류된다.
4. /는 산술 연산자다. 나눗셈 연산자이며 정수끼리 나누면 소수점 이하가 버려져 7 / 2가 3이 되고, 실수 결과를 얻으려면 피연산자 중 하나를 실수형으로 바꿔야 한다.

정리

산술 연산자는 + - * / % 다섯 개뿐이다. << >> & | ^ ~는 비트 연산자, == != < >는 관계 연산자, && || !는 논리 연산자로 구분한다.
#프로그래밍언어활용
Q2

다음 C 언어 프로그램의 결과로 옳은 것은? #include <stdio.h> main( ) { int i = 0; while (1) { if (i == 4) break; i++; } printf(“%d”, i); }

13
24
35
46
정답 2번 · 4

핵심 해설

while(1)은 조건이 항상 참인 무한 루프이므로 탈출은 오직 break로만 이루어진다. 루프 안에서는 i가 4인지 먼저 검사하고, 아니면 i를 1 증가시킨다. i 값을 추적하면 i=0(≠4) → i=1, i=1(≠4) → i=2, i=2(≠4) → i=3, i=3(≠4) → i=4, 그리고 다음 반복에서 i==4가 참이 되어 증가 없이 break로 빠져나온다. 탈출 시점의 i는 4이므로 printf는 4를 출력한다. 실제 gcc로 컴파일해 실행해도 4가 나온다.

보기별 해설

1. 3은 break 직전 마지막 증가가 일어나기 전의 값이다. i가 3일 때는 조건 i==4가 거짓이라 i++가 한 번 더 실행되어 4가 되므로 출력값이 될 수 없다.
2. 4는 i==4가 성립해 break로 루프를 빠져나온 시점의 i 값이다. break는 조건 검사 직후 실행되어 i++를 건너뛰므로 i는 4를 유지한 채 출력된다.
3. 5는 break가 아니라 i++가 먼저 실행되고 그 뒤에 조건을 검사하는 구조였을 때 나올 수 있는 값이다. 이 코드에서는 if(i==4) break;가 i++보다 앞에 있으므로 i는 5까지 증가하지 못한다.
4. 6은 종료 조건이 i==6인 경우에나 나오는 값이다. 이 코드의 탈출 조건은 i==4로 고정되어 있어 i가 5나 6에 도달하기 전에 반복이 끝난다.

정리

while(1)은 break로만 탈출한다. 조건 검사가 증감문보다 앞에 있으면 탈출 시점의 값이 그대로 남으므로, if(i==4) break; i++; 구조는 최종값 4를 출력한다.
#프로그래밍언어활용
Q3

다음 중 IP 버전에 대한 설명 중 틀린 것은?

1IPv4는 각 부분을 옥텟으로 구성총, 32비트로 구성된다.
2IPv6는 각 부분을 콜론으로 구분한다.
3IPv4는 네트워크 부분의 길이에 따라 A 클래스에서 E 클래스 까지 총 5단계로 구성되어 있다.
4IPv6는 IPv4에 비해 자료 전송 속도가 느리다. 4
정답 4번 · IPv6는 IPv4에 비해 자료 전송 속도가 느리다. 4

핵심 해설

IPv4는 32비트 주소를 8비트(옥텟) 단위로 넷으로 끊어 점(.)으로 구분해 십진수로 표기하고, 네트워크 부분의 길이에 따라 A~E 5개 클래스로 나뉜다. IPv6는 128비트 주소를 16비트씩 8개 필드로 나누어 콜론(:)으로 구분하고 16진수로 표기한다. IPv6는 기본 헤더를 40바이트로 고정·단순화하고 체크섬 필드를 없애 라우터의 처리 부담을 줄였으며, 흐름 레이블(Flow Label)로 QoS를 지원하므로 전송 속도 면에서 IPv4보다 유리하다. 따라서 IPv6가 IPv4보다 느리다는 4번이 틀린 설명이다.

보기별 해설

1. IPv4는 32비트 주소를 8비트짜리 옥텟 4개로 구성해 192.168.0.1처럼 점으로 구분해 표기하므로 옳은 설명이다. 원문의 '구성총'은 '구성하고' 정도가 PDF 추출 과정에서 깨진 것이다.
2. IPv6는 128비트를 16비트씩 8개 필드로 나누고 각 필드를 콜론(:)으로 구분해 16진수로 적으므로 옳다. 연속된 0 필드는 ::로 한 번만 축약할 수 있다.
3. IPv4의 클래스는 네트워크 부분의 길이에 따라 A(8비트), B(16비트), C(24비트), D(멀티캐스트), E(연구용)로 총 5단계이므로 옳은 설명이다.
4. IPv6가 IPv4보다 자료 전송 속도가 느리다는 서술이 틀렸다. IPv6는 40바이트 고정 헤더와 체크섬 제거로 라우터 처리를 단순화하고 흐름 레이블로 QoS를 지원해 오히려 전송 효율이 높다. 보기 끝의 '4'는 PDF 추출 과정에서 끼어든 쪽 번호 잡음이다.

정리

IPv4 = 32비트, 옥텟 4개를 점(.)으로 구분, A~E 5클래스. IPv6 = 128비트, 16비트 8필드를 콜론(:)으로 구분, 고정 40바이트 헤더·체크섬 제거·QoS 지원으로 IPv4보다 빠르다.
#프로그래밍언어활용#IPv6#네트워크
Q4

정수를 입력받아 처리하는 다음 C 언어 프로그램에서 괄호에 들어갈 알맞은 코드는? #include <stdio.h> int main(void) { int n, sum = 3; ( ) sum = sum + n; printf(“%d”, sum); }

1scanf(“%d”, n);
2scanf(“%d”, &n);
3scanf(“%f”, n);
4scanf(“%f”, &n);
정답 2번 · scanf(“%d”, &n);

핵심 해설

scanf는 입력받은 값을 저장할 '주소'를 인수로 받아야 하므로, 일반 변수에는 반드시 주소 연산자 &를 붙여 &n 형태로 전달해야 한다. 또 서식 지정자는 변수의 자료형과 일치해야 하는데, n은 int로 선언되었으므로 정수를 뜻하는 %d를 써야 한다. 실수용 %f를 int 변수에 쓰면 4바이트 정수 자리에 실수 표현이 기록되어 값이 깨진다. 두 조건을 모두 만족하는 것은 scanf("%d", &n);이다.

보기별 해설

1. scanf("%d", n);은 서식은 맞지만 주소 연산자 &가 빠졌다. n의 값(초기화되지 않은 쓰레기 값)을 주소로 해석해 그 위치에 쓰려 하므로 실행 시 세그멘테이션 오류가 발생하기 쉽다.
2. scanf("%d", &n);은 int형 변수 n의 주소를 넘기고 정수 서식 %d를 사용하므로 두 조건을 모두 만족한다. 예를 들어 5를 입력하면 n=5가 되어 sum은 3+5=8이 출력된다.
3. scanf("%f", n);은 서식과 인수가 모두 잘못됐다. %f는 float용 서식이라 int 변수 n과 형이 맞지 않고, &도 없어 주소가 아닌 값을 전달하므로 이중으로 오류다.
4. scanf("%f", &n);은 주소는 올바르게 넘기지만 서식이 틀렸다. %f는 4바이트 float 형식으로 값을 기록하므로 int로 선언된 n에는 의도한 정수가 아닌 엉뚱한 비트 패턴이 저장된다.

정리

scanf의 두 원칙 — (1) 일반 변수에는 반드시 &를 붙인다(배열명·문자열은 예외), (2) 서식 지정자를 자료형에 맞춘다: int는 %d, float는 %f, double은 %lf, char는 %c.
#프로그래밍언어활용
Q5

다음은 n각형을 화면에 그리는 프로그램을 Python으로 구현한 것이 다괄호. (㉠㉢~ )에 들어갈 알맞은 코드는? import turtle ( ㉠ ) shape(distance, n): t = turtle.Turtle( ) for i in range(n): t.( ㉡ ) t.( ㉢ ) shape(100, 5)

1def, forward(distance), left(360//n)
2def, forward(distance), left(360///n)
3class, forward(distance), left(360//n)
4class, forward(distance), left(360///n)
정답 1번 · def, forward(distance), left(360//n)

핵심 해설

지문은 PDF 추출로 어절이 뒤섞였지만 '괄호 ㉠~㉢에 들어갈 코드'를 묻는 문항으로, turtle 모듈로 정n각형을 그리는 함수를 완성하는 문제다. ㉠은 shape(distance, n)이라는 함수를 정의하는 자리이므로 파이썬의 함수 정의 키워드 def가 들어간다(class는 클래스를 정의하는 키워드라 인수를 받는 함수 형태와 맞지 않는다). ㉡은 거북이를 distance만큼 전진시키는 forward(distance), ㉢은 회전각으로, 정n각형은 외각의 합이 360도이므로 한 꼭짓점마다 360/n도씩 돌아야 한다. 이때 //는 몫만 남기는 정수 나눗셈이고 ///라는 연산자는 파이썬에 존재하지 않아 SyntaxError가 나므로, 올바른 조합은 def, forward(distance), left(360//n)이다.

보기별 해설

1. def, forward(distance), left(360//n) 조합이 모두 올바르다. def로 함수를 정의하고 forward로 변의 길이만큼 전진한 뒤 left(360//n)로 외각만큼 회전하는 것을 n번 반복하면 정n각형이 그려진다. shape(100, 5)는 한 변 100인 정오각형을 그리며 회전각은 360//5 = 72도다.
2. def, forward(distance), left(360///n)은 앞의 두 요소는 맞지만 ///가 잘못됐다. 파이썬의 나눗셈 연산자는 /(실수 나눗셈)와 //(정수 나눗셈) 두 가지뿐이며, ///는 정의되지 않아 실행 즉시 SyntaxError가 발생한다.
3. class, forward(distance), left(360//n)은 ㉠이 잘못됐다. class는 클래스를 정의하는 키워드로 class 이름(부모클래스) 형태를 취하며, shape(distance, n)처럼 매개변수를 받아 호출되는 함수를 만들려면 def를 써야 한다.
4. class, forward(distance), left(360///n)은 ㉠의 class와 ㉢의 ///가 모두 틀렸다. 함수 정의 키워드도 아니고 존재하지 않는 연산자까지 포함하므로 두 군데에서 오류가 난다.

정리

함수 정의는 def, 클래스 정의는 class. 파이썬 나눗셈은 /(실수)와 //(몫)뿐이며 ///는 없다. 정n각형은 turtle에서 forward(변) + left(360//n)를 n번 반복한다.
#프로그래밍언어활용#Python
Q6

다음 JAVA 프로그램이 실행되었을 때의 결과는? public class ovr { public static void main(String[ ] args) { int a = 1, b = 2, c = 3, d = 4; int mx, mn; mx = a < b ? b : a; if (mx == 1) { mn = a > mx ? b : a; } else { mn = b < mx ? d : c; } System.out.println(mn); } }

11
22
33
44
정답 3번 · 3

핵심 해설

삼항 연산자 조건 ? A : B는 조건이 참이면 A, 거짓이면 B를 반환한다. 값을 단계적으로 추적하면 a=1, b=2, c=3, d=4에서 먼저 mx = a < b ? b : a이므로 1 < 2가 참이 되어 mx = b = 2가 된다. 다음 if(mx == 1)은 mx가 2이므로 거짓이라 else 블록이 실행되고, 여기서 mn = b < mx ? d : c를 계산한다. b=2, mx=2이므로 2 < 2는 거짓이 되어 mn = c = 3이 된다. 따라서 출력은 3이며, 실제 javac로 컴파일해 실행해도 3이 나온다.

보기별 해설

1. 1은 변수 a의 값이다. a가 mn에 대입되려면 if(mx == 1)이 참이어야 하는데 mx는 2로 계산되므로 그 블록 자체가 실행되지 않는다.
2. 2는 mx에 저장된 값(=b)이다. 첫 삼항 연산의 결과일 뿐 mn에 대입되지는 않으며, else 블록의 b < mx 조건이 거짓이라 b가 선택될 여지도 없다.
3. 3은 변수 c의 값으로, else 블록의 mn = b < mx ? d : c에서 2 < 2가 거짓이 되어 선택된 값이다. 이 값이 그대로 mn에 대입되어 출력된다.
4. 4는 변수 d의 값이다. d가 선택되려면 b < mx가 참, 즉 mx가 2보다 커야 하는데 mx는 b와 같은 2이므로 조건이 성립하지 않는다.

정리

삼항 연산자는 조건 ? 참일때 : 거짓일때이며, < 는 등호를 포함하지 않아 2 < 2는 거짓이다. mx=2 → else → b<mx 거짓 → mn=c=3.
#프로그래밍언어활용#Java
Q7

개발 환경 구성을 위한 빌드(Build) 도구에 해당하지 않는 것은?

1Ant
2Kerberos
3Maven
4Gradle
정답 2번 · Kerberos

핵심 해설

빌드 도구는 소스 코드의 컴파일, 라이브러리 의존성 관리, 테스트 실행, 패키징·배포를 자동화하는 개발 환경 구성 도구다. 자바 진영의 대표적 빌드 도구로는 XML 스크립트 기반의 Ant, 의존성 자동 관리와 표준 디렉터리 구조를 제공하는 Maven, Groovy/Kotlin DSL로 유연성과 속도를 높인 Gradle이 있다. 반면 Kerberos는 대칭키 암호와 티켓(Ticket)을 사용해 네트워크상에서 사용자와 서비스를 인증하는 인증 프로토콜로, 빌드와는 전혀 무관한 보안 기술이다. 따라서 빌드 도구가 아닌 것은 Kerberos다.

보기별 해설

1. Ant는 아파치 재단의 자바 빌드 도구다. build.xml이라는 XML 스크립트에 컴파일·복사·패키징 작업을 절차적으로 기술하며, 의존성 자동 관리 기능이 없어 이후 Maven으로 대체되어 갔다.
2. Kerberos는 빌드 도구가 아니라 MIT에서 개발한 네트워크 인증 프로토콜이다. 신뢰받는 제3자인 키 분배 센터(KDC)가 발급한 티켓으로 사용자를 인증해 비밀번호를 네트워크에 노출하지 않고 SSO를 구현하며, 윈도우 액티브 디렉터리의 기본 인증 방식이다.
3. Maven은 아파치의 자바 빌드·프로젝트 관리 도구다. pom.xml에 의존 라이브러리를 선언하면 중앙 저장소에서 자동으로 내려받고, 정해진 라이프사이클(compile-test-package-install-deploy)에 따라 빌드를 수행한다.
4. Gradle은 Groovy/Kotlin 기반 DSL로 빌드 스크립트를 작성하는 빌드 도구다. Ant의 유연성과 Maven의 의존성 관리를 결합하고 증분 빌드·빌드 캐시로 속도를 높였으며, 안드로이드의 공식 빌드 도구다.

정리

자바 빌드 도구 3대장 — Ant(XML, 의존성 관리 없음), Maven(pom.xml, 의존성 자동 관리), Gradle(Groovy DSL, 증분 빌드). Kerberos는 티켓 기반 네트워크 인증 프로토콜이다.
#프로그래밍언어활용
Q8

프로세스와 관련한 설명으로 틀린 것은?

1프로세스가 준비 상태에서 프로세서가 배당되어 실행 상태로 변화하는 것을 디스패치(Dispatch)라고 한다.
2프로세스 제어 블록(PCB, Process Control Block)은 프로세 스 식별자프로세스, 상태 등의 정보로 구성된다.
3이전 프로세스의 상태 레지스터 내용을 보관하고 다른 프로세 스의 레지스터를 적재하는 과정을 문맥 교환(Context Switching)이라고 한다.
4프로세스는 스레드(Thread) 내에서 실행되는 흐름의 단위이 며스레드와, 달리 주소 공간에 실행 스택(Stack)이 없다. - 5
정답 4번 · 프로세스는 스레드(Thread) 내에서 실행되는 흐름의 단위이 며스레드와, 달리 주소 공간에 실행 스택(Stack)이 없다. - 5

핵심 해설

프로세스는 실행 중인 프로그램으로 자원 할당의 단위이고, 스레드는 그 프로세스 안에서 실행되는 흐름(제어)의 단위다. 즉 하나의 프로세스가 여러 스레드를 포함하는 포함 관계이며, 각 스레드는 코드·데이터·힙 영역은 프로세스와 공유하되 자신만의 실행 스택과 레지스터·PC를 따로 갖는다. 4번은 이 포함 관계를 정반대로 서술했을 뿐 아니라 스택이 없다는 설명까지 틀렸으므로 옳지 않다.

보기별 해설

1. 프로세스가 준비 상태에서 프로세서를 배당받아 실행 상태로 바뀌는 것을 디스패치(Dispatch)라 하는 것이 맞다. 반대로 할당 시간이 끝나 실행에서 준비로 돌아가는 것은 타이머 런아웃(Timer Run Out)이다.
2. 프로세스 제어 블록(PCB)은 운영체제가 프로세스마다 유지하는 자료구조로 프로세스 식별자(PID), 현재 상태, 프로그램 카운터, 레지스터 값, 우선순위, 메모리·입출력 자원 정보 등을 담으므로 옳다. 원문의 '식별자프로세스,'는 '식별자, 프로세스 상태'가 PDF 추출 과정에서 어절 순서가 깨진 것이다.
3. 이전 프로세스의 레지스터·PC 등 상태 정보를 PCB에 보관하고 다음 프로세스의 상태를 CPU에 적재하는 과정을 문맥 교환(Context Switching)이라 하는 것이 맞다. 교환 중에는 실질적인 작업이 없어 오버헤드로 작용한다.
4. 프로세스와 스레드의 관계를 거꾸로 서술해 틀렸다. 스레드가 프로세스 내에서 실행되는 흐름의 단위이며, 각 스레드는 코드·데이터·힙은 공유하되 실행 스택과 레지스터는 개별적으로 가진다. 프로세스 역시 스택 영역을 포함하므로 '스택이 없다'는 서술도 잘못이다. 끝의 '- 5'는 PDF 추출 과정에서 끼어든 쪽 번호 잡음이다.

정리

프로세스는 자원 할당 단위, 스레드는 그 안의 실행(제어) 단위. 스레드는 코드·데이터·힙을 공유하고 스택·레지스터·PC는 따로 갖는다. 상태 전이 — 디스패치(준비→실행), 타이머 런아웃(실행→준비), 블록(실행→대기), 웨이크업(대기→준비).
#프로그래밍언어활용#스레드#프로세스
Q9

다음 중 가장 약한 결합도(Coupling)는?

1Common Coupling
2Content Coupling
3External Coupling
4Stamp Coupling
정답 4번 · Stamp Coupling

핵심 해설

결합도(Coupling)는 모듈 간 상호 의존 정도로, 낮을수록 좋은 설계다. 강한 것부터 약한 순서는 내용(Content) > 공통(Common) > 외부(External) > 제어(Control) > 스탬프(Stamp) > 자료(Data)이며, 이 순서를 '내공외제스자'로 외운다. 보기 중 자료 결합도가 없으므로 남은 넷 가운데 가장 순서상 뒤에 있는, 즉 가장 약한 것은 스탬프 결합도다. 스탬프 결합도는 배열이나 구조체 같은 자료 구조를 통째로 넘기는 형태로, 개별 원소만 넘기는 자료 결합도 바로 위 단계다.

보기별 해설

1. Common Coupling(공통 결합도)은 여러 모듈이 전역 변수를 함께 참조·갱신할 때 생기는 결합으로, 내용 결합도 다음으로 강하다. 전역 변수가 바뀌면 이를 참조하는 모든 모듈이 영향을 받아 유지보수가 어렵다.
2. Content Coupling(내용 결합도)은 한 모듈이 다른 모듈의 내부 기능이나 지역 데이터를 직접 참조·수정하는 경우로, 결합도 중 가장 강해 최악이다. 예로는 다른 모듈 내부로 분기(goto)하는 코드가 있다.
3. External Coupling(외부 결합도)은 두 모듈이 외부에서 도입된 데이터 형식, 통신 프로토콜, 장치 인터페이스 등을 공유할 때 생기는 결합이다. 공통 결합도보다는 약하지만 제어·스탬프 결합도보다는 강하다.
4. Stamp Coupling(스탬프 결합도)은 모듈 간에 배열·구조체 같은 자료 구조 전체를 인수로 전달할 때 생기는 결합이다. 보기 가운데 가장 약하며, 자료 구조가 바뀌면 실제로 쓰지 않는 필드까지 영향을 받는다는 점에서 자료 결합도보다는 한 단계 강하다.

정리

결합도 강→약 순서 '내공외제스자' — 내용 > 공통 > 외부 > 제어 > 스탬프 > 자료. 결합도는 낮고 응집도는 높은 설계가 좋다.
#프로그래밍언어활용
Q10

C 언어에서 변수로 사용할 수 없는 것은?

1data02
2int01
3_sub
4short
정답 4번 · short

핵심 해설

C 언어의 식별자(변수 이름) 규칙은 영문자·숫자·밑줄(_)만 사용할 수 있고, 첫 글자에 숫자를 쓸 수 없으며, 대소문자를 구분하고, 예약어(keyword)는 쓸 수 없다는 것이다. short는 int, char, float, double, long, unsigned 등과 함께 C의 자료형 예약어이므로 변수 이름으로 쓰면 컴파일 오류가 난다. 나머지 셋은 문자·숫자·밑줄만 쓰였고 숫자로 시작하지도 않으므로 모두 유효한 식별자다.

보기별 해설

1. data02는 영문자로 시작해 숫자가 뒤따르는 형태로 규칙에 맞는 유효한 변수명이다. 숫자는 첫 자리만 아니면 어디든 쓸 수 있다.
2. int01은 예약어 int로 시작하지만 뒤에 01이 붙어 int와는 다른 별개의 식별자이므로 사용할 수 있다. 컴파일러는 토큰 전체를 비교하므로 예약어를 포함하기만 한 이름은 문제되지 않는다.
3. _sub는 밑줄로 시작하는 유효한 변수명이다. C에서 밑줄은 첫 글자로 허용되지만, 밑줄로 시작하는 이름 중 일부는 컴파일러·표준 라이브러리가 예약해 두므로 실무에서는 피하는 편이 좋다.
4. short는 C의 자료형 예약어라 변수명으로 쓸 수 없다. 정수형의 크기를 지정하는 키워드(보통 2바이트)로 컴파일러가 이미 문법 요소로 해석하므로 식별자 자리에 놓으면 문법 오류가 발생한다.

정리

C 식별자 규칙 — 영문자·숫자·_만 사용, 숫자로 시작 금지, 대소문자 구분, 예약어 사용 금지. int/short/long/float/double/char/return/if 등은 예약어다.
#프로그래밍언어활용
Q11

순차 파일에 대한 설명으로 옳지 않은 것은?

1레코드들이 순차적으로 처리되므로 대화식 처리보다 일괄 처 리에 적합하다.
2연속적인 레코드의 저장에 의해 레코드 사이에 빈 공간이 존재 하지 않으므로 기억 장치의 효율적인 이용이 가능하다.
3매체 변환이 쉬워 어떠한 매체에도 적용할 수 있다.
4필요한 레코드를 삽입삭제수정하는, , 경우 파일을 재구성할 필요가 없으므로 파일 전체를 복사하지 않아도 된다.
정답 4번 · 필요한 레코드를 삽입삭제수정하는, , 경우 파일을 재구성할 필요가 없으므로 파일 전체를 복사하지 않아도 된다.

핵심 해설

순차 파일(Sequential File)은 레코드를 논리적 순서에 따라 저장 매체에 연속으로 기록하는 방식이다. 빈 공간 없이 붙여 저장하므로 기억 공간 이용률이 높고, 처음부터 차례로 읽어 나가므로 자기 테이프 같은 순차 매체를 포함한 어떤 매체에도 적용할 수 있으며 대량 일괄 처리에 유리하다. 그러나 레코드가 물리적으로 연속되어 있어 중간에 삽입·삭제하려면 뒤쪽 레코드를 모두 밀어야 하고, 실제로는 파일 전체를 다시 복사해 재구성해야 한다. 따라서 재구성이 필요 없다는 4번이 옳지 않다.

보기별 해설

1. 레코드들이 순차적으로 처리되므로 대화식 처리보다 일괄 처리에 적합하다는 설명은 옳다. 특정 레코드에 바로 접근할 수 없어 즉시 응답이 필요한 대화식 업무에는 불리하고, 급여 계산처럼 전체를 한 번에 훑는 작업에 유리하다.
2. 연속적인 레코드 저장으로 사이에 빈 공간이 없어 기억 장치를 효율적으로 쓸 수 있다는 설명은 옳다. 색인이나 포인터 같은 부가 공간이 필요 없다는 점이 순차 파일의 대표적 장점이다.
3. 매체 변환이 쉬워 어떤 매체에도 적용할 수 있다는 설명은 옳다. 순차 접근만 지원하는 자기 테이프부터 디스크까지 모두 구현 가능하며, 직접 접근 매체를 전제로 하는 색인 순차·직접 파일과 대비되는 특징이다.
4. 필요한 레코드를 삽입·삭제·수정할 때 파일 재구성이 필요 없다는 서술이 틀렸다. 레코드가 물리적으로 연속 배치되어 있어 중간 삽입·삭제는 뒤쪽 전체를 이동시켜야 하므로 보통 새 파일로 전체를 복사하며 재구성한다. 원문의 '삽입삭제수정하는, ,'는 '삽입, 삭제, 수정하는'이 PDF 추출로 깨진 것이다.

정리

순차 파일 — 연속 저장으로 공간 효율 높고 매체 제약 없으며 일괄 처리에 유리하지만, 검색 시간이 길고 삽입·삭제 시 파일 전체 재구성이 필요하다.
#프로그래밍언어활용
Q12

다음과 같은 형태로 임계 구역의 접근을 제어하는 상호배제 기법은? P(S) : while S < = 0 do skip; S := S – 1; V(S) : S := S + 1;

1Dekker Algorithm
2Lamport Algorithm
3Peterson Algorithm
4Semaphore
정답 4번 · Semaphore

핵심 해설

제시된 코드는 다익스트라가 제안한 세마포어(Semaphore)의 P 연산(wait)과 V 연산(signal)의 고전적 정의다. P(S)는 세마포어 변수 S가 0 이하인 동안 대기(skip)하다가 양수가 되면 S를 1 감소시켜 임계 구역에 진입하고, V(S)는 임계 구역을 빠져나올 때 S를 1 증가시켜 대기 중인 프로세스에 자원을 넘긴다. 즉 S는 사용 가능한 자원의 개수를 나타내는 정수형 변수이며, S를 1로 초기화하면 이진 세마포어로서 상호배제를 구현한다. 반면 데커·램포트·피터슨 알고리즘은 별도의 플래그와 turn 변수만으로 상호배제를 구현하는 소프트웨어 알고리즘이라 P/V 연산 형태와 맞지 않는다.

보기별 해설

1. Dekker Algorithm은 두 프로세스의 상호배제를 flag 배열과 turn 변수를 이용해 해결한 최초의 소프트웨어 해법이다. P/V 같은 별도 연산 없이 순수하게 공유 변수 조작만으로 동작하므로 제시된 코드와 다르다.
2. Lamport Algorithm은 흔히 빵집(Bakery) 알고리즘으로 불리며, 각 프로세스에 번호표를 발급해 가장 작은 번호를 가진 프로세스가 임계 구역에 들어가도록 하는 n개 프로세스용 소프트웨어 상호배제 기법이다. 세마포어 변수의 증감 구조와는 다르다.
3. Peterson Algorithm은 데커 알고리즘을 단순화한 두 프로세스용 소프트웨어 상호배제 기법으로, flag[i]와 turn 두 변수만으로 상호배제·진행·한정 대기 조건을 만족시킨다. 역시 P/V 연산을 쓰지 않는다.
4. Semaphore는 다익스트라가 제안한 상호배제 기법으로, 정수형 변수 S와 두 개의 원자적 연산 P(wait)·V(signal)로 구성된다. 제시된 코드에서 P(S)는 S가 0 이하이면 대기하다 S를 감소시켜 진입하고 V(S)는 S를 증가시켜 반납하는 정확한 정의이며, S를 1로 두면 이진 세마포어(뮤텍스)가 된다.

정리

세마포어 = 정수 변수 S + 원자 연산 P(S)(감소·진입, S≤0이면 대기)와 V(S)(증가·반납). 데커·피터슨·램포트는 P/V 없이 flag와 turn만 쓰는 소프트웨어 알고리즘이다.
#프로그래밍언어활용
Q13

다음 파이썬 코드에서 ‘53t44’를 입력했을 때 출력 결과는? a, b = map(int, input( ).split(“t”)); print(a, b)

153 t 44
253t44
353 44
453, 44
정답 3번 · 53 44

핵심 해설

input()은 입력을 문자열로 받으므로 '53t44'가 통째로 들어온다. split("t")는 't'를 구분자로 삼아 문자열을 잘라 리스트 ['53', '44']를 만들고, map(int, ...)는 각 원소에 int를 적용해 [53, 44]로 변환한다. 언패킹으로 a=53, b=44가 대입되고, print(a, b)는 여러 인수를 출력할 때 기본 구분자 sep가 공백이므로 두 값 사이에 공백 하나를 넣어 '53 44'를 출력한다. 실제 python3로 실행해도 53 44가 나온다.

보기별 해설

1. 53 t 44는 구분자로 쓰인 't'가 출력에 남는 형태다. split("t")는 't'를 기준으로 자르면서 구분자 자체를 결과에서 제거하므로 't'가 다시 출력될 수 없다.
2. 53t44는 입력 문자열 원본 그대로다. split과 map을 거쳐 두 개의 정수로 분리·변환된 뒤 각각 출력되므로 원본 형태가 유지되지 않는다.
3. 53 44는 a=53, b=44가 print(a, b)로 출력된 결과다. print는 인수 사이를 기본 구분자 sep=' '(공백 한 칸)로 이어 붙이므로 두 정수가 공백 하나를 두고 나란히 찍힌다.
4. 53, 44는 print의 구분자가 쉼표일 때 나올 형태다. print(a, b)의 쉼표는 인수를 나누는 문법 기호일 뿐 출력되지 않으며, 쉼표로 구분하려면 print(a, b, sep=', ')처럼 명시해야 한다.

정리

map(int, input().split(구분자))는 입력을 구분자로 잘라 정수 리스트로 변환하며 구분자는 결과에 남지 않는다. print(a, b)의 기본 sep는 공백이므로 '53 44'가 출력된다.
#프로그래밍언어활용
Q14

네트워크 장비에 대한 설명으로 옳지 않은 것은?

1브라우터는 전송되는 신호가 전송 선로의 특성 및 외부 충격 등의 요인으로 인해 원래의 형태와 다르게 왜곡되거나 약해질 경우 원래의 신호 형태로 재생하여 다시 전송하는 역할을 수행 한다.
2브리지는 LAN과 LAN을 연결하거나 LAN 안에서의 컴퓨터 그룹을 연결하는 기능을 수행하며데이터, 링크 계층 중 MAC 계층에서 사용된다.
3스위치는 LAN과 LAN을 연결하여 훨씬 더 큰 LAN을 만드는 장치로, OSI 7계층의 2계층에서 사용된다.
4라우터는 LAN과 LAN의 연결 기능에 데이터 전송의 최적 경로 를 선택할 수 있는 기능이 추가된 것으로서로, 다른 LAN이나 LAN과 WAN의 연결도 수행하고, OSI 7계층의 네트워크 계층 에서 동작한다.
정답 1번 · 브라우터는 전송되는 신호가 전송 선로의 특성 및 외부 충격 등의 요인으로 인해 원래의 형태와 다르게 왜곡되거나 약해질 경우 원래의 신호 형태로 재생하여 다시 전송하는 역할을 수행 한다.

핵심 해설

네트워크 장비는 동작하는 OSI 계층으로 구분한다. 물리 계층에는 리피터와 허브, 데이터 링크 계층에는 브리지와 스위치, 네트워크 계층에는 라우터와 L3 스위치, 그 위 계층까지 다루는 것으로 게이트웨이가 있다. 1번이 설명하는 '약해지거나 왜곡된 신호를 원래 형태로 재생해 다시 전송하는 장비'는 물리 계층의 리피터(Repeater)이며, 브라우터(Brouter)는 브리지와 라우터를 합친 장비로 라우팅 가능한 프로토콜은 라우터처럼, 그렇지 않은 프로토콜은 브리지처럼 처리하는 복합 장비다. 따라서 브라우터를 리피터의 정의로 설명한 1번이 옳지 않다.

보기별 해설

1. 브라우터에 대한 설명이 아니라 리피터의 정의라서 틀렸다. 감쇠·왜곡된 신호를 증폭·재생해 전송 거리를 늘리는 것은 물리 계층 장비인 리피터이고, 브라우터(Brouter)는 브리지와 라우터 기능을 함께 갖춰 라우팅 가능한 프로토콜은 라우팅하고 나머지는 브리징하는 장비다.
2. 브리지는 두 LAN을 연결하거나 하나의 LAN을 세그먼트로 나눠 연결하는 데이터 링크 계층 장비로, MAC 주소를 학습해 프레임을 전달할지 걸러낼지 결정하므로 옳은 설명이다. 원문의 '수행하며데이터,'는 '수행하며, 데이터 링크 계층'이 깨진 것이다.
3. 스위치는 여러 LAN 세그먼트를 연결해 더 큰 LAN을 구성하는 장비로, MAC 주소 기반으로 포트를 지정해 프레임을 전달하는 2계층(데이터 링크) 장비이므로 옳다. 브리지를 하드웨어로 고속화하고 포트 수를 늘린 형태로 이해하면 된다.
4. 라우터는 IP 주소를 보고 라우팅 테이블에서 최적 경로를 선택해 패킷을 전달하는 3계층(네트워크) 장비로, 서로 다른 LAN이나 LAN과 WAN을 연결하므로 옳은 설명이다. 원문의 '것으로서로,'는 '것으로, 서로 다른 LAN'이 깨진 것이다.

정리

계층별 장비 — 1계층: 리피터·허브(신호 증폭·재생), 2계층: 브리지·스위치(MAC 기반), 3계층: 라우터(IP 기반 경로 선택), 전 계층: 게이트웨이. 브라우터는 브리지+라우터 복합 장비다.
#프로그래밍언어활용#OSI7계층
Q15

HTTP의 잘 알려진(Well Known) 포트 번호는?

123
280
353
4443
정답 2번 · 80

핵심 해설

잘 알려진 포트(Well-Known Port)는 0~1023번 범위로 IANA가 주요 서비스에 지정해 둔 번호다. HTTP는 웹 문서를 주고받는 응용 계층 프로토콜로 TCP 80번을 사용하며, 여기에 TLS 암호화를 더한 HTTPS는 443번을 쓴다. 나머지 보기도 모두 실제 존재하는 잘 알려진 포트지만 각각 Telnet(23), DNS(53), HTTPS(443)에 해당하므로 HTTP의 포트는 80이다.

보기별 해설

1. 23번은 Telnet의 포트다. 원격 터미널 접속 프로토콜로 데이터를 암호화하지 않고 평문 전송하기 때문에 보안상 22번을 쓰는 SSH로 대체되었다.
2. 80번은 HTTP의 잘 알려진 포트다. 웹 브라우저가 URL에 포트를 명시하지 않으면 http:// 요청은 자동으로 80번 포트로 연결된다.
3. 53번은 DNS의 포트다. 도메인 이름을 IP 주소로 변환하는 서비스로, 일반 질의는 UDP 53번을, 영역 전송(Zone Transfer)처럼 큰 데이터는 TCP 53번을 사용한다.
4. 443번은 HTTPS의 포트다. HTTP에 SSL/TLS 암호화를 적용한 프로토콜로 통신 내용을 보호하며, HTTP의 기본 포트인 80번과 구분해서 외워야 한다.

정리

주요 Well-Known Port — FTP 20/21, SSH 22, Telnet 23, SMTP 25, DNS 53, HTTP 80, POP3 110, IMAP 143, HTTPS 443.
#프로그래밍언어활용
Q16

배치 프로그램의 필수 요소에 대한 설명으로 틀린 것은?

1자동화는 심각한 오류 상황 외에는 사용자의 개입 없이 동작해 야 한다.
2안정성은 어떤 문제가 생겼는지언제, 발생했는지 등을 추적할 수 있어야 한다.
3대용량 데이터는 대용량의 데이터를 처리할 수 있어야 한다.
4무결성은 주어진 시간 내에 처리를 완료할 수 있어야 하고, 동시에 동작하고 있는 다른 애플리케이션을 방해하지 말아야 한다. 5
정답 4번 · 무결성은 주어진 시간 내에 처리를 완료할 수 있어야 하고, 동시에 동작하고 있는 다른 애플리케이션을 방해하지 말아야 한다. 5

핵심 해설

배치 프로그램의 필수 요소는 대용량 데이터, 자동화, 견고성(Robustness), 안정성/신뢰성(Stability), 성능(Performance) 다섯 가지다. 이 중 성능은 다른 애플리케이션을 방해하지 않으면서 주어진 시간 안에 처리를 완료해야 한다는 요건이고, 안정성은 오류가 언제 어디서 발생했는지 추적할 수 있어야 한다는 요건이며, 견고성은 잘못된 데이터나 중복 데이터가 들어와도 중단되지 않고 처리하는 성질이다. 4번은 성능의 정의를 '무결성'이라는 이름으로 잘못 붙였고, 무결성은 애초에 배치 프로그램 필수 요소 목록에 없으므로 틀린 설명이다.

보기별 해설

1. 자동화는 심각한 오류 상황을 제외하면 사용자 개입 없이 스스로 동작해야 한다는 요건이므로 옳은 설명이다. 정해진 일정이나 조건에 따라 무인으로 실행되는 것이 배치 처리의 전제다.
2. 안정성은 어떤 문제가 언제 발생했는지 추적할 수 있어야 한다는 요건으로 옳은 설명이다. 로그와 이력을 남겨 장애 발생 지점을 파악하고 복구할 수 있게 하는 성질이다. 원문의 '생겼는지언제,'는 '생겼는지, 언제'가 깨진 것이다.
3. 대용량 데이터는 배치 프로그램이 대량의 데이터를 한 번에 처리할 수 있어야 한다는 요건으로 옳다. 소량을 즉시 응답하는 온라인 처리와 대비되는 배치의 본질적 특성이다.
4. 무결성이라는 이름이 틀렸다. 주어진 시간 내 처리 완료와 다른 애플리케이션 비방해는 '성능(Performance)'의 정의이며, 무결성은 배치 프로그램의 필수 요소 목록에 포함되지 않는다. 끝의 '5'는 PDF 추출 과정에서 끼어든 쪽 번호 잡음이다.

정리

배치 프로그램 필수 요소 5가지 — 대용량 데이터, 자동화, 견고성(잘못된 데이터에도 중단 없음), 안정성(오류 추적 가능), 성능(제한 시간 내 완료·타 앱 비방해).
#프로그래밍언어활용
Q17

빈 기억공간의 크기가 20K, 16K, 8K, 40K일 때 기억장치 배치 전략으로 “Worst Fit”을 사용하여 17K의 프로그램을 적재할 경우 내부 단편화의 크기는?

13K
223K
344K
467K
정답 2번 · 23K

핵심 해설

Worst Fit(최악 적합)은 사용 가능한 빈 공간 중 가장 큰 곳에 프로그램을 배치하는 전략이다. 빈 공간이 20K, 16K, 8K, 40K이므로 17K 프로그램은 가장 큰 40K 영역에 적재된다. 내부 단편화는 할당된 분할 안에서 실제로 쓰이지 않고 남은 공간을 뜻하므로 40K - 17K = 23K가 된다. 참고로 First Fit이면 첫 번째로 만나는 20K에 배치해 3K, Best Fit이면 17K보다 크면서 가장 작은 20K에 배치해 역시 3K의 내부 단편화가 생긴다.

보기별 해설

1. 3K는 20K 영역에 적재했을 때의 내부 단편화(20K - 17K)로, First Fit이나 Best Fit을 적용한 결과다. Worst Fit은 가장 큰 40K를 선택하므로 이 값이 나오지 않는다.
2. 23K는 Worst Fit이 선택한 가장 큰 빈 공간 40K에 17K 프로그램을 적재하고 남은 40K - 17K의 값이다. 이 남는 공간이 해당 분할 내부에서 낭비되는 내부 단편화가 된다.
3. 44K는 프로그램이 배치되지 않은 나머지 빈 공간 20K + 16K + 8K를 합한 값이다. 이는 분할 밖에 흩어져 남은 외부 단편화 성격의 공간이지 내부 단편화가 아니다.
4. 67K는 전체 빈 공간 20K+16K+8K+40K = 84K에서 프로그램 17K를 뺀 값이다. 미사용 공간의 총합일 뿐 특정 분할 안에서 남은 공간을 뜻하는 내부 단편화와는 다르다.

정리

배치 전략 — First Fit(순서상 처음 들어가는 곳), Best Fit(들어가는 곳 중 가장 작은 곳), Worst Fit(가장 큰 곳). 내부 단편화 = 선택된 분할 크기 - 프로그램 크기이며, 여기서는 40K - 17K = 23K다.
#프로그래밍언어활용
Q18

IPv4와 IPv6 간의 주소 전환에 사용되는 기술이 아닌 것은?

1듀얼 스택
2터널링
3헤더 변환
4라우팅
정답 4번 · 라우팅

핵심 해설

IPv4에서 IPv6로 넘어가는 과도기에 두 프로토콜을 공존시키는 전환(transition) 기술은 듀얼 스택, 터널링, 헤더 변환(주소 변환) 세 가지다. 듀얼 스택은 한 장비에 두 프로토콜 스택을 모두 올려 상대에 맞춰 골라 쓰고, 터널링은 IPv6 패킷을 IPv4 패킷 속에 캡슐화해 IPv4망을 통과시키며, 헤더 변환은 IPv4 헤더와 IPv6 헤더를 서로 바꿔 주는 방식이다. 라우팅은 목적지까지의 최적 경로를 결정하는 네트워크 계층의 일반적인 경로 선택 기능일 뿐 버전 간 주소 전환 기술이 아니므로 답은 4번이다.

보기별 해설

1. 듀얼 스택(Dual Stack)은 하나의 호스트나 라우터에 IPv4와 IPv6 프로토콜 스택을 동시에 구현해, 통신 상대의 버전에 맞는 스택을 선택해 사용하는 전환 기술이다. 가장 직관적이지만 주소와 자원을 이중으로 유지해야 한다.
2. 터널링(Tunneling)은 IPv6 패킷 전체를 IPv4 패킷의 페이로드로 캡슐화해 IPv4 기반 구간을 통과시킨 뒤 반대편에서 원래 패킷으로 복원하는 전환 기술이다. IPv6 망 사이에 IPv4 구간이 끼어 있을 때 사용한다.
3. 헤더 변환(Header Translation)은 IPv6 패킷의 헤더를 IPv4 헤더로, 또는 그 반대로 변환해 서로 다른 버전만 지원하는 호스트끼리 통신하게 하는 전환 기술이다. 주소 변환(NAT-PT) 방식이 여기 해당한다.
4. 라우팅(Routing)은 패킷을 목적지까지 보내기 위해 라우팅 테이블을 참조해 최적 경로를 결정·전달하는 네트워크 계층의 기본 기능이다. IPv4든 IPv6든 공통으로 수행되는 동작이며 두 버전 사이의 주소를 바꿔 주는 전환 기술이 아니다.

정리

IPv4 ↔ IPv6 전환 기술 3가지 — 듀얼 스택(두 스택 동시 탑재), 터널링(IPv6를 IPv4로 캡슐화), 헤더 변환(헤더를 상호 변환). 라우팅은 전환 기술이 아니다.
#프로그래밍언어활용#IPv6#네트워크#라우팅
Q19

JAVA에서 변수와 자료형에 대한 설명으로 틀린 것은?

1변수는 어떤 값을 주기억장치에 기억하기 위해서 사용하는 공 간이다.
2char 자료형은 한 개의 문자를 저장하고자 할 때 사용한다.
3실수형 자료형에는 float, short, byte가 있다.
4boolean 자료형은 조건이 참인지 거짓인지 판단하고자 할 때 사용한다.
정답 3번 · 실수형 자료형에는 float, short, byte가 있다.

핵심 해설

자바의 기본형(primitive type)은 정수형 byte(1바이트), short(2바이트), int(4바이트), long(8바이트), 실수형 float(4바이트), double(8바이트), 문자형 char(2바이트), 논리형 boolean 여덟 가지다. 즉 실수형에 속하는 것은 float과 double 둘뿐이며, short와 byte는 크기가 작은 정수형이다. 3번은 정수형인 short와 byte를 실수형으로 분류했으므로 틀린 설명이다.

보기별 해설

1. 변수는 값을 주기억장치에 저장하기 위해 이름을 붙인 공간이라는 설명은 옳다. 자료형에 따라 확보되는 메모리 크기와 저장 가능한 값의 범위가 정해진다.
2. char 자료형은 한 개의 문자를 저장하는 데 쓰이므로 옳은 설명이다. 자바의 char는 유니코드를 쓰기 때문에 2바이트이며, 값은 'A'처럼 작은따옴표로 감싼다.
3. 실수형에 short와 byte가 포함된다는 서술이 틀렸다. 자바의 실수형은 float(4바이트)과 double(8바이트) 두 가지뿐이고, short(2바이트)와 byte(1바이트)는 int·long과 함께 정수형에 속한다.
4. boolean 자료형은 조건의 참(true)과 거짓(false)을 판단하는 데 사용하므로 옳은 설명이다. C와 달리 자바에서는 정수 0/1을 참·거짓으로 자동 변환하지 않고 boolean만 조건식에 쓸 수 있다.

정리

자바 기본형 8가지 — 정수형 byte(1)/short(2)/int(4)/long(8), 실수형 float(4)/double(8), 문자형 char(2), 논리형 boolean. 실수형은 float과 double뿐이다.
#프로그래밍언어활용#Java
Q20

다음 중 HRN에 대한 설명으로 옳지 않은 것은?

1대기 시간과 서비스 시간을 이용하는 방법이다.
2대기 시간이 긴 프로세스일 경우 우선순위가 높다.
3우선순위 계산식 값이 낮을수록 우선순위가 높다.
4SJF 기법을 보완하기 위한 스케쥴링 방법이다.
정답 3번 · 우선순위 계산식 값이 낮을수록 우선순위가 높다.

핵심 해설

HRN(Highest Response ratio Next)은 실행 시간이 짧은 작업만 계속 선택해 긴 작업이 무한정 밀리는 SJF의 기아(starvation) 현상을 보완하려고 대기 시간을 우선순위에 반영한 비선점 스케줄링 기법이다. 우선순위 계산식은 (대기 시간 + 서비스 시간) ÷ 서비스 시간이며, 이 값이 클수록 우선순위가 높다. 예를 들어 대기 20·서비스 10인 작업은 (20+10)/10 = 3, 대기 10·서비스 10인 작업은 (10+10)/10 = 2가 되어 앞의 작업이 먼저 선택된다. 따라서 값이 낮을수록 우선순위가 높다고 한 3번이 옳지 않다.

보기별 해설

1. 대기 시간과 서비스 시간을 모두 이용한다는 설명은 옳다. 우선순위 = (대기 시간 + 서비스 시간) / 서비스 시간이라는 계산식에 두 값이 그대로 들어간다.
2. 대기 시간이 길수록 우선순위가 높다는 설명은 옳다. 분자의 대기 시간이 커지면 응답 비율 값이 커지므로, 오래 기다린 작업이 자연스럽게 선택되어 기아 현상이 방지된다.
3. 우선순위 계산식 값이 낮을수록 우선순위가 높다는 서술이 틀렸다. HRN은 응답 비율(response ratio)이 가장 큰 작업을 다음에 실행하므로, 값이 클수록 우선순위가 높다.
4. SJF를 보완하기 위한 기법이라는 설명은 옳다. SJF는 서비스 시간만 보므로 긴 작업이 계속 밀리는데, HRN은 대기 시간을 분자에 더해 기다릴수록 우선순위가 올라가게 만들어 이 문제를 해결한다.

정리

HRN 우선순위 = (대기 시간 + 서비스 시간) ÷ 서비스 시간, 값이 클수록 먼저 실행된다. SJF의 기아 현상을 보완한 비선점 기법이다.
#프로그래밍언어활용#프로세스