반응형
edit_note 오늘 코테 문제
| 문제 | 공원 산책 |
| 플랫폼 | 프로그래머스 |
| 핵심 요구사항 | 이동 중 하나라도 장애물/경계 이탈이 발생하면 그 명령 전체를 무시(제자리 유지)해야 함 |
python
def solution(park, routes):
current = []
for i in range(len(park)):
for j in range(len(park[0])):
if park[i][j] == "S":
current = [i, j]
direction = "NSEW"
dy = [-1, 1, 0, 0]
dx = [0, 0, 1, -1]
for route in routes:
spl = route.split()
d = spl[0]
c = int(spl[1])
idx = direction.index(d)
ny, nx = current
isValid = True
for i in range(c):
ny += dy[idx]
nx += dx[idx]
if (ny < 0) or (ny >= len(park)) or (nx < 0) or (nx >= len(park[0])):
isValid = False
break
if park[ny][nx] == "X":
isValid = False
break
if isValid:
current = [ny, nx]
return current
풀이 접근법
핵심은 이동을 검증하는 동안 실제 위치를 건드리면 안 된다는 점이다. 장애물이나 경계를 만나면 그 명령 전체가 무효 처리되기 때문에, 중간까지 이동한 상태가 남아있으면 안 된다. 그래서 "임시 좌표로 끝까지 시뮬레이션 → 통과했을 때만 실제 위치에 반영"하는 트랜잭션 방식으로 접근해야 한다.
1
시작 위치(S) 탐색
공원 격자를 순회하며 "S"가 있는 좌표를 찾아 시작 위치로 저장한다.
2
방향 문자와 이동량 매핑
명령어 문자열("N", "S", "E", "W")을 dy, dx 인덱스로 바로 변환할 수 있도록 문자열 순서와 이동 배열의 순서를 정확히 맞춘다. 세로(row) 인덱스는 아래로 갈수록 커지므로 N은 -1, S는 +1이다.
3
한 칸씩 시뮬레이션 + 유효성 플래그 체크 (핵심)
명령을 실제로 수행하기 전에, 임시 변수(ny, nx)에서 한 칸씩 이동해보며 공원 범위 이탈 여부와 장애물 여부를 검사한다. 둘 중 하나라도 걸리면 isValid를 False로 내리고 즉시 break한다. 이때 current는 절대 건드리지 않는다.
4
검증 통과 시에만 실제 위치 커밋
루프가 끝난 뒤 isValid가 살아있으면, 즉 거리(c)만큼 온전히 이동에 성공했으면 그때 비로소 current를 갱신한다. 실패했다면 current는 명령 수행 전 그대로 유지된다.
헷갈렸던 포인트
✓"갈 수 있는 만큼만 가고 멈춘다"가 아니라 "완주 못하면 아예 안 간다"이다. 루프 안에서 매 스텝마다 current를 즉시 갱신하면, 중간에 장애물을 만났을 때 이미 몇 칸 이동한 상태로 오염돼버려서 롤백이 불가능해진다.
✓이 방식 덕분에 매 명령마다 O(거리)만큼만 검사하면 되고, 별도의 롤백 로직 없이도 "전부 성공 아니면 전무" 규칙을 자연스럽게 만족시킬 수 있다.
menu_book 오늘 공부한 내용
| 학습 주제 | 파이썬 모듈/패키지/라이브러리 활용, 객체 지향 프로그래밍(OOP) |
| 참고 자료 | 코드잇 스프린트 AI 엔지니어 부트캠프 강의자료 |
파이썬 기초 문법 (간단 정리)
| 주제 | 메모 |
|---|---|
| if 조건문 | 한 줄 if문(삼항 표현식) 형태로도 작성 가능 |
| while, for 반복문 | 반복문도 한 줄로 작성 가능(list comprehension 등) |
| 함수 | def로 정의, 반복되는 로직을 재사용 가능한 단위로 묶음 |
| 리스트 / 딕셔너리 / 튜플 | 파이썬 기본 자료구조 3종 |
| 문자열 | 자릿수 맞추려면 변수명:04d, 소수점 4자리는 변수명:.4f |
오전에는 iOS/Swift로 익숙한 개념(조건문, 반복문, 함수, 컬렉션)을 파이썬 문법으로 다시 익히는 시간이었다.
python
# 한 줄 if문
score = 85
result = "합격" if score >= 60 else "불합격"
print(result) # 합격
# 한 줄 for문
nums = [1, 2, 3, 4, 5]
squares = [n * n for n in nums]
print(squares) # [1, 4, 9, 16, 25]
# 조건까지 붙인 한 줄 for문
evens = [n for n in nums if n % 2 == 0]
print(evens) # [2, 4]
모듈 · 패키지 · 라이브러리 (간단 정리)
| 구분 | 정의 | 예시 |
|---|---|---|
| 모듈 | 파이썬 코드(.py) 하나 | math, calculator.py |
| 패키지 | 여러 모듈을 모아놓은 폴더 | collections |
| 표준 라이브러리 | 파이썬 기본 제공 | os, sys, random, datetime |
| 서드파티 라이브러리 | pip으로 별도 설치 | numpy, requests |
random(randint/uniform), datetime(now, timedelta, strftime), 파일 입출력(open의 "w"/"a" 모드, with 구문)까지 실습으로 다뤘다. split(), strip() 같은 문자열 메서드로 텍스트 파싱하는 연습(단어장 만들기 퀴즈)도 진행.
객체 지향 프로그래밍(OOP) (간단 정리)
객체 지향 프로그래밍(OOP)은 데이터(속성)와 그 데이터를 다루는 동작(메서드)을 하나의 단위인 객체로 묶어서 관리하는 패러다임이다. 클래스는 객체를 만들기 위한 설계도, 객체(인스턴스)는 그 설계도로 실제로 찍어낸 결과물이다. 파이썬은 int·str·list·함수까지도 전부 객체로 취급된다는 점이 특징이다.
| 개념 | 설명 |
|---|---|
| 인스턴스 변수 | 객체마다 독립적으로 유지되는 속성 (self.변수) |
| 메서드 | 클래스 내부에 정의된 함수, 첫 인자로 self 필요 |
| __init__ (생성자) | 객체 생성 시 자동 실행, 초기 상태 설정 |
| __del__ (소멸자) | 객체가 사라질 때 실행 |
| __str__ | print(객체) 시 보여줄 문자열 정의 |
| __call__ | 객체를 함수처럼 () 로 호출 가능하게 함 |
| 상속 | 기존 클래스를 물려받아 새 클래스 정의, 코드 재사용 |
| 다형성 | 같은 이름의 메서드가 객체 종류에 따라 다르게 동작 |
| 클래스 변수 | 모든 인스턴스가 공유, 클래스명.변수로 접근 |
| 정적 메서드 | @staticmethod, self/cls 필요 없는 유틸리티 함수 |
Dog/Car/Student/Shape(Rectangle, Circle)/Counter/MathUtil 클래스를 직접 만들어보며 생성자·소멸자·상속·클래스변수·정적메서드를 각각 연습했다.
python
class Dog:
species = "강아지" # 클래스 변수 (모든 인스턴스가 공유)
def __init__(self, name):
self.name = name # 인스턴스 변수 (객체마다 독립)
def bark(self):
print(f"{self.name}가 짖습니다: 멍멍!")
dog1 = Dog("바둑이")
dog2 = Dog("초코")
dog1.bark() # 바둑이가 짖습니다: 멍멍!
print(Dog.species) # 강아지 (클래스명.변수로 접근)
# 상속: Animal을 물려받아 Dog가 확장
class Animal:
def greet(self):
print("안녕하세요, 저는 동물입니다.")
class Puppy(Animal):
def bark(self):
print("멍멍!")
puppy = Puppy()
puppy.bark() # 멍멍!
puppy.greet() # 안녕하세요, 저는 동물입니다. (상속받아서 재정의 없이도 사용 가능)
기억해두고 싶은 부분
✓문자열 포매팅: 0020처럼 자릿수 맞추려면 변수명:04d, 소수점 4자리까지 표현하려면 변수명:.4f
✓표준 라이브러리 중 time은 실행 시간을 잴 때 사용한다.
✓객체는 서로 독립이다.
✓__(더블 언더스코어)는 외부 접근을 실제로 막는 쪽이고, _(싱글 언더스코어)는 관례상 "내부용"이라고 표시만 하는 것 — 강제성이 다르다.
✓상속받은 메서드는 자식 클래스에서 내가 따로 정의하지 않아도 부모 클래스에 정의된 대로 동작한다.
✓self는 파이썬이 인스턴스 메서드를 호출할 때 자동으로 첫 번째 인자에 꽂아 넣는 값이라, 함수 안에서 실제로 쓰든 안 쓰든 매개변수 자리는 반드시 있어야 한다.
✓클래스 변수를 사용할 때는 클래스명.변수 형태로 접근해야 한다.
self 동작 원리 예시 코드
python
# ani.greet() 호출은 사실 이렇게 변환됨
Animal.greet(ani) # ani가 자동으로 첫 번째 인자로 전달
# self 있으면 정상 동작
class Animal:
def greet(self):
print("안녕하세요")
Animal().greet() # OK
# self 없으면 에러
class Animal:
def greet():
print("안녕하세요")
Animal().greet()
# TypeError: greet() takes 0 positional arguments but 1 was given
# 받을 자리가 없는데 인스턴스가 자동으로 들어오니까 에러 나는 것
# 인스턴스가 진짜 필요 없다면 staticmethod 사용
class Animal:
@staticmethod
def greet():
print("안녕하세요")
Animal().greet() # OK, self 없이도 가능
psychology 오늘 들었던 생각
파이썬 내용을 한 번에 익히려다 보니 과부하가 온 것 같다. 그래도 self 관련해서 질문해서 제대로 된 답변을 받았고, 앞으로도 질문을 습관화해야겠다는 생각이 들었다.
실습 시간에 미션을 푸는데 생각이 너무 많아서 그런지 완벽하게 풀려고 했다. 그렇다 보니 시간이 좀 오래 걸린 듯했다. 알바하면서 다시 쉽게쉽게 생각하면서 풀어볼까 한다.
완벽이라는 생각을 버리자!
checklist 내일 할 일
-
프로그래머스 문제 풀기
-
부트캠프 미션 수행
-
아르바이트
반응형
'AI' 카테고리의 다른 글
| [부트캠프 5일차] 첫 멘토링 후기 (0) | 2026.07.08 |
|---|---|
| [부트캠프 3일차] 시간복잡도와 DataFrame 전처리 정리 (0) | 2026.07.06 |
| [부트캠프 1일차] 코드잇 스프린트 시작 — 데이터란 무엇인가 (1) | 2026.07.02 |
| [D-1] 코드잇 스프린트 환영회 (0) | 2026.07.01 |
| [D-2] 코테 한 문제, 그리고 잠시 숨 고르기 (0) | 2026.06.30 |
