WRITING · 2026-11-03

길찾기에서 의사결정으로 — 배틀싸피 자동 플레이 봇을 세 번 고친 기록

목표까지 가는 BFS 한 줄짜리 봇이, 사거리·장애물·탄약·보급·암호 해독까지 판단하는 봇이 되기까지. 매 턴 다시 계획하는 구조로 바꾼 이유.

알고리즘BFS게임 AISSAFY

SSAFY 알고리즘 과정의 배틀싸피는 격자 지도 위에서 탱크를 움직여 적 포탑을 부수는 대전형 과제입니다. 매 턴 서버가 지도와 상태를 보내 주면, 봇이 이동·발사 같은 명령 하나를 돌려줍니다. 통신 부분은 과정에서 제공하는 기본 코드를 그대로 쓰고, 저는 "이번 턴에 무엇을 할지"를 정하는 알고리즘 부분을 세 번에 걸쳐 고쳤습니다.

과정에서 제공한 기본 코드와 문제 명세는 공개하지 않고, 제가 바꾼 판단 로직만 정리합니다.

v0 — 처음 한 번만 길을 찾는 봇

기본 구조는 단순했습니다.

  1. 게임 시작 때 한 번, 내 위치(M)에서 목표(X)까지 BFS로 최단 경로를 구한다
  2. 목표 바로 옆에 도착하면 그 방향으로 발사
  3. 이후 매 턴 경로에서 명령을 하나씩 꺼내 보낸다

문제는 지도가 바뀌어도 처음 계획을 계속 따른다는 점이었습니다. 적이 움직이거나 길이 막히면 엉뚱한 방향으로 계속 갔습니다.

v1 — 사거리와 장애물을 반영

BFS가 "목표 바로 옆"만 보던 것을 실제 규칙에 맞게 바꿨습니다.

v2 — 매 턴 다시 판단하는 봇

여기서 구조를 크게 바꿨습니다. 매 턴 처음부터 다시 계획하고, 길찾기 앞에 "지금 무엇을 목표로 할지"를 정하는 단계를 넣었습니다.

매 턴:
  내 탄약(일반·메가)과 목표 체력을 읽는다
  탄이 부족한가?  (일반탄 × 30 + 메가탄 × 70 < 목표 체력)
    ├─ 부족하고 보급시설 옆이면 → 보급 암호를 해독해 탄 받기
    ├─ 부족하면 → 목표를 '보급시설'로 바꾼다
    └─ 충분하면 → 목표는 적 포탑
  경로 찾기:
    1차 BFS: 나무를 피해서
    2차 BFS: 안 되면 나무를 쏘고 지나가는 경로 (쏘기 + 이동 2개 명령)
  포탑을 맞히는 마지막 발사(또는 일반탄이 없을 때)에는 메가탄
  예외가 나면 그 턴은 대기 — 봇이 죽지 않게

두 번 찾는 BFS

나무는 쏘면 없어지지만 한 턴이 더 듭니다. 처음부터 나무를 "비용이 큰 칸"으로 넣는 대신, 나무 없이 먼저 찾고 실패할 때만 나무를 뚫는 경로를 허용했습니다. 가중치를 다루는 알고리즘(다익스트라)으로 바꾸지 않고도, 대부분의 상황에서 원하는 우선순위를 얻을 수 있었습니다.

피드백으로 키를 찾는 암호 해독

보급시설에서 탄을 받으려면 문자를 일정 칸씩 밀어 쓴 암호(시저 암호)를 풀어야 합니다. 키를 미리 알 수 없어서, 해독 결과가 맞았는지를 다음 턴 상태로 확인했습니다.

정답을 모르는 상태에서 행동 → 결과 관찰 → 다음 시도를 반복하는 작은 탐색 루프입니다.

배운 것

모델 실험에서 "이번 제출이 직전보다 나은가"를 매번 다시 판단하던 것과 결국 같은 습관이었습니다.

SSAFY 16기 관통 프로젝트 — ThRead: LLM 댓글 분석 파이프라인 · AI 도서 서비스자세한 내용은 포트폴리오의 해당 활동에서 볼 수 있습니다.
포트폴리오로
다른 글겹쳐 있는 두 신호를 위상으로 가르기 — 파수 상관 필터링 석사 연구 정리중력과 자력 데이터를 같은 주파수 성분끼리 비교해, 함께 움직이는 성분과 반대로 움직이는 성분을 나눴다. 임계값을 감으로 정하지 않으려고 한 일들.점수를 지키면서 올리기 — VQA 챌린지에서 앙상블 후보를 고른 기준정확도가 조금 올라도 원래 맞히던 문제를 많이 틀리면 불안정한 개선이다. fixes와 breaks로 순기여를 따져 0.94608에서 시작한 점수를 쌓아 올린 과정.LLM이 붙인 [근거 N]을 코드로 다시 검사하기 — 국보 RAG 가이드의 인용 설계근거를 인용하라고 프롬프트에 써도 LLM은 없는 번호를 붙입니다. 근거 번호를 검색 단계에서 고정하고, 답변의 인용을 코드로 파싱해 없는 번호는 지우고 실제로 인용한 근거만 보여 주는 구조를 만든 기록.YAML 파일 하나로 포트폴리오·이력서·비공개 페이지까지 — 이 사이트를 만든 방식내용은 한 곳에만 쓰고, 웹 페이지·PDF 이력서·노션 문서는 빌드로 만든다. 공개하면 안 되는 내용은 저장소에 평문으로 남기지 않는다.데이터를 해석하기 전에 그 데이터가 만들어진 역사를 본다 — 학부 제1저자 논문 회고해외 대규모 CO2 저장소 8곳을 판구조 형성사와 탄성파 영상으로 비교했다. 처리 결과를 '그럴듯한지' 판단하는 기준을 어디서 가져올 것인가에 대한 이야기.산불 4건으로 시공간 딥러닝 학습하기데이터가 35개 시점뿐일 때 어떻게 학습시켰고, 다시 보니 무엇이 부족했는지. U-LSTM 산불 확산 예측 모델 회고.LLM 응답을 믿지 않는 파이프라인 설계LLM에는 판단만 맡기고, 결과는 코드로 검증한다. 댓글 분석 파이프라인과 AI 도서 추천을 만들며 정한 네 가지 원칙.순차 학습이 성능을 떨어뜨린 이유 — catastrophic forgetting 실험기단어 단위 → 문맥 단위로 차례로 학습하면 더 좋아질 줄 알았는데, BERTScore가 0.47에서 0.32로 떨어졌다. FLAN-T5 LoRA 학습 전략 비교.