안녕하세요! 개발자 꿈나무, 혹은 더 나은 곳으로 점프를 준비 중인 경력직 개발자라면 누구나 한 번쯤 '코딩 테스트'라는 산을 넘어야 하죠. 🧗♀️
어디서부터 어떻게 준비해야 할지 막막할 때가 많은데요. 걱정 마세요! 오늘은 코딩 테스트에 정말 **단골손님처럼 등장하는 기본 중의 기본 문제 3가지**를 뽑아서, 옆자리 동료에게 설명하듯 쉽고 재미있게 풀어보려고 해요. 이 문제들만 확실히 알아둬도 코딩 테스트 기본기는 탄탄하게 다질 수 있을 거예요. 자, 그럼 시작해볼까요? 🚀
1. FizzBuzz (피즈버즈): 코딩 첫걸음의 '국룰' 문제!
자, 첫 번째 문제는 바로 '피즈버즈'입니다! 아마 코딩 조금이라도 해보셨다면 들어봤을 법한 아주 유명한 문제죠? 🤔 "이거 모르면 간첩?" 소리 나올 정도랄까요?
- 문제 요약: 1부터 n까지 숫자를 쭉~ 출력하는데, 3의 배수는 "Fizz", 5의 배수는 "Buzz", 3과 5 둘 다의 배수(즉, 15의 배수)는 "FizzBuzz"라고 외쳐주면 돼요! 나머지는 그냥 숫자 그대로!
쉬워 보이지만, 막상 짜보면 은근히 조건 순서가 헷갈릴 수 있어요. 핵심은 15의 배수를 가장 먼저 체크해야 한다는 것! 안 그러면 15 같은 숫자가 "FizzBuzz" 대신 "Fizz"나 "Buzz"로 나올 수 있거든요.
파이썬 코드는 이렇게 짜볼 수 있겠죠?
def fizzbuzz(n):
"""1부터 n까지 FizzBuzz 규칙에 따라 리스트로 반환"""
results = [] # 결과 담을 빈 리스트 준비!
for i in range(1, n + 1): # 1부터 n까지 뽈뽈 돌아봅시다
if i % 15 == 0: # 제일 먼저 15배수인지 체크! (★중요★)
results.append("FizzBuzz")
elif i % 3 == 0: # 15배수 아니면, 3배수인지 체크
results.append("Fizz")
elif i % 5 == 0: # 3배수도 아니면, 5배수인지 체크
results.append("Buzz")
else: # 아무것도 아니면 숫자 그대로! (문자열로 바꿔서 넣어줘요)
results.append(str(i))
return results
# 15까지 돌려볼까요?
output = fizzbuzz(15)
print(output)
# 출력: ['1', '2', 'Fizz', '4', 'Buzz', 'Fizz', '7', '8', 'Fizz', 'Buzz', '11', 'Fizz', '13', '14', 'FizzBuzz']
# 와! 잘 나오네요! ✨
어때요? 반복문과 조건문만 알면 생각보다 간단하죠? 😉
2. Two Sum (투 썸): 면접관's Pick ❤️ 단골 질문!
다음 타자는 바로 'Two Sum'! 이건 정말... 코딩 인터뷰 봤다 하면 **열에 아홉은 만난다는 전설의 문제**입니다. LeetCode 같은 사이트에서도 당당히 1번 자리를 차지하고 있죠.
- 문제 요약: 숫자 리스트(배열)랑 목표 숫자(target)가 주어져요. 리스트 안에서 숫자 두 개를 딱! 골라서 더했을 때, 목표 숫자가 되는 그 두 녀석의 **위치(인덱스)**를 찾아내면 됩니다! (같은 위치 숫자를 두 번 쓰면 안 돼요!)
이 문제는 "어떻게 하면 더 빨리 찾을 수 있을까?"를 고민하게 만드는 게 매력이에요. 💡
가장 쉬운 생각 (근데 느려요 🐢): 리스트를 두 번 돌면서 모든 숫자 조합을 다 더해보는 거예요. 마치 옷 무더기 속에서 양말 짝 찾듯이 하나하나 비교하는 거죠. 코드는 간단하지만 숫자가 많아지면... 음... 컴퓨터가 힘들어해요. (시간 복잡도 O(n²))
좀 더 똑똑한 생각 (훨씬 빨라요 🚀): 딕셔너리(해시 테이블)라는 마법 상자를 쓰는 거예요! 리스트를 한 번 쭉 훑으면서, 각 숫자를 볼 때마다 "혹시 나랑 더해서 목표 숫자가 되는 짝꿍이 이미 마법 상자 안에 있나?" 확인하는 거죠.
- 숫자 `num`을 본다.
- 내 짝꿍 `target - num`이 마법 상자(`seen`)에 있는지 본다.
- 있다? 야호! 짝꿍의 위치랑 내 위치를 바로 알려주고 끝!
- 없다? 에잇, 아쉽네. 일단 나(`num`)랑 내 위치(`i`)를 마법 상자에 기록해두자! (나중에 내 짝꿍이 날 찾을 수 있게!)
이렇게 하면 리스트를 딱 한 번만 훑으면 되니 훨씬 빠르죠! (시간 복잡도 O(n))
똑똑한 방법의 파이썬 코드는 이렇습니다.
def two_sum(nums, target):
"""숫자 리스트 nums에서 두 수의 합이 target이 되는 인덱스 쌍 찾기"""
seen = {} # 마법 상자(딕셔너리) 준비! {숫자: 인덱스} 형태로 저장할 거예요.
for i, num in enumerate(nums): # 리스트 돌면서 인덱스(i)랑 숫자(num)를 같이 꺼내요.
complement = target - num # 내 짝꿍 찾아 삼만리~
if complement in seen: # 혹시 내 짝꿍이 마법 상자 안에?!
return [seen[complement], i] # 찾았다! 짝꿍 인덱스랑 내 인덱스 반환!
seen[num] = i # 내 짝꿍 없네... 일단 나랑 내 위치 마법 상자에 등록!
# 문제에서 답은 항상 있다고 했으니, 사실 여긴 올 일 없어요.
return []
# 테스트 해볼까요? nums = [2, 7, 11, 15], target = 9
indices = two_sum([2, 7, 11, 15], 9)
print(f"숫자 2와 7의 위치는? => {indices}")
# 출력: 숫자 2와 7의 위치는? => [0, 1]
# 0번 위치(2)랑 1번 위치(7)를 더하면 9가 맞네요! 성공! ✅
3. Valid Parentheses (유효한 괄호): 짝 맞추기의 달인, 스택! 📚
마지막 문제는 '유효한 괄호' 찾기! 괄호들이 `()`, `{}`, `[]` 이렇게 종류별로 잘 열리고 잘 닫혔는지, 순서는 맞는지 확인하는 문제입니다. 예를 들어 `({[]})`는 오케이👌, 근데 `([)]` 이건 순서가 엉망이라 안돼요🙅♀️.
- 문제 요약: 괄호로만 이루어진 문자열을 보고, 이게 수학적으로나 문법적으로 '말이 되는' 괄호 조합인지 판단하는 거예요.
이 문제의 핵심은 바로 **스택(Stack)** 이라는 자료구조를 사용하는 거예요! 스택? 어렵게 생각 마세요. 그냥 "쌓았다가 ⬆️ 나중에 넣은 것부터 빼는 ⬇️" 접시 더미 같은 거라고 생각하면 쉬워요. (Last-In, First-Out: LIFO)
어떻게 스택으로 괄호 짝을 맞출까요?
- 빈 접시 더미(스택)를 준비해요.
- 문자열을 하나씩 훑어요.
- 여는 괄호 (`(`, `{`, `[`)**를 만나면? 일단 접시 더미(스택) 위에 척! 올려놔요.
- 닫는 괄호 (`)`, `}`, `]`)**를 만나면? 잠깐! 접시 더미 맨 위에 있는 접시(가장 최근에 넣은 여는 괄호)를 살짝 꺼내서 지금 만난 닫는 괄호랑 짝이 맞는지 확인해요.
- 앗! 접시 더미가 비었네? 짝이 될 여는 괄호가 없으니 이건 실패! ❌
- 짝이 안 맞네? (예: `(`인데 `}`가 나옴) 이것도 실패! ❌
- 짝이 딱 맞네! 휴~ 다행. 그럼 그 접시는 치우고 계속 진행해요. ✅
- 문자열을 다 훑었는데... 접시 더미(스택)가 **깨끗하게 비어있다?** 그럼 성공! 모든 짝이 맞은 거예요! 🎉
- 만약 접시 더미에 **뭔가 남아있다?** 짝 못 찾은 여는 괄호가 있다는 뜻이니 실패! 😥
스택을 이용한 파이썬 코드는 아래와 같아요.
def is_valid_parentheses(s: str) -> bool:
"""괄호 문자열 s가 유효한지 스택으로 확인"""
stack = [] # 접시 더미(스택) 준비! 파이썬 리스트로 간단히 구현!
mapping = {")": "(", "}": "{", "]": "["} # 짝꿍 정보 저장 (닫는 괄호: 여는 괄호)
for char in s: # 문자열 하나씩 뜯어보자
if char in mapping: # 어랏? 닫는 괄호다!
# 스택 비었으면 임시로 '#'같은 값 넣어주고, 아니면 맨 위 접시 꺼내기!
top_element = stack.pop() if stack else '#'
# 꺼낸 접시(여는 괄호)랑 지금 닫는 괄호 짝꿍이랑 다르면? 실패!
if mapping[char] != top_element:
return False
else: # 여는 괄호네?
stack.append(char) # 스택에 차곡차곡 쌓아두자!
# 문자열 다 봤는데 스택이 비었으면? 성공! (짝 다 맞음)
return not stack # 비어있으면 True, 뭐라도 남아있으면 False
# 여러 가지 예시로 테스트!
print(f"'()': {is_valid_parentheses('()')} -> 기대값: True")
print(f"'()[]{{}}': {is_valid_parentheses('()[]{}')} -> 기대값: True")
print(f"'(]': {is_valid_parentheses('(]')} -> 기대값: False") # 짝 안 맞음
print(f"'([)]': {is_valid_parentheses('([)]')} -> 기대값: False") # 순서 틀림
print(f"'{{[]}}': {is_valid_parentheses('{[]}')} -> 기대값: True")
print(f"'[': {is_valid_parentheses('[')} -> 기대값: False") # 짝 없는 여는 괄호
마무리하며: 기본기부터 탄탄하게! 💪
휴~ 오늘 코딩 테스트 단골 문제 3총사, 피즈버즈, 투썸, 유효한 괄호 문제를 함께 격파해봤습니다! 어떠셨나요? "아, 이런 식으로 접근하는 거구나!" 감이 좀 오셨으면 좋겠네요.
물론 코딩 테스트에는 이보다 훨씬 다양하고 어려운 문제들이 많아요. 하지만 오늘 살펴본 문제들은 **가장 기본적인 알고리즘과 자료구조 활용법**을 익히는 데 정말 중요하답니다. 건물을 지을 때 기초 공사가 튼튼해야 하듯, 코딩 실력도 기본기가 중요하니까요!
오늘 배운 내용을 바탕으로 꼭 직접 코드를 짜보고, "만약 이런 입력이 들어오면 어떻게 될까?" 이것저것 테스트해보세요. 꾸준히 연습하고 고민하다 보면, 어느새 코딩 테스트가 두렵지 않은! 오히려 즐길 수 있는! 멋진 개발자로 성장해 있을 거예요. ✨
여러분의 코딩 여정을 응원합니다! Happy Coding! 💻
'IT 개발 및 프로그래밍 > 파이썬(Python)' 카테고리의 다른 글
[2025년 최신 가이드] 파이썬과 MCP로 나만의 AI 에이전트 만들기: 유튜브 비서 프로젝트 (0) | 2025.04.04 |
---|---|
Python으로 몬테카를로 트리 탐색(MCTS) 구현하기 (0) | 2025.03.17 |
취업 준비생을 위한 파이썬 알고리즘 기초 필수 정리 (0) | 2025.03.14 |
취업 준비생 필독! 파이썬 기초 프로그래밍 필수 팁과 실전 예제 완벽 정리 (0) | 2025.03.12 |
🤔 파이썬 데이터 분석, 지금 시작해도 될까요? (0) | 2025.03.09 |
댓글