본문 바로가기

매일 TIL

[내일배움캠프 5-5일] 코드카타, 객체지향 프로그래밍, SW 개발 방법론

햄버거 만들기

문제를 보는 순간 스택으로 풀어야겠다고 생각했다.

스택에 숫자를 하나씩 쌓다가 1231이 차례로 쌓이는 순간 해당 부분을 제거한다는 아이디어.

def solution(ingredient):
    stack = []
    burger_cnt = 0

    for i in ingredient:
        stack.append(i)
        # 스택의 마지막 4개 요소가 '1231'을 형성하는지 확인
        if stack[-4:] == [1, 2, 3, 1]:
            # 카운트를 증가
            burger_cnt += 1
            # '1231' 패턴을 제거
            # 슬라이싱 부분에서 연산이 늘어나게 되면서 시간초과가 된 듯 O(n^2)
            stack = stack[:-4]

    return burger_cnt

스택의 마지막 4개의 요소가 1231이 된다면 burger_cnt를 1증가시킨다.

이후 1231을 제거하는 과정.

그냥 스택의 처음부터 뒤에서 4번째 요소를 제외한 범위까지 슬라이싱해서 새로운 stack값을 부여했다.

결과는 시간초과.

 

문제점

ingredient 리스트의 인자를 다 돌면서 반복문을 수행하게 되고
그때마다 슬라이싱을 통해 4개의 인자를 제외한 리스트를 만들게 되면서
리스트가 길면 길수록 굉장히 많은 연산이 필요하게 됨.
결과적으로 O(n^2)에 가까운 시간 복잡도를 가지게 되었다.

 

해결방법

for i in ingredient:
    stack.append(i)
    # 스택의 마지막 4개 요소가 '1231'이 되는지 확인
    if stack[-4:] == [1, 2, 3, 1]:
        # 된다면 카운트 +1
        burger_cnt += 1
        # 스택에서 '1231'을 pop을 통해 하나씩 제거
        for _ in range(4):
            stack.pop()

1231을 제거하는 과정에서 그냥 반복문을 4번 수행하여 pop을 해주면 된다.

1, 2, 3, 1 이렇게 네 번만 고정적으로 반복해주면 되기 때문에 시간복잡도는 O(1).

결과적으로 시간 복잡도가 O(n)에 해당하기 때문에 더 효율적이다.

 

최종 코드

def solution(ingredient):
    stack = []
    burger_cnt = 0

    for i in ingredient:
        stack.append(i)
        # 스택의 마지막 4개 요소가 '1231'이 되는지 확인
        if stack[-4:] == [1, 2, 3, 1]:
            # 된다면 카운트 +1
            burger_cnt += 1
            # 스택에서 '1231'을 pop을 통해 하나씩 제거
            for _ in range(4):
                stack.pop()

    return burger_cnt

객체지향 프로그래밍

추상화하고자 하는 객체의 모습을 가상의 공간에 구체화하며 설계해 나가는 것.
만들고 싶은 대상이 있다면 컴퓨터공학적 사고방식으로 그려 나가는 것.

  • 객체
    현실 세계의 어떤 대상을 추상화 한 것을 의미.

  • 클래스
    사용자 데이터타입, 객체를 만들기 위한 설계도.
    객체를 생성하기 위해 어떤 속성과 방법의 집합을 추상화하여 표현한 것을 의미.
    - 상속 : 다른 클래스의 기능을 사용하고 싶은 경우, 부모클래스 - 자식클래스 관계를 만들면 됨.
    - 오버라이딩 : 상속받은 클래스에서 어떤 기능을 재정의.
    - 오버로딩 : 함수의 이름은 같으나 매개변수를 다르게 설정하여 사용목적에 따라 다르게 불러오는 것.

 

객체 지향 프로그래밍의 장단점

장점

  • 클래스 단위로 모듈화시켜 개발하기 때문에 업무 분담이 편리하고 대규모 SW 개발에 적합하다.
  • 클래스 단위로 수정이 가능하므로 유지보수가 편리하다.
  • 클래스를 재사용하거나 상속을 통해 확장함으로써 코드 재사용이 용이하다.

단점

  • 처리속도가 상대적으로 느리다.
  • 객체의 수가 많아짐에 따라 용량이 커질 수 있다.
  • 설계시 많은 시간과 노력이 필요하게 될 수 있다.

SW 개발 방법론

 

폭포수 방법론

 

계획 → 설계 → 개발 → 시험 → 유지보수 단계를 순차적으로 진행하는 개발 방법론.
각 단계가 완료된 후에야 다음 단계로 넘어갈 수 있음.

 

장점 

  1. 각 단계가 명확히 정의되어 있어 진행상황 추적이 쉽다.
  2. 요구사항, 설계 테스트 계획 등이 문서화되어 있어 프로젝트 전반에 걸쳐 명확한 기준을 제공한다.
  3. 단계별로 진행되므로 프로젝트 관리가 용이하다.
  4. 초기 단계에서 전체 프로젝트의 계획을 세우기 때문에 예산과 일정 예측이 가능하다.

단점

  1. 이미 진행된 작업에 대해 변경 및 수정이 어렵다.
  2. 요구사항이 변경될 경우 유연하게 대처하기 어렵다.
  3. 최종 단계에 이르기 전까지 실제 작동하는 소프트웨어를 확인할 수 없어 피드백이 늦어진다.
  4. 개발 주기가 길어진다.

애자일 방법론

계획 → 설계 → 개발 → 시험 → 유지보수 단를 지속적으로 반복하는 개발 방법론.
각 반복 주기마다 소프트웨어는 점진적으로 개선되고 발전함.

 

장점 

  1. 요구사항 변경에 유연하게 대응할 수 있다.
  2. 반복 주기마다 피드백을 받을 수 있어 문제를 빠르게 수정할 수 있다.
  3. 변화하는 환경에 빠르게 적응할 수 있다.

단점

  1. 명확한 초기 계획이 부족할 수 있어 방향성을 잃을 위험이 있다.
  2. 팀원과 이해 관계자의 높은 참여가 요구된다.
  3. 문서화가 부족할 수 있다.
  4. 지속적인 조정과 협업이 필요하므로 프로젝트 관리가 어려울 수 있다.

오늘의 회고

 

알고리즘의 늪에서 빠져나오고 싶어서 코드카타 한 문제 외에는 건드리지 않았다.

대신 특강때 배운 내용에 대해 복습하고, 부족한 부분은 검색해서 따로 공부했다.

스쿼드 숙제 해야하는데 큰일났다.

 

내일의 목표는 쉬면서 컴퓨터구조 + SW 설계 내용 복습하기