알고리즘/백준-실버

백준 1940번 주몽(C++)

뜨거운 개발자 2023. 1. 2. 00:56

문제

정답 코드

#include <iostream>
#include <algorithm>
#include <vector>

using namespace std;

vector <int> input_ar;
int main()
{
	cin.tie(0);
	ios :: sync_with_stdio(0);
	int n,m,input;
	int cnt =0;
	cin >> n >> m;
	for (int i=0;i <n;i++)
	{
		cin >> input;
		input_ar.push_back(input);
	}
	sort(input_ar.begin(), input_ar.end());
	for (int i =0; i < n;i++)
	{
		for (int j=n-1;j > i;j--)
		{
			if (input_ar[j] + input_ar[i] == m)
				cnt++;
			else if (input_ar[j] +input_ar[i] < m)
				break;
		}
	}
	cout << cnt;
}

문제 풀이의 흐름

절대 어려운 문제가 아니다 꼭 천천히 읽자!

  • 배열에 다 입력을 받는다
  • 배열을 정렬한다.
  • 가장 작은 값과 가장 큰 뒤의 값을 더해본다.
    • 만약 더한값이 찾는 값보다 더 작다면 다음으로 작은 값과 가장 큰 값을 비교한다.
    • 만약 더한값이 찾는 값보다 크다면 다음으로 큰 값으로 당겨서 본다.
  • 이 과정을 계속 반복한다.

주의 할 점

필자는 이 문제가 2개를 선택하는게 아니라 임의의 숫자를 선택해서 문제를 푸는 것으로 보고 계속해서 틀렸다.

반드시 2개임을 기억하고 꼭 정렬을 해야하는 것을 기억하자. 물론 이 문제는 난이도가 낮아서 투포인터를 대충 구현해도 맞긴 하던데 난이도가 올라가면 조금 더 정교히 할 필요가 있다.

그리고 이게 중복이 있다고 착각할 수 있는데 그림을 그려가며 푸는 것이 좋다.

반성 및 고찰

필자는 너무 오랬동안 문제를 잘못 봤다. 그래서 오답을 엄청 많이냈다.

누적 합을 사용해서 풀려고 했는데 너무 미련한 방법이었다.

다음부터는 조금 더 천천히 문제를 읽고 분석한 다음 코드를 짜는 것이 훨씬 더 시간을 아끼는 길임을 기억하자.

급하게 하려다가 오히려 더 망한다는 것을 기억하자.

부끄럽다.


Uploaded by N2T

728x90