반응형
프로그래머스 링크
https://school.programmers.co.kr/learn/courses/30/lessons/42577
문제 설명
전화번호부에 적힌 전화번호 중, 한 번호가 다른 번호의 접두어인 경우가 있는지 확인하려 합니다.
전화번호가 다음과 같을 경우, 구조대 전화번호는 영석이의 전화번호의 접두사입니다.
- 구조대 : 119
- 박준영 : 97 674 223
- 지영석 : 11 9552 4421
전화번호부에 적힌 전화번호를 담은 배열 phone_book 이 solution 함수의 매개변수로 주어질 때, 어떤 번호가 다른 번호의 접두어인 경우가 있으면 false를 그렇지 않으면 true를 return 하도록 solution 함수를 작성해 주세요.
제한 사항- phone_book의 길이는 1 이상 1,000,000 이하입니다.
- 각 전화번호의 길이는 1 이상 20 이하입니다.
- 같은 전화번호가 중복해서 들어있지 않습니다.
["119", "97674223", "1195524421"] | false |
["123","456","789"] | true |
["12","123","1235","567","88"] | false |
문제 풀이
1. phone_book을 포문돌면서 원소값을 map변수에 저장
2. 배열에 들어있는 스트링 값의 크기만큼 반복을 돌리는데 그 이유는 n의 자리 숫자를 잘라서 비교하기 위함
3. j번 자리 숫자를 더해가면서 해당 값이 map변수에 있는지 확인
4. 무한반복
코드
#include <string>
#include <vector>
#include <unordered_map>
#include <algorithm>
using namespace std;
bool solution(vector<string> phone_book) {
bool answer = true;
unordered_map<string, string> mapSaveNumber;
// map변수에 값을 넣어준다.
for (auto elem : phone_book)
mapSaveNumber[elem] = elem;
size_t Size = phone_book.size();
for (size_t i = 0; i < Size; ++i)
{
size_t NumberSize = phone_book[i].size();
// j번재 자리를 +해주면서 판단을 해줄것인데
// 포문 돌아오면 새로 초기화 해야하기 때문에 아래에 변수 설정
string CheckString = "";
for (size_t j = 0; j < NumberSize; ++j)
{
CheckString += phone_book[i][j];
unordered_map<string, string>::iterator iter = mapSaveNumber.find(CheckString);
// iter가 end면 자료구조 특징상 없다는뜻이므로 end가 아니고 i번째의 번호랑 체크 번호랑 같지 않다면 리턴 false
if (iter != mapSaveNumber.end() && phone_book[i] != CheckString)
{
return false;
}
}
}
return answer;
}
정확성
동원훈련 갔다 오고 다시 코테 시작
머리 안 쓰다가 다시 쓰려고 하니깐 헷갈렸다.
문제 제목에 해쉬라 적혀있어서 더 쉽게 푼 거 같다.
반응형
'프로그래머스 > lv2' 카테고리의 다른 글
프로그래머스 : 깊이/너비 우선 탐색(DFS/BFS) > 게임 맵 최단거리(lv2) (0) | 2023.04.04 |
---|---|
프로그래머스 : 깊이/너비 우선 탐색(DFS/BFS) > 타겟 넘버(lv2) (0) | 2023.04.03 |
프로그래머스 : 스택/큐 주식가격(lv2) (0) | 2023.03.21 |
프로그래머스 : 힙(Heap)더 맵게 (0) | 2023.03.18 |
프로그래머스 : 피보나치 수(lv2) c++ (0) | 2023.03.17 |
댓글