• [ 장르 ] 탐색
  • [ 문제 ]
 

1920번: 수 찾기

첫째 줄에 자연수 N(1≤N≤100,000)이 주어진다. 다음 줄에는 N개의 정수 A[1], A[2], …, A[N]이 주어진다. 다음 줄에는 M(1≤M≤100,000)이 주어진다. 다음 줄에는 M개의 수들이 주어지는데, 이 수들이 A안��

www.acmicpc.net

  • My Code
#include <iostream>
#include <algorithm>
#include <vector>

using namespace std;
int main()
{
	int N,M,data;
	vector<int> arr, check;
	
	cin.tie(NULL); cout.tie(NULL); ios_base::sync_with_stdio(false);

	cin >> N;
	for (int i = 0; i < N; i++)
	{
		cin >> data;
		arr.push_back(data);
	}
	cin >> M;
	for (int i = 0; i < M; i++)
	{
		cin >> data;
		check.push_back(data);
	}
	//sort(arr.begin(), arr.end());   // 처음엔 두 벡테를 정렬해놓고
	//sort(check.begin(), check.end());	// 비교하는 과정을 손볼려했는데 생각해보면 출력할 때 순서가 맞지 않는거 처럼 나온다.
	for (int i = 0; i < check.size(); i++)
	{
		auto iter = find(arr.begin(), arr.end(), check[i]);
		if (iter == arr.end()) 
			cout << 0 << '\n';
		else  
			cout << 1 << '\n';
	}
	return 0;
}

 " find( ) 함수의 다시 한번 감사함을 느끼자. "

  • CheckPoint
  • 정답률이 낮아서, 성능을 높이는 문제인가하고 겁을 먹었다.
    그래서 일단 C++에 대한 입출력 성능을 높이기 위해 상단부에 선언을 해주고 개행도 '\n'으로 처리했다.
  • 문제 포인트는 첫번째 받은 리스트안에 두번째 받은 리스트의 정수가 있는지 "들어온 순서대로" 체크해서 있으면 '1' 아니면 '0'을 출력하는 문제이다.
  • 처음에는 뭔가 무작위로 들어오니 sort( )함수로 정렬 시킨 후 조건을 조작하면 최소한으로 탐색하지 않을까 했는데, 생각은 좋으나 이렇게하면 결과를 출력할 때, 기존의 리스트 순서가 바뀌어서 결과순서도 바뀌게 된다.
  • 그래서 sort( )부분만 주석처리하고 제출했더니 정답이었다.
  • 무엇보다 이 과정에서 check 벡터( 리스트로 생각하고 씀 )요소마다 arr 벡터( 리스트로 생각하고 씀 )내부에 존재하는지 for문을 통해 작성을 할 수도 있지만, find( )함수가 생각이나서 활용했다.
  • ★ find( iter.begin( ), iter.end( ), 찾을 원소 ) 함수는 찾을 원소를 기준으로 iterator에 끝까지 조사해서 존재하면 그 위치의 iter를 반환하고 끝까지 조사했는데 찾을 원소가 없으면 v.end( ) (== 이것도 iterator ) 를 리턴한다. 이를 이용해서 if 문을 작성해서 처리했다.   


728x90
반응형

'Algorithm Practice > [ Baekjoon ]' 카테고리의 다른 글

[C++] 괄호  (0) 2020.10.04
[Baekjoon][#1927] 최소 힙  (0) 2020.09.25
[Beakjoon][#1021] 회전하는 큐  (0) 2020.09.25
[Baekjoon][#10866] 덱(Deque)  (0) 2020.09.24
[Baekjoon][#11729] 하노이 탑 이동순서  (0) 2020.09.23

+ Recent posts