Notice
Recent Posts
Recent Comments
Link
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 |
Tags
- 소수
- 삼성 SDS 대학생 알고리즘 특강
- 삼성 기출
- dfs
- 백트래킹
- C++
- 맛집
- koitp
- 시뮬레이션
- 잠실
- PS
- Algorithm
- 브루트포스
- BFS
- 다이나믹 프로그래밍
- DP
- 동적 계획법
- SWEA
- sw expert academy
- hackerrank
- 구현
- 알고리즘
- BOJ
- 그리디
- 완전탐색
- 백준
- 해커랭크
- dynamic programming
- 에라토스테네스의 체
- 스택
Archives
- Today
- Total
펭로그
[C++] 프로그래머스 코딩테스트 연습 - 전화번호 목록 본문
문제링크 : https://programmers.co.kr/learn/courses/30/lessons/42577
알고리즘 헤더에 있는 sort를 이용하여 쉽게 구현하였다.
먼저 sort를 하게되면 숫자 순서대로 정렬이 되고 문제에서 요구하는 접두어의 경우 반드시 인접한 위치에 정렬되게 된다.
예를 들어서 [12345, 332, 123]을 정렬하게 되면 [123, 12345, 332] 이런 식으로 정렬된다는 뜻이다.
그리고 여기서 한가지 알 수 있는 사실은 정렬된 이후 접두어에 해당하는 숫자는 무조건 앞에 나오게 된다.
따라서, 모든 배열의 원소를 완전탐색하여 현재의 위치와 현재의 위치 직전의 문자열을 서로 비교하여 string 클래스의 find() 함수를 사용하여 일치하는 문자열이 나오면 정답으로 출력하면 된다.
만약, find()로 일치하는 문자열이 나오지 않았을 경우 return 값으로 string::npos가 iterator로 반환된다.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 | #include <string> #include <vector> #include <algorithm> using namespace std; bool solution(vector<string> phone_book) { bool answer = true; sort(phone_book.begin(), phone_book.end()); for(int i = 1; i < phone_book.size(); i++){ if(phone_book[i].find(phone_book[i-1]) != string::npos){ answer = false; break; } } return answer; } | cs |
string 클래스의 find()를 사용하지 않고 문자 하나 하나를 일일이 비교하는 방법으로 아래와 같이 풀 수도 있다. 시간복잡도 면에서는 차이가 나지는 않을 것이다.
다만, 문자를 일일이 비교할 경우 반드시 [이전문자의 길이] <= 다음문자의 길이]가 성립할 수 있는 case만 정답의 조건이 되므로 if문으로 11번째 줄과 같이 처리해주었다.
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 | #include <string> #include <vector> #include <algorithm> using namespace std; bool solution(vector<string> phone_book) { bool answer = true; sort(phone_book.begin(), phone_book.end()); for(int i = 1; i < phone_book.size(); i++){ if(phone_book[i].size() < phone_book[i-1].size()) continue; bool chk = false; for(int j = 0; j < phone_book[i-1].size(); j++){ if(phone_book[i][j] != phone_book[i-1][j]){ chk = true; break; } } if(!chk){ answer = false; break; } } return answer; } | cs |
'Study > PS(Algorithm)' 카테고리의 다른 글
[C++] 백준 BOJ 2217 로프 (0) | 2019.01.30 |
---|---|
[C++] 프로그래머스 코딩테스트 연습 - 완주하지 못한 선수 (0) | 2019.01.29 |
[C++] 백준 BOJ 1475 방 번호 (0) | 2019.01.16 |
[C++] 백준 BOJ 1018 체스판 다시 칠하기 (0) | 2019.01.16 |
[C++] 백준 BOJ 5566 주사위 게임 (0) | 2019.01.14 |
Comments