햄버거 만들기
문제를 보는 순간 스택으로 풀어야겠다고 생각했다.
스택에 숫자를 하나씩 쌓다가 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 개발 방법론
폭포수 방법론
계획 → 설계 → 개발 → 시험 → 유지보수 단계를 순차적으로 진행하는 개발 방법론.
각 단계가 완료된 후에야 다음 단계로 넘어갈 수 있음.
장점
- 각 단계가 명확히 정의되어 있어 진행상황 추적이 쉽다.
- 요구사항, 설계 테스트 계획 등이 문서화되어 있어 프로젝트 전반에 걸쳐 명확한 기준을 제공한다.
- 단계별로 진행되므로 프로젝트 관리가 용이하다.
- 초기 단계에서 전체 프로젝트의 계획을 세우기 때문에 예산과 일정 예측이 가능하다.
단점
- 이미 진행된 작업에 대해 변경 및 수정이 어렵다.
- 요구사항이 변경될 경우 유연하게 대처하기 어렵다.
- 최종 단계에 이르기 전까지 실제 작동하는 소프트웨어를 확인할 수 없어 피드백이 늦어진다.
- 개발 주기가 길어진다.
애자일 방법론
계획 → 설계 → 개발 → 시험 → 유지보수 단를 지속적으로 반복하는 개발 방법론.
각 반복 주기마다 소프트웨어는 점진적으로 개선되고 발전함.
장점
- 요구사항 변경에 유연하게 대응할 수 있다.
- 반복 주기마다 피드백을 받을 수 있어 문제를 빠르게 수정할 수 있다.
- 변화하는 환경에 빠르게 적응할 수 있다.
단점
- 명확한 초기 계획이 부족할 수 있어 방향성을 잃을 위험이 있다.
- 팀원과 이해 관계자의 높은 참여가 요구된다.
- 문서화가 부족할 수 있다.
- 지속적인 조정과 협업이 필요하므로 프로젝트 관리가 어려울 수 있다.
오늘의 회고
알고리즘의 늪에서 빠져나오고 싶어서 코드카타 한 문제 외에는 건드리지 않았다.
대신 특강때 배운 내용에 대해 복습하고, 부족한 부분은 검색해서 따로 공부했다.
스쿼드 숙제 해야하는데 큰일났다.
내일의 목표는 쉬면서 컴퓨터구조 + SW 설계 내용 복습하기
'매일 TIL' 카테고리의 다른 글
[내일배움캠프 6-2일] 코드카타, RVC 음성합성 AI(1) (0) | 2024.07.30 |
---|---|
[내일배움캠프 6-1일] 코드카타, 프로토콜, TCP/IP 4계층 (0) | 2024.07.29 |
[내일배움캠프 5-4일] 코드카타 문제, CS 특강, 스쿼드 문제 (0) | 2024.07.25 |
[내일배움캠프 5-3일] 동적 계획법, 유기농 배추 리뷰 (2) | 2024.07.24 |
[내일배움캠프 5-2일] 스쿼드 문제, A->B (0) | 2024.07.23 |