studyLAB

우리 FIS 아카데미(AI엔지니어링) [2주차] 본문

dailyLAB

우리 FIS 아카데미(AI엔지니어링) [2주차]

studyLAB 2026. 1. 11. 18:31

dailyLAB 1. 2주차 배운 것

 

2주차 배운 것들

 

 

처음 부트캠프에 대해서 고민했던 이유 중 하나는 이미 알고있는 python코딩에 대해서 기초부터 배우는 시간이 아깝다는 생각도 있었습니다. 그러나 예상과는 다르게 분명 배웠던 python문법들이지만, 강사님께서 아주 상세히 강의를 해 주셨습니다.

 

예를 들면

python의 id(객체 별 주소) 구조를 활용한 코딩 매커니즘 설명이 있습니다

 

python에서는 각 객체 별로 상이한 id를 부여하여 저장을 하게 됩니다.

상단의 이미지를 확인하면 a = 1에 11654376이라는 id, b = 2에 11654408이라는 id가 할당된 것을 확인 가능합니다.

 

이를 바탕으로 더 체계적인 정보 관리와 python만의 특별한 입력 방식이 생기게 됩니다.

 

위처럼 주어진 a, b에 대해서 a와 b의 값을 바꾸기 위해서는 어떠한 과정을 거쳐야 할까요?

 

python문법을 처음 접한다면 a = b, b = a로 지정하면 될 듯 하지만 이는 잘못된 생각입니다.

python은 인터프리터 언어이기에 입력된 코드를 한 줄씩 번역하고 실행하게 됩니다. 추가로 a = b라고 지정하는 순간 아래 이미지와 같은 상황이 발생하게 됩니다.

a의 id 주소가 b의 id 주소와 동일하게 되어버립니다.

a와 b가 동일한 주소의 동일한 값을 가진 상태로 a = b다음의 b = a를 수행하면 여전히 같은 주소, 같은 값을 가지게 되어 a와 b의 값을 전환할 수 없게 됩니다.

 

이런 특성을 활용하여 값을 교체하기 위해서는 python의 tuple형식을 활용하여 교체가 가능합니다.

a, b = b, a라는 코드를 통해 (a, b)라는 tuple을 (b, a)의 값으로 정의를 하게 되면 한 줄 안에 a = b, b = a가 지정 가능하고 a, b의 id주소가 서로 교체 된 것을 알 수 있습니다.

 

이와같이 과거에는 별 생각없이 암기하듯 작성해온 코딩이었지만, 아카데미에서 그 원인에 대해 설명받으니 왜 그렇게 되는지 이해하기 너무 수월했다고 생각되었습니다.

 

 

쭉 이어서 이번 한 주에는 조건문, 반복문, 함수, 문자열, 정규식, 클래스 등 상당히 많은 개념들을 배울 수 있었습니다. 특히나 코딩 테스트를 함께 준비하는데 도움이 될 수 있도록 강의 중간중간에 적절한 문제 풀이를 섞어가며 배운 것도 많은 도움이 되었습니다.

 

 

dailyLAB 2. 코딩 스터디

저는 과거 코딩 테스트를 준비해 본 경험이 있었고, 그때 학교 동기들과 코딩 스터디 모임을 구성하여 매주마다 문제를 풀어오고 서로 풀어온 방식을 공유하는 경험을 하였습니다. 그러나 취업 준비를 하며 코딩테스트까지 참여하는 기회가 없었다보니 자연스레 코딩 테스트 공부 기억이 사라졌습니다.

 

이를 해결하기 위해 저는 첫 주 부터 적극적으로 스터디 모임을 개최하길 바래왔고, 사람이 어느정도 모이자 바로 스터디 모임을 시작했습니다.

 

이번주 첫 모임을 수행하며 느낀 점은 "여러 사람이 모인 그룹에서 체계적으로 활동해 나가게끔 계획하는 것이 어렵다" 입니다. 제가 스터디 모임 경험이 있다 보니 자연스레 부원들에게 다양한 의견을 제시하고, 저의 의견대로 모임이 수행되었습니다. 그러나 매번 모일때마다 아쉬운 부분이 많았고, 저 스스로도 계속 말이 바뀌며 일관되지 못한 스터디 방식에 약간의 답답함을 느꼈습니다.

이 부분은 꾸준한 모임과 부원들과의 대화로 타협안을 찾아가며 매주 일관된 일정으로 픽스가 되길 기대하고 있습니다.

 

 

스터디 활동에서는 과거 제가 진행했던 방식으로 각자 문제를 풀어오고 문제를 푼 방식을 서로에게 설명하는 것으로 하였습니다. 코딩 테스트 문제는 정말 다양한 유형이 있고, 같은 유형 안에서도 다양한 풀이가 가능하여 최대한 많은 관점, 풀이 방식을 접해보는게 좋다고 생각하였습니다. 또한 과거 진행했던 스터디의 기억이 거의 없다시피 해져서 이번에는 아예 기초부터 확실하게 잡고 가자는 마음이 있었고 부원들도 이에 동의해 주었습니다.

 

그렇기에 첫 주에는 모두 시간복잡도에 대해서 공부하고 가벼운 문제를 풀어보며 각 문제에 사용되는 코드의 시간복잡도를 알아오는 과제를 수행하였습니다. 

 

 

코딩 테스트 문제에는 시간 제한이 존재합니다. 

모든 코드에 대해서 정확한 시간 계산은 사실 불가능하기에 대략적인 수치로써 저는 1초당 1억번 정도로 가정합니다.

또한 표기법으로 "빅오 표기법"을 사용하여 다양한 문제에 대한 시간복잡도를 직접 계산해 보았습니다.

 

빅오 표기법은 다음과 같습니다.

  • O(1) 상수시간 : 입력 크기 N과 상관없이 항상 일정한 시간 (ex. array의 특정 인덱스 접근)
  • O(log N) 로그시간 : 연산마다 처리할 데이터가 절반으로 줄어 드는 경우 (ex. 이진 탐색)
  • O(N) 선형 시간 : 입력 데이터 N만큼 반복문을 수행 (ex. for문)
  • O(Nlog N) 선형 로그 시간 : N번 반복하면서 내부에서 log N 연산을 수행 (ex. sort(), sorted())
  • O(N^2) 이차 시간 : 중첩 반복문
  • O(2^N) 지수 시간 :  데이터가 하나 늘어날 때마다 연산이 2배로 증가 (ex. 재귀, 완전탐색)

이 개념을 우선적으로 먼저 파악을 한 후, 실제 문제에서 시간이 어떻게 계산되는지 적용해 보았습니다.

간단한 예시로 백준의 최소, 최대 문제(10818)를 확인 해 보겠습니다.

 

해당 문제에서는 정수의 개수 N과 N개의 정수가 주어집니다. 여기서 주목할 점은 실제 연산이 수행될 횟수인 정수의 개수 N입니다.

N이 1 ~ 1,000,000까지 이기에 만약 2차시간(O(N^2) ; 중첩 반복문)으로 코드를 작성하게 된다면 1,000,000^2의 값인 1조번의 연산이 수행됩니다. 그렇다면 1초당 1억번으로 가정한 상황에서 1조번은 1000초의 시간이 소요됨을 간단히 알 수 있습니다.

 

물론 이 문제에서는 반복문이 필요하지 않습니다. 단순한 min, max함수를 활용하여 계산이 가능합니다.

import sys 

N = int(sys.stdin.readline())

my_list = list(map(int, sys.stdin.readline().split()))
max_val = max(my_list)
min_val = min(my_list)

print(min_val, max_val)

 

그러나 복잡한 문제로 이어질 수록 문제에서 주어지는 값들을 바탕으로 "내가 이 문제에서 어느정도까지의 연산이 가능하지?"를 파악 한 후 코딩에 들어서는 것이 정말 중요하다고 생각하였습니다.

 

 

 

지난주는 휴일이 껴있어서 3일만 수업을 들었지만, 이번주는 5일 꽉 채워서 들었다보니 금요일이 정말 힘들었던것 같습니다. 주말에 꾸준히 체력 관리를 하여 6개월이라는 긴 시간동안 낙오되지 않도록 최선을 다하는것이 중요하다 생각이 되고, 하루에 정말 많은 시간동안 많은 내용을 배우게 되기에 복습 또한 꾸준히 하는게 중요하다 생각된 한 주 였습니다. 

 

 

 

dailyLAB 3. 여담

이번주에 아카데미에서 웰컴 키트를 선물 받았습니다. 404 NOT FOUND라는 문구부터 개발자 다운(?) 키트라 생각이 들었고, 텀블러를 포함해 강의를 수강하며 필요한 노트북 관련 물품들을 여럿 선물해 주셨습니다. 덕분에 잘 활용하며 공부를 이어나갈 수 있었습니다.