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"은 반드시 한 번만 존재
입출력 예
| seoul | return |
|---|
| [“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() 으로 숫자를 문자열로 변환 후 + 연산으로 연결