티스토리 뷰

728x90
반응형

https://www.acmicpc.net/problem/15719

 

15719번: 중복된 숫자

1부터 N - 1까지의 정수가 하나씩 정렬되지 않은 채로 저장되어 있는 어떤 수열 A가 있다. 수열 A에 임의의 정수 M(1 ≤ M ≤ N – 1)을 넣어 크기가 N인 수열로 만들었을 때, 임의의 정수 M을 찾는 프

www.acmicpc.net

나랑 다른 방식으로 푸는 코드를 확인하였는데 모르는 코드가 많아 적으려 한다.

우선 나는 문제를 보면 입력으로 주어지는 정수는 모두 다르지만, 모두 다른 수 중 같은 값이 하나는 있는 것이다. 그러니까 만약 입력되는 값이 100이라고 하면 1~99까지는 모두 나오지만, 1~99까지의 수 중 하나는 중복되는 값이 있는 것이다. 나는 이것을 다른 방식으로 접근했다. 

입력되는 N의 크기는 2 <= N <= 10,000,000이라고 나와있는데, 이걸 정렬하려면 엄청 오래걸릴 것이다. 그래서 나는 입력과 동시에 값을 알 수 있도록 구현하였다.

만약 N이 10,000,000으로 입력받는다면 1 ~ 9,999,999값들은 한번씩 전부 나오고 이 수 중 하나는 2번 나오게 될 것이다. 이것을 이용하는 것이다. 그러니까 입력되는 수들을 전부 더한 값은 1 ~ 9,999,999까지의 더한 값에 중복되는 값이 더해진다. 1 ~ 9,999,999까지의 수들을 전부 더한 값을 알게 되면 중복되는 값을 알 수 있을것이다.

다음은 내 코드이다.

 

#include <iostream>
#include <cstdio>

int main(void) {
	int turn;
	std::cin >> turn;

	int j;
	if (turn % 2 == 0) j = turn - 1;
	else j = turn;
	
	int sum = 0;
	for (int i = 0; i < turn; i++) {
		int num;
		scanf("%d",& num);

		sum += num;
		if (sum > j) sum = sum - j;
	}
	std::cout << sum;
}

자. 이제 다른 분들의 코드를 염탐해보자.

1. #include <bits/stdc++.h> 

처음 보는 라이브러리이다. 검색을 해보니 C++에서 지원하는 대부분의 라이브러리가 이 안에 들어있다고 한다. 

그러니까 algorithm라이브러리, string라이브러리 등등이 이 라이브러리 안에 들어있다. 

이 라이브러리의 장점은 따로 include할 필요가 없지만, 단점으로 필요없는 라이브러리까지 들어가 있는 것이다. 알아서 잘 활용하면 될것 같다.

 

2. #include <unistd.h>

이 라이브러리도 처음본다. 검색을 해보니 Unix기반 컴파일러를 사용할 때 필요하다고 한다. 나하고는 상관 없는 라이브러리 인것 같다.

 

3. ios::sync_with_stdio(false), cin.tie(nullptr);

ios::sync_with_stdio 한번 해석해보자. iostream syncrosize with stdio -> c++의 iostream과 c의 stdio를 동기화 시켜주는 역할을 한다. iostream과 stdio의 버퍼를 모두 사용하기 때문에 발생하는 딜레이를 줄여주는 역할을 한다. 

하지만, 이를 사용할 때 멀티 쓰레드를 사용하는 환경에서는 좋지 않다고 한다. 버퍼를 한개 사용하는 효과를 내기 때문인것 같다.

 

cin.tie(nullptr) -> cin을 묶는 것을 nullptr화 한다.

묶는다는 것이 무엇이냐? cout과 cin을 묶는 것을 뜻한다. 

그러니까 cout과 cin이 묶여 cin으로 읽을 때 cout으로 출력하는 버퍼를 비우게 된다. 하지만, cin과 cout의 묶음을 풀게 되면 출력 하는 버퍼를 비울 필요가 없어지게 된다. 이것은 무엇을 의미하느냐? 출력과 입력이 중요하지 않는 경우 이것을 사용하여 속도를 높이는 방법이 있다는 것이다. 

 

추가적으로 std::endl은 '\n'보다 더 느리게 작동하기 때문에 되도록이면 '\n'을 사용하는 것이 좋을것이다.

 

3. fread()

fread함수를 사용해서 입력시간을 최소화 하는 방식이 있었다. 이것은 내가 작성한 코드가 아니기 때문에 보여줄 수 없다. 말로 표현만 해보겠다.

fread(저장할 배열, 원소당 크기, 개수, 입력버퍼) -> return = 입력된 개수

fread(buf, 1, 1 << 20, stdin)을 이용해서 char형으로 1 << 20 ( 2 ^ 20)크기로 선언되어 있는 buf에 stdin에 있는것을 가져오게 한다. 그리고, 이것을 더해주어 값을 계산해 준다.

 

4. inline

inline함수를 사용하는 것은 해당 함수를 많이 사용하는 경우가 있으면 실행 시간을 줄일 수 있다. 그렇기 때문에 많이 사용되는 함수에 inline을 앞에 붙여주어 실행시간을 단축시킬 수 있다.

728x90
반응형

'코딩테스트 > Silver 5' 카테고리의 다른 글

[S5] 11637. 인기 투표  (0) 2022.06.17
[S5] 1531. 투명  (0) 2022.06.17
[S5] 15549. if  (0) 2022.06.16
[S5] 14468. 소가 길을 건너간 이유2  (0) 2022.06.16
[S5] 1996. 지뢰 찾기  (0) 2022.06.16