포스트

TIL 2026-04-07

TIL 2026-04-07

04/07 - 코드카타 24

생성일: 2026년 4월 7일 오후 4:31

서울에서 김서방 찾기 (Lv.1)

🔗 https://school.programmers.co.kr/learn/courses/30/lessons/12919


문제 분석

문제 요약

vector<string> seoul에서 "Kim"인덱스(위치) x를 찾아, "김서방은 x에 있다" 형식의 문자열을 반환

제한사항

  • seoul의 길이: 1 이상 1000 이하
  • 원소 길이: 1 이상 20 이하
  • "Kim"은 반드시 한 번만 존재

입출력 예

seoulreturn
[“Jane”, “Kim”]“김서방은 1에 있다”

핵심 포인트

  • vector에서 특정 문자열의 인덱스를 찾는 문제
  • C++에서 string 비교는 == 연산자 직접 사용 가능
  • std::find() + 포인터 연산으로 한 줄 풀이 가능
  • 두 풀이 모두 선형 탐색 → 시간복잡도 O(n)

헤더 라이브러리

#include <vector>

1
2
3
4
5
vector<string> seoul = {"Jane", "Kim"};
seoul.size();       // 원소 개수
seoul[i];           // 인덱스 접근
seoul.begin();      // 시작 이터레이터
seoul.end();        // 끝 이터레이터
  • 동적 배열 컨테이너
  • size() 로 길이 확인 (length 아님)

#include <algorithm>

1
auto it = find(seoul.begin(), seoul.end(), "Kim");
  • std::find(first, last, value) — 범위에서 값을 찾아 이터레이터 반환
  • 없으면 last 반환
  • it - v.begin() 또는 distance(v.begin(), it) 으로 인덱스 계산

#include <string>

1
2
3
to_string(42);      // "42"
s1 == s2;           // 문자열 값 비교 (Java의 .equals() 대응)
s1 + s2;            // 문자열 연결
  • to_string(n) — 숫자를 문자열로 변환
  • C++의 string== 으로 값 비교 가능

코드 풀이

풀이 1 — for 루프 (작성한 코드)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
#include <string>
#include <vector>
using namespace std;

string solution(vector<string> seoul) {
    int idx = 0;
    for (int i = 0; i < seoul.size(); i++) {
        if (seoul[i] == "Kim") {
            idx = i;
            break;
        }
    }
    return "김서방은 " + to_string(idx) + "에 있다";
}

풀이 2 — find + 포인터 연산

1
2
3
4
5
6
7
8
9
#include <string>
#include <vector>
#include <algorithm>
using namespace std;

string solution(vector<string> seoul) {
    int idx = find(seoul.begin(), seoul.end(), "Kim") - seoul.begin();
    return "김서방은 " + to_string(idx) + "에 있다";
}

풀이 2 설명 — 이터레이터 → 정수 인덱스 변환

find()는 찾은 위치의 이터레이터(메모리 주소를 담은 객체) 를 반환하기 때문에, to_string()에 바로 넣을 수 없다.

정수 인덱스로 변환하려면 - seoul.begin() 을 통해 두 이터레이터 사이의 거리(칸 수) 를 계산해야 한다.

1
2
3
4
5
6
7
8
9
10
11
// 실제 메모리 구조 (예시)
주소 0x100: "Park"
주소 0x120: "Lee"
주소 0x140: "Kim"

seoul.begin()  0x100  (항상 인덱스 0 위치)
find("Kim")    0x140  (Kim 주소)

find("Kim") - seoul.begin()
= 0x140 - 0x100
= 2 차이  인덱스 2
1
2
3
4
5
6
7
// 시각적으로
인덱스:   0       1       2      (3)
        "Park" "Lee"  "Kim"    end()
                         
        begin()       find() 반환값

거리 = 2 = 인덱스 2
표현타입설명
find(...)iterator메모리 주소 (숫자 아님)
seoul.begin()iterator인덱스 0의 메모리 주소
find(...) - begin()int두 주소 사이 칸 수 = 인덱스

결과 정리

풀이코드 길이가독성특이사항
for 루프보통높음가장 직관적
find + 포인터 연산짧음높음STL 활용

복기

  • C++의 string== 으로 값 비교 가능
  • std::find() 는 이터레이터를 반환하므로 .begin() 을 빼서 인덱스로 변환
  • to_string() 으로 숫자를 문자열로 변환 후 + 연산으로 연결
이 기사는 저작권자의 CC BY 4.0 라이센스를 따릅니다.