코딩굼벵이
구르는 중
코딩굼벵이
  • 분류 전체보기 (116)
    • [C_C++]이론 공부 (17)
      • 알고리즘 (11)
      • 이론+STL (6)
    • [C_C++]코딩테스트 연습 (45)
      • [프로그래머스] level 1 (26)
      • [프로그래머스] level 2 (5)
      • [백준] 일반 문제 (12)
      • 기타 (2)
    • Solana (28)
      • Documentation (9)
      • Validator - 공부 (10)
      • Validator - 실행 (devnet & te.. (6)
      • 그 외 (3)
    • React (4)
    • Linux (2)
    • Javascript (2)
    • 블록체인 기반 핀테크 및 응용 SW 개발 (8)
      • React (1)
      • Javascript (3)
      • Solidity (3)
      • 프로젝트 (1)
    • 기타 (10)

블로그 메뉴

  • 🌟 깃허브
  • 🌿 Portfolio(2021)
  • 홈
  • 태그
  • 방명록

티스토리

최근 글

태그

  • Hooks #React
  • 솔라나
  • 모니터링
  • Immer #ContextAPI
  • grafana
  • 밸리데이터

인기 글

전체 방문자
오늘
어제
hELLO · Designed By 정상우.
코딩굼벵이

구르는 중

[C++] 프로그래머스 hash 2 - 전화번호 목록
[C_C++]코딩테스트 연습/[프로그래머스] level 2

[C++] 프로그래머스 hash 2 - 전화번호 목록

2021. 10. 17. 16:27
728x90

[Level 2]

 

처음 내 풀이

: 정확성 83.3(만점) 효율성 8.3 = 91.7 로 실패

 

bool solution(vector<string> phone_book) {
	sort(phone_book.begin(), phone_book.end());

	for (int i = 0; i < phone_book.size(); i++) {
		for (int j = i + 1; j < phone_book.size(); j++) {
			int split_size = phone_book[i].size();
			cout << phone_book[j].substr(0, split_size) << endl;
			if (phone_book[i] == phone_book[j].substr(0, split_size))
				return false;
		}
	}

	return true;
}

 

전화번호를 sort 한 뒤 길이가 짧은 원소를 기준으로 해 뒤의 것들에 접두사가 되는지 확인.

뒤의 것들을 모두 확인해야 하기 때문인지 효율성 케이스 두개가 시간 초과 되었다.

 

다른 사람의 풀이

 

bool solution(vector<string> phone_book) {
	sort(phone_book.begin(), phone_book.end());

	for (int i = 0; i < phone_book.size()-1; i++) {
		if (phone_book[i] == phone_book[i + 1].substr(0, phone_book[i].size()))
			return false;
	}
	return true;
}

 

어차피 접두사가 되는 것 하나라도 있으면 끝이므로 뒤의 것들을 모두 검사해야할 필요 없이, 바로 뒤의 것만 검사해도 된다. 위 풀이는 효율성 검사도 통과한다.

 

 

 

다른 사람의 풀이 - hash 이용

bool solution(vector<string> phone_book) {
	unordered_map<string, int> hash_map;

	for (int i = 0; i < phone_book.size(); i++) {
		hash_map[phone_book[i]]++;
	}
	for (int i = 0; i < phone_book.size(); i++) {
		string phone_num = "";
		for (int j = 0; j < phone_book[i].size(); j++) {
			phone_num += phone_book[i][j];
			if (hash_map[phone_num] && phone_num != phone_book[i])
				return false;
		}
	}
	return true;
}

 

번호 문자열을 해시맵에 등록한 후,

각 요소의 첫번째 자리부터 빈 문자열에 갖고와서 해시맵에 그 문자열이 등록돼있다면(phone_book 배열에 있다면) 원래 있던 문자열보다 더 길면(자기자신과 비교하는게 아니면) false를 반환한다.

 

'[C_C++]코딩테스트 연습 > [프로그래머스] level 2' 카테고리의 다른 글

[프로그래머스] 프린터 (pair, priority queue) - C++ 스택&큐  (0) 2021.10.18
[프로그래머스] 기능개발 - C++ 스택&큐  (0) 2021.10.17
[C++] 프로그래머스 hash 2 - 위장  (0) 2021.10.17
[C++] 프로그래머스 hash 1- 완주하지 못한 선수 (vector만 이용 / 해시 이용)  (0) 2021.06.14
    '[C_C++]코딩테스트 연습/[프로그래머스] level 2' 카테고리의 다른 글
    • [프로그래머스] 프린터 (pair, priority queue) - C++ 스택&큐
    • [프로그래머스] 기능개발 - C++ 스택&큐
    • [C++] 프로그래머스 hash 2 - 위장
    • [C++] 프로그래머스 hash 1- 완주하지 못한 선수 (vector만 이용 / 해시 이용)
    코딩굼벵이
    코딩굼벵이
    구르는 재주 연마 중

    티스토리툴바