포스트

프로그래머스 — CodeKata 09

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

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
// 코드카타 24. 서울에서 김서방 찾기 (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 <string>
#include <vector>
#include <algorithm>
using namespace std;

// 풀이 1 - for 루프 (작성한 코드) | 시간복잡도: O(n)
//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 + 포인터 연산 (STL 활용) | 시간복잡도: O(n)
// find()는 이터레이터(메모리 주소 객체)를 반환하므로
// - seoul.begin()으로 두 이터레이터 사이의 거리(칸 수)를 계산해 정수 인덱스로 변환
string solution(vector<string> seoul) {
    int idx = find(seoul.begin(), seoul.end(), "Kim") - seoul.begin();
    return "김서방은 " + to_string(idx) + "에 있다";
}
이 기사는 저작권자의 CC BY 4.0 라이센스를 따릅니다.