강의

멘토링

로드맵

인프런 커뮤니티 질문&답변

원재님의 프로필 이미지
원재

작성한 질문수

10주완성 C++ 코딩테스트 | 알고리즘 코딩테스트

3주차 개념 #1. 완전탐색과 백트래킹

3주차 수업 질문있습니다.

해결된 질문

작성

·

24

0

안녕하세요 큰돌님:)

제가 지금까지 진행하면서 find와 .find의 사용이 헷갈립니다!!

혹시 어디에는 뭘 사용하는지 정리해주실 수 있을까요?

일단 제가 알고 있는 것은 find()는 이터레이터를 반환하고 실패시 해당 컨테이너의 .end()를 반환합니다.

.find()는 오늘 수업과 "666"문제로 실패 시 string::npos를 반환하는 걸 알았습니다.

find는 보통 순차 컨테이너에 사용하는 거 같고 (map, vector, list 등)

.find 문자열 그리고 map에서 사용하는 거 같습니다.

하지만 이것이 뭔가 정리가 안되어 있는 느낌이라 큰돌님께서 혹시 딱 정리해주실 수 있나요??!!!

사실 map일때 key는 .find를 쓰고 쌍을 찾을 때는 find를 쓰고 너무 헷갈립니다. ㅠㅠ

답변 2

0

큰돌님의 프로필 이미지
큰돌
지식공유자

안녕하세요 원재님 ㅎㅎ

먼저 find의 종류는 2가지입니다.

  • ① std::find()<algorithm> 모든 순차 컨테이너(vector, list, deque, array 등)이터레이터(iterator)

  • ② container.find()컨테이너의 멤버 함수map, set, unordered_map, unordered_set, string 등 컨테이너에 따라 다름

 

  1. find의 경우.

#include <vector>
#include <algorithm>
#include <iostream>
using namespace std;

int main() {
    vector<int> v = {1, 2, 3, 4, 5};
    auto it = find(v.begin(), v.end(), 3);

    if (it != v.end()) cout << "찾았다: " << *it << endl;
    else cout << "못 찾음!" << endl;
}
  • std::find(시작, 끝, 값)

  • 값이 있으면 이터레이터 반환,
    없으면 컨테이너의 .end() 반환

  • 선형 탐색이라 시간복잡도 O(n)
    vector, deque, list, array 에서 보통 쓰입니다.

 

map.find(), set.find()

#include <map>
#include <iostream>
using namespace std;

int main() {
    map<string, int> m;
    m["apple"] = 5;
    m["banana"] = 3;

    auto it = m.find("apple");
    if (it != m.end())
        cout << "apple의 값은 " << it->second << endl;
    else
        cout << "apple 없음!" << endl;
}
  • map.find(key)

  • 키(key) 로 빠르게 탐색 (이진 트리 또는 해시)

  • 반환값:

    • 찾으면 해당 key를 가리키는 이터레이터

    • 못 찾으면 m.end()

 

string.find()

#include <iostream>
#include <string>
using namespace std;

int main() {
    string s = "hello666world";
    size_t pos = s.find("666");

    if (pos != string::npos)
        cout << "'666' 위치: " << pos << endl;
    else
        cout << "못 찾음!" << endl;
}
  • string.find(substring)

  • 찾으면 해당 시작 인덱스(size_t) 반환

  • 못 찾으면 string::npos (== -1) 반환

  • npos는 “찾지 못했다”는 의미의 상수

string::npos는 문자열 전용값입니다.

 

정리하자면, vector 등에서 find() 를 쓰거나 map, set에서 .find()를 쓸 수 있고 반환값은 이터레이터입니다. 그리고 문자열에서 .find()를 쓸 수 있는데 이 때 index 반환, 실패 시 npos 라는점이 다릅니다.

 

 


 

또 질문 있으시면 언제든지 질문 부탁드립니다.

좋은 수강평과 별점 5점은 제게 큰 힘이 됩니다. :)

감사합니다.

강사 큰돌 올림.

0

안녕하세요, 인프런 AI 인턴입니다. 원재님!

C++의 find.find 사용에 대해 정리가 필요하신 것 같아 안내해 드리겠습니다.

  1. std::find 알고리즘

    • #include <algorithm> 헤더에 포함되어 있습니다.
    • 주로 순차 컨테이너가 제공된 범위 내에서 특정 값을 찾는 데 사용됩니다. 예를 들어, std::vector, std::list 등이 있습니다.
    • 찾고자 하는 값이 발견되면 해당 위치에 대한 이터레이터를 반환하고, 찾지 못하면 제공된 컨테이너의 end() 이터레이터를 반환합니다.
    • 사용 예시: std::find(vec.begin(), vec.end(), value)
  2. string::find 메서드

    • 문자열(string) 내에서 특정 문자열이나 문자를 찾기 위해 사용됩니다.
    • 찾고자 하는 문자열이 있을 시 해당 위치를 반환하고, 찾지 못하면 string::npos를 반환합니다.
    • 사용 예시: str.find("substring")
  3. map::find 메서드

    • 연관 컨테이너(map, unordered_map 등)에서 특정 키를 찾기 위해 사용됩니다.
    • 찾고자 하는 키가 있을 경우 해당 키-값 쌍의 위치에 대한 이터레이터를 반환하며, 없을 경우 컨테이너의 end() 이터레이터를 반환합니다.
    • 사용 예시: map.find(key)

요약하자면:
- std::find: 순차 컨테이너에서 특정 값을 찾을 때 사용합니다.
- string::find: 문자열 내에서 특정 문자열이나 문자를 찾습니다.
- map::find: 연관 컨테이너에서 특정 키를 찾고자 할 때 사용합니다.

아래 링크들은 이러한 함수의 사용에 대한 보다 구체적인 설명을 제공합니다. 참고하시면 도움이 될 것입니다:

저는 질문자님의 이해를 돕고자 지식공유자님의 기존 답변을 참고하여 유사한 답변 링크를 추천해드리고 있습니다. 현재 베타 기능으로 답변이 만족스럽지 않을 수 있는 점 양해 부탁드립니다. 🙏 추가적으로 궁금한 점이 있으시면, 이어서 질문해 주세요. 곧 지식공유자께서 답변해 주실 것입니다.

원재님의 프로필 이미지
원재

작성한 질문수

질문하기