반응형
edit_note 오늘 코테 문제
| 문제 | 이웃한 칸 (Lv.1) |
| 플랫폼 | 프로그래머스 |
| 난이도 | Lv. 1 |
| 핵심 요구사항 | board[h][w]와 상하좌우 이웃 칸 중 같은 색으로 칠해진 칸의 개수 반환 |
python
def solution(board, h, w):
answer = 0
dh = [1, -1, 0, 0]
dw = [0, 0, -1, 1]
color = board[h][w]
for i in range(4):
h_check = dh[i] + h
w_check = dw[i] + w
if h_check < 0 or h_check >= len(board) or w_check < 0 or w_check >= len(board[0]):
continue
if color == board[h_check][w_check]:
answer += 1
return answer
| 시간복잡도 | O(1) — 항상 최대 4방향만 탐색 |
풀이 접근법
이 문제의 핵심은 상하좌우 4방향을 탐색할 때 보드 경계를 벗어나는 경우를 걸러내는 것이다. 보드는 유한한 크기이므로 반드시 경계를 벗어나는 경우가 생기기 때문이다.
1
방향 벡터로 4방향 묶기
상하좌우를 일일이 if문으로 쓰는 대신, 방향 벡터 배열로 묶어서 반복문 하나로 처리한다.
dh[i]와 dw[i]를 함께 쓰면 각각의 방향을 나타낸다.python
dh = [1, -1, 0, 0]
dw = [0, 0, -1, 1]
color = board[h][w]
2
범위 체크 후 색 비교
이웃 좌표를 계산한 뒤 보드 밖이면
continue로 스킵한다. 범위 안에 있을 때만 기준 칸의 색과 비교해 같으면 카운트를 올린다.python
for i in range(4):
h_check = dh[i] + h
w_check = dw[i] + w
if h_check < 0 or h_check >= len(board) or \
w_check < 0 or w_check >= len(board[0]):
continue
if color == board[h_check][w_check]:
answer += 1
| i | 방향 | h_check | w_check |
|---|---|---|---|
| 0 | 아래 | h+1 | w |
| 1 | 위 | h-1 | w |
| 2 | 왼쪽 | h | w-1 |
| 3 | 오른쪽 | h | w+1 |
방향 벡터 패턴을 쓰는 이유
✓4방향을 하드코딩하면 코드가 길어지고 확장이 어렵다. 방향 벡터는 루프 하나로 줄여주고 나중에 8방향·BFS/DFS로 확장할 때도 배열만 수정하면 된다.
| 한 줄 회고 | 방향 벡터 패턴은 BFS/DFS에서도 그대로 쓰인다 — 지금 익혀두면 나중에 편하다 |
menu_book 오늘 공부한 내용
| 학습 주제 | Numpy, Pandas, Matplotlib 복습 |
| 참고 자료 | [D-7] Numpy, Pandas, Matplotlib 한 번에 훑기 |
| 소요 시간 | 2시간 |
VSCode Copilot Inline Suggestions 끄기
VSCode에서 코드를 작성할 때마다 다음 내용을 추천하는 기능이 계속 거슬렸다. 과거 Xcode에서 앱 개발할 때도 비슷한 경험이 있었는데, VSCode 오른쪽 하단의 Copilot 아이콘에서 Inline Suggestions 기능을 끄니 훨씬 편해졌다. 나중에 익숙해지면 켜두는 게 생산성에 도움이 될 것 같지만, 지금은 코드 흐름에 집중하는 게 우선이다.
1.
[] 단독 사용[] 안에 슬라이스(:)가 들어오면 무조건 행 기준으로 동작한다. 컬럼 범위 슬라이싱은 불가.| 문법 | 동작 | 예시 |
|---|---|---|
df['컬럼명'] |
단일 컬럼 선택 | df['protein'] |
df[['a', 'b']] |
여러 컬럼 선택 | df[['protein', 'fat']] |
df[0:3] |
행 슬라이싱 (정수) | df[0:3] |
df['a':'b'] |
행 슬라이싱 (라벨) | df['Whopper':'Whopper Junior'] |
2.
.loc[행, 컬럼] 사용컬럼 범위 슬라이싱은 반드시
.loc[:, 'start':'end'] 형태로 써야 한다.| 문법 | 동작 |
|---|---|
df.loc['a':'b'] |
행 라벨 슬라이싱 |
df.loc[:, 'protein':'fat'] |
컬럼 범위 슬라이싱 |
df.loc['a':'b', 'protein':'fat'] |
행 + 컬럼 동시 슬라이싱 |
3. 컬럼 추가 vs 행 추가
| 목적 | 문법 |
|---|---|
| 컬럼 추가/수정 | df['new_col'] = 값 |
| 행 추가/수정 | df.loc['new_row'] = 값 |
[] 단독으로는 항상 컬럼만 건드릴 수 있고, 행 추가/수정은 반드시 .loc 필요.4. 불리언 인덱싱
df['calories'] >= 500처럼 컬럼을 재료로 써서 True/False Series를 만들고, 이걸 .loc에 넣으면 True인 행만 필터링한다.python
# .loc[행 조건, 컬럼명] = 값
burger_df.loc[burger_df['calories'] >= 500, 'high_calorie'] = True
# "칼로리 500 이상인 행들의 high_calorie 컬럼에 True를 써라"
# high_calorie 컬럼이 없으면 새로 생성, 조건 안 맞는 행은 NaN
헷갈리는 포인트
❌
✅
✅ 컬럼 범위 슬라이싱은 반드시
df['protein':'fat'] → 컬럼 범위가 나올 것 같지만 실제로는 행 슬라이싱으로 동작해서 protein이 행 인덱스에 없으면 KeyError✅
df['Whopper':'Whopper Junior'] → 버거 이름이 행 인덱스라 행 슬라이싱으로 동작함✅ 컬럼 범위 슬라이싱은 반드시
df.loc[:, 'protein':'fat'] 으로 써야 한다오늘의 키포인트
1
[]에 슬라이스가 들어오면 무조건 행. 컬럼 범위는 반드시 .loc[:, 'a':'b'].2행 추가는
.loc 필수. [] 단독으로는 컬럼만 건드릴 수 있다.3불리언 Series는 컬럼으로 만들어서 행 필터로 쓰는 것.
.loc[행 조건, 컬럼명]으로 조건에 맞는 행의 특정 컬럼에 값을 할당할 수 있다.psychology 오늘 들었던 생각
Copilot inline suggestions를 끄고 나서 확실히 코드 작성에 집중이 잘 됐다. 익숙해지기 전에는 도구가 오히려 방해가 된다는 걸 느꼈다. Pandas 인덱싱은 규칙이 일관된 것 같으면서도 [] 단독이냐 .loc이냐에 따라 동작이 달라져서 헷갈렸는데, "슬라이스가 들어오면 행"이라는 규칙 하나로 정리되니 훨씬 깔끔하게 정리됐다.
rate_review 마무리
방향 벡터 패턴과 Pandas 인덱싱 규칙 — 둘 다 "규칙 하나를 제대로 이해하면 나머지가 자연스럽게 풀린다"는 걸 느낀 하루.
checklist 내일 할 일
-
프로그래머스 문제 한 개 풀기
-
기초 통계와 데이터 시각화 듣기
반응형
'AI' 카테고리의 다른 글
| [D-3] 시각화 도구 3종 비교 (0) | 2026.06.29 |
|---|---|
| [D-4] seaborn으로 상관관계 보기 (0) | 2026.06.28 |
| [D-5] 통계 기초 완주 — 박스 플롯부터 누적값까지 (0) | 2026.06.27 |
| [D-7] Numpy, Pandas, Matplotlib 한 번에 훑기 (0) | 2026.06.25 |
| [D-8] 코드잇 스프린트 시작 전, 파이썬 워밍업 (0) | 2026.06.24 |
