2026 하계 모각코 - 3회차 (결과)

Jihwan Jung·2026년 7월 13일

2026 하계 모각코

목록 보기
7/13

1. 정보처리기사 취득 준비

소프트웨어 개발 방법론 활용에서는 소프트웨어를 체계적으로 개발하기 위해 적용하는 개발 절차와 방법론을 학습하였다. 구조적 방법론, 정보공학 방법론, 객체지향 방법론, 애자일 방법론 등 다양한 개발 방법론의 특징을 살펴보고, 프로젝트의 목적과 환경에 따라 적절한 방법론을 선택해야 한다는 점을 이해하였다. 또한 소프트웨어 생명주기와 개발 단계별 산출물, 비용 산정 및 일정 관리 방법에 대해서도 학습하였다.

IT 프로젝트 정보 시스템 구축 관리에서는 정보 시스템 구축 프로젝트를 계획하고 수행하는 데 필요한 관리 방법을 학습하였다. 프로젝트의 범위, 일정, 비용, 품질, 인력 등을 체계적으로 관리해야 하며, 각 단계에서 발생할 수 있는 위험 요소를 사전에 파악하고 대응하는 것이 중요하다는 점을 이해하였다. 또한 요구사항 분석부터 시스템 구축, 테스트, 운영에 이르기까지 전체 프로젝트 과정을 관리하는 방법을 학습하였다.

소프트웨어 개발 보안 구축에서는 소프트웨어 개발 과정에서 발생할 수 있는 보안 취약점을 예방하고 안전한 프로그램을 구현하는 방법을 학습하였다. 입력값 검증, 인증과 권한 관리, 암호화, 오류 처리 등 보안 기능을 설계하고 구현하는 방법을 살펴보았다. 특히 개발 초기 단계부터 보안을 고려해야 취약점 발생 가능성을 줄일 수 있으며, 시큐어 코딩을 통해 안전한 소프트웨어를 구축하는 것이 중요하다는 점을 배웠다.

시스템 보안 구축에서는 서버, 네트워크, 데이터베이스 등 정보 시스템을 외부의 공격과 내부의 위협으로부터 보호하는 방법을 학습하였다. 접근 통제, 사용자 인증, 방화벽, 침입 탐지 및 방지 시스템, 악성코드 대응 등 주요 보안 기술을 이해하였다. 또한 시스템의 보안 상태를 지속적으로 점검하고, 보안 사고 발생 시 신속하게 대응할 수 있는 관리 체계를 구축해야 한다는 점을 알 수 있었다.

2. 코딩테스트 공부

import heapq
from collections import deque


# 1. 기본 스택
# 후입선출 구조를 활용하여 데이터를 삽입하고 삭제하는 문제
def stack_operation(commands):
    stack = []
    result = []

    for command in commands:
        if command[0] == "push":
            stack.append(command[1])

        elif command[0] == "pop":
            if stack:
                result.append(stack.pop())
            else:
                result.append(-1)

        elif command[0] == "top":
            if stack:
                result.append(stack[-1])
            else:
                result.append(-1)

    return result


commands = [
    ("push", 10),
    ("push", 20),
    ("top",),
    ("pop",),
    ("pop",)
]

print("스택 연산 결과:", stack_operation(commands))


# 2. 괄호 검사
# 여는 괄호를 스택에 저장하고 닫는 괄호와 짝이 맞는지 확인하는 문제
def check_parentheses(expression):
    stack = []
    pairs = {
        ")": "(",
        "]": "[",
        "}": "{"
    }

    for char in expression:
        if char in "([{":
            stack.append(char)

        elif char in ")]}":
            if not stack or stack[-1] != pairs[char]:
                return False

            stack.pop()

    return len(stack) == 0


expression = "({[]})"
print("올바른 괄호인지 확인:", check_parentheses(expression))


# 3. 문자열 및 수식 처리
# 후위 표기식의 숫자를 순서대로 확인하며 스택을 이용해 계산하는 문제
def calculate_postfix(expression):
    stack = []

    for token in expression.split():
        if token.isdigit():
            stack.append(int(token))

        else:
            second = stack.pop()
            first = stack.pop()

            if token == "+":
                stack.append(first + second)
            elif token == "-":
                stack.append(first - second)
            elif token == "*":
                stack.append(first * second)
            elif token == "/":
                stack.append(first // second)

    return stack.pop()


postfix = "3 4 + 2 *"
print("후위 표기식 계산 결과:", calculate_postfix(postfix))


# 4. 단조 스택
# 현재 원소보다 큰 다음 원소를 탐색하는 문제
def next_greater_number(numbers):
    result = [-1] * len(numbers)
    stack = []

    for index, number in enumerate(numbers):
        while stack and numbers[stack[-1]] < number:
            previous_index = stack.pop()
            result[previous_index] = number

        stack.append(index)

    return result


numbers = [2, 3, 1, 5]
print("오큰수 결과:", next_greater_number(numbers))


# 5. 기본 큐
# 선입선출 구조를 활용하여 데이터를 삽입하고 삭제하는 문제
def queue_operation(commands):
    queue = deque()
    result = []

    for command in commands:
        if command[0] == "push":
            queue.append(command[1])

        elif command[0] == "pop":
            if queue:
                result.append(queue.popleft())
            else:
                result.append(-1)

        elif command[0] == "front":
            if queue:
                result.append(queue[0])
            else:
                result.append(-1)

    return result


commands = [
    ("push", 10),
    ("push", 20),
    ("front",),
    ("pop",),
    ("pop",)
]

print("큐 연산 결과:", queue_operation(commands))


# 6. 작업 순서 처리
# 입력된 순서대로 작업을 저장하고 앞에서부터 처리하는 문제
def process_tasks(tasks):
    queue = deque(tasks)
    completed = []

    while queue:
        task = queue.popleft()
        completed.append(task)

    return completed


tasks = ["로그인 처리", "데이터 조회", "결과 출력"]
print("작업 처리 순서:", process_tasks(tasks))


# 7. 우선순위 큐
# 현재 후보 중 우선순위가 가장 높은 작업부터 처리하는 문제
def priority_task(tasks):
    heap = []

    for priority, task in tasks:
        heapq.heappush(heap, (-priority, task))

    result = []

    while heap:
        priority, task = heapq.heappop(heap)
        result.append(task)

    return result


tasks = [
    (2, "일반 작업"),
    (5, "긴급 작업"),
    (3, "중요 작업")
]

print("우선순위 작업 처리 결과:", priority_task(tasks))


# 8. 덱
# 앞과 뒤에서 데이터를 삽입하고 삭제하는 문제
def deque_operation():
    data = deque()

    data.append(10)
    data.append(20)
    data.appendleft(5)

    left_value = data.popleft()
    right_value = data.pop()

    return left_value, right_value, list(data)


print("덱 연산 결과:", deque_operation())


# 9. 시뮬레이션
# 큐에 주어진 조건을 적용하며 문서의 출력 순서를 계산하는 문제
def printer_queue(priorities, location):
    queue = deque(
        (index, priority)
        for index, priority in enumerate(priorities)
    )

    count = 0

    while queue:
        current = queue.popleft()

        if any(current[1] < other[1] for other in queue):
            queue.append(current)

        else:
            count += 1

            if current[0] == location:
                return count


priorities = [2, 1, 3, 2]
location = 2
print("해당 문서의 출력 순서:", printer_queue(priorities, location))

이번 주에는 코딩테스트 대비를 위해 Queue와 Stack 유형의 문제 풀이를 진행하였다. 스택과 큐는 데이터를 저장하고 꺼내는 순서에 차이가 있으며, 문제에서 요구하는 처리 순서를 파악한 뒤 적절한 자료구조를 선택하는 것이 중요하다는 점을 이해하였다.

기본 스택 유형에서는 가장 나중에 삽입된 데이터가 가장 먼저 삭제되는 후입선출 구조를 학습하였다. 데이터를 삽입할 때는 push 연산을 사용하고, 가장 위에 있는 데이터를 삭제하거나 확인할 때는 pop과 top 연산을 활용하는 방법을 익혔다.

괄호 검사 유형에서는 여는 괄호를 스택에 저장한 뒤 닫는 괄호가 등장했을 때 가장 최근에 저장된 여는 괄호와 짝이 맞는지 확인하는 문제를 풀이하였다. 괄호의 순서가 올바르지 않거나 모든 괄호가 정상적으로 제거되지 않은 경우에는 잘못된 문자열로 판단해야 한다는 점을 학습하였다.

문자열 및 수식 처리 유형에서는 문자열이나 수식을 왼쪽부터 순서대로 확인하면서 필요한 값을 스택에 저장하는 방법을 연습하였다. 특히 후위 표기식을 계산할 때 숫자는 스택에 저장하고, 연산자가 등장하면 스택에서 두 값을 꺼내 계산한 뒤 결과를 다시 저장하는 방식을 이해하였다.

단조 스택 유형에서는 스택 내부의 값이 증가하거나 감소하는 형태를 유지하도록 관리하면서 이전 또는 다음 원소를 효율적으로 찾는 방법을 학습하였다. 현재 값보다 작은 이전 원소를 제거하는 과정을 통해 각 원소의 다음 큰 수를 구할 수 있으며, 모든 값을 반복해서 비교하는 방식보다 효율적으로 문제를 해결할 수 있다는 점을 알 수 있었다.

기본 큐 유형에서는 가장 먼저 삽입된 데이터가 가장 먼저 삭제되는 선입선출 구조를 학습하였다. 큐의 뒤쪽에 데이터를 삽입하고 앞쪽에서 데이터를 꺼내는 방식을 활용하여, 입력된 순서대로 데이터를 처리하는 문제를 풀이하였다.

작업 순서 처리 유형에서는 여러 작업을 큐에 저장한 뒤 입력된 순서대로 하나씩 꺼내 처리하는 방법을 연습하였다. 대기열, 요청 처리, 메시지 전달처럼 먼저 들어온 작업을 우선적으로 처리해야 하는 상황에서 큐가 적절하게 활용될 수 있다는 점을 이해하였다.

우선순위 큐 유형에서는 단순히 입력된 순서대로 데이터를 처리하는 것이 아니라, 현재 후보 중 우선순위가 가장 높은 값을 먼저 선택하는 방법을 학습하였다. 파이썬의 heapq를 활용하여 최솟값이나 최댓값을 효율적으로 관리하고, 우선순위에 따라 작업을 처리하는 방법을 익혔다.

덱 유형에서는 데이터의 앞과 뒤에서 모두 삽입과 삭제가 가능한 자료구조의 특징을 학습하였다. 일반적인 큐보다 다양한 방향에서 데이터를 처리할 수 있기 때문에 슬라이딩 윈도우, 회전 큐, 양방향 탐색과 같은 문제에서 활용할 수 있다는 점을 이해하였다.

시뮬레이션 유형에서는 큐와 스택에 문제에서 제시한 조건을 차례대로 적용하며 처리 과정을 구현하는 연습을 하였다. 프린터 대기열 문제처럼 현재 작업보다 우선순위가 높은 작업이 존재하면 뒤로 이동시키고, 그렇지 않으면 바로 처리하는 과정을 직접 구현하였다.

이를 통해 Queue와 Stack 문제는 단순히 자료구조의 사용법을 아는 것뿐만 아니라, 데이터가 어떤 순서로 들어오고 나가야 하는지를 정확하게 파악하는 것이 중요하다는 점을 알 수 있었다. 또한 문제의 조건에 따라 일반 스택, 큐, 우선순위 큐, 덱 중 가장 적절한 자료구조를 선택하는 연습이 필요하다는 점을 이해하였다.

profile
사회 과학과 딥 러닝에 관심이 있는 학부생(CS&E)입니다. 기술과 사회에 대한 이해를 바탕으로, 비즈니스 감각과 기술적 역량을 함께 갖춘 인공지능 프로그래머•데이터 과학자로 성장하고 싶습니다.

0개의 댓글