Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

10-InSange #40

Merged
merged 4 commits into from
May 20, 2024
Merged

10-InSange #40

merged 4 commits into from
May 20, 2024

Conversation

InSange
Copy link
Collaborator

@InSange InSange commented May 1, 2024

πŸ”— 문제 링크

μ˜€μ•„μ‹œμŠ€ μž¬κ²°ν•©

βœ”οΈ μ†Œμš”λœ μ‹œκ°„

8μ‹œκ°„

✨ μˆ˜λ„ μ½”λ“œ

번쩍 슀쳀던 큐 풀이

ν•΄λ‹Ή 문제λ₯Ό 봀을 λ•Œ μ²˜μŒμ— μ˜€ν°μˆ˜κ°€ λ– μ˜¬λžλ‹€. μŠ€νƒμž„μ„ μ•Œκ³  μžˆμ—ˆμ§€λ§Œ νλ‘œλ„ 접근이 κ°€λŠ₯ν•  것 κ°™μ•˜λ‹€.

  1. a와 b νˆ¬ν¬μΈν„°λ‘œ aλŠ” ν˜„μž¬ 인덱슀 번호의 κ°’, bλŠ” a λ‹€μŒμ˜ 값듀을 νƒμƒ‰ν•œλ‹€.
  2. b인덱슀 값이 a보닀 μž‘κ±°λ‚˜ κ°™μœΌλ©΄ q에닀가 집어 λ„£λŠ”λ‹€. λ°˜λŒ€λ‘œ 크면 μ’…λ£Œν•œλ‹€.
  3. startκ°’μ—λŠ” aλ‹€μŒμ— λ°”λ‘œ λ“€μ–΄μ˜¨ 값을 μ‹œμž‘μ μœΌλ‘œ μž‘λŠ”λ‹€.
  4. q에 λ“€μ–΄μžˆλŠ” 값듀을 ν•˜λ‚˜μ”© κΊΌλ‚΄λ©΄μ„œ start에 λ“€μ–΄μžˆλŠ” 값이 q의 front보닀 크닀면 a와 frontκ°’ μ‚¬μ΄μ—λŠ” startκ°€ κ°€λ‘œλ§‰κ³  μžˆμ–΄μ„œ ν•œ 쌍이 λ§Œλ“€μ–΄μ§€μ§€ μ•ŠλŠ”λ‹€. λ°˜λŒ€λ‘œ startκ°€ front보닀 μž‘κ±°λ‚˜ κ°™μœΌλ©΄ a와 frontμ‚¬μ΄μ—λŠ” μž₯애물이 없기에 ν•œ 쌍이 λ§Œλ“€μ–΄μ§€κ³  기쀀점startλ₯Ό front둜 μ„€μ •ν•΄μ€€λ‹€!
  5. q의 값이 λΉ„μ›Œμ§€λ©΄ aλ₯Ό μ¦κ°€μ‹œμΌœ κ·Έ λ‹€μŒ 값을 νƒμƒ‰ν•œλ‹€.
    image
    image
    image
    image
    μœ„μ™€ 같이 μ§„ν–‰λ˜κ²Œ λœλ‹€.
    κ·ΈλŸ¬λ‚˜ startκ°€ front보닀 클 경우
    image
    와 같이 κ°€λ €μ§€κ²Œ λœλ‹€.
#include <iostream>
#include <vector>
#include <queue>

using namespace std;

int N, n, a, b, answer;
vector<int> line;
queue<int> q;

// a1 보닀 bκ°€ 크면 μ’…λ£Œ
// a1 보닀 bκ°€ μž‘λ‹€λ©΄ λ‹€μŒ bλŠ” 
void Solve()
{
	cin >> N;

	for (int i = 0; i < N; i++)
	{
		cin >> n;
		line.push_back(n);
	}

	a, b = 0;
	answer = 0;

	while (a < N)
	{
		b = a;
		while (b + 1 < N)
		{
			q.push(b + 1);
			if (line[a] < line[b + 1]) break;
			b++;
		}

		int start;
		if(!q.empty()) start = q.front();

		while (!q.empty())
		{
			n = q.front();
			q.pop();
			if (line[start] > line[n]) continue;
			answer++;
			start = n;
//			if (line[start] < line[n]) break;
		}
		a++;
	}

	cout << answer;
}

int main()
{
	cin.tie(nullptr);
	ios::sync_with_stdio(false);

	Solve();

	return 0;
}

ν…ŒμŠ€νŠΈ μΌ€μ΄μŠ€λ₯Ό ν¬ν•¨ν•΄μ„œ λͺ¨λ‘ 잘 ν†΅κ³Όλ˜μ§€λ§Œ...
image
와 같이 크기가 50만일 경우..
μ΅œμ•…μ˜ 경우 50만 * 50만 + 50만이 λœλ‹€..
image
λ‹Ήμ—°νžˆ μ‹œκ°„μ΄ˆκ³Ό

λ­”κ°€ 될 것 κ°™μ•„μ„œ 쀑간에 μ—¬λŸ¬ 쑰건듀도 μ±„μ›Œλ³΄κ³  ν–ˆμ§€λ§Œ 쉽지 μ•Šμ•˜λ‹€... κ·Έλ ‡κ²Œ 3μ‹œκ°„ν›„ 큐에 λŒ€ν•œ 풀이가 μžˆμ„κΉŒ κ²€μƒ‰ν•΄λ΄€μ§€λ§Œ 죄닀 μŠ€νƒ ν’€μ΄μ˜€λ”°

ν˜Ήμ—¬λ‚˜ 질문 κ²Œμ‹œνŒμ„ λ“€μ–΄κ°€λ΄€μ§€λ§Œ
νλŠ” μ•ˆλ˜λ‚˜μš”?!
image
λ‚΄κ°€ κ²ͺ은 바와 같이 N^2의 μ‹œκ°„ λ³΅μž‘λ„κ°€ λ‚˜μ˜¨λ‹€λŠ” 말씀..

λ‘λ²ˆμ§Έ 풀이 (μŠ€νƒ)

그럼 λ‚΄κ°€ 처음 봀던 였큰수 κ·ΈλŒ€λ‘œ μ§„ν–‰ν•˜λ©΄ 될 것 κ°™μ•˜λ‹€!
κΈ°λ³Έ ν…ŒμŠ€νŠΈ μΌ€μ΄μŠ€λŠ” λ‹€ ν†΅κ³Όν•˜μ˜€μ§€λ§Œ
νμ—μ„œ ν’€κΈ° μœ„ν•΄ μ—¬λŸ¬ μ˜ˆμ œλ“€μ„ νƒμƒ‰ν•˜λ©΄μ„œ λ°œκ²¬ν•œ 사싀

  1. λΉ„κ΅ν•΄μ•Όν•˜λŠ” λͺ¨λ“  μˆ˜κ°€ λ§Œμ•½ λ‹€ κ°™λ‹€λ©΄?
  2. λ‚˜μ€‘μ— λ“€μ–΄μ˜¨ κ°’κ³Ό stack의 top사이에 μ‘΄μž¬ν•˜λ˜ 값듀은 μ–΄λ–»κ²Œ μ²˜λ¦¬ν•  것인가?

ν•΄λ‹Ή 문제λ₯Ό ν’€λ©΄μ„œ 30λΆ„κ°„ κ³ λ‡Œν–ˆλ˜ λΆ€λΆ„μ΄μ˜€λ‹€.
μ•žμ—μ„œ νƒμƒ‰ν–ˆλ˜ 것과 λ’€μ—μ„œ νƒμƒ‰ν–ˆλ˜ 것과 경우의 μˆ˜κ°€ 같은가?!
닡은 yes
ν•΄λ‹Ή λ¬Έμ œμ—μ„œ λ‹€ν–‰μ΄μ—ˆλ˜ 점은 쀑간에 자기 킀보닀 크닀면 κ·Έ 값듀은 λͺ¨λ‘ μ²΄ν¬ν•˜μ§€ μ•ŠλŠ”λ‹€λŠ” κ²ƒμ΄μ˜€λ‹€!
λ­”κ°€ λ°˜λ‘€κ°€ μžˆμ„ 것 κ°™μ•„μ„œ λ©”λͺ¨μž₯에 λͺ¨λ“  경우λ₯Ό μ“°κ³  ν…ŒμŠ€νŠΈ ν•΄λ³Έ κ²°κ³Όμ˜€λ‹€.

그럼 stack으둜 μ²˜λ¦¬ν•΄μ£Όλ©΄ λ˜μ§€λ§Œ λ¬Έμ œλŠ” stack에 λ“€μ–΄μ˜¨ λͺ¨λ“  값듀이 λ‹€ 같을 경우 μ˜ˆμ™Έκ°€ λ°œμƒν•˜λŠ” κ²ƒμ΄μ˜€λ‹€.
μ§€κΈˆ ν’€μ΄μ—λŠ” μ—†μ—ˆμ§€λ§Œ λ§Œμ•½ stack에 μš”μ†Œλ“€μ΄ λ‚¨μ•„μžˆμ„ 경우 λ‚˜λŠ” ν•΄λ‹Ή 값듀도 μ²˜λ¦¬ν•΄μ£ΌκΈ° μœ„ν•΄μ„œ λ°°μ—΄ 탐색 ν›„ while문을 ν•˜λ‚˜ 더 μΆ”κ°€ν•΄μ£ΌλŠ” μ‹μœΌλ‘œ μ§„ν–‰ν•˜μ˜€λ‹€.

ν•˜μ§€λ§Œ..! μ΄λ ‡κ²Œ 되면 κΈ°μ‘΄ ν’€μ—ˆλ˜ ν…ŒμŠ€νŠΈ μΌ€μ΄μŠ€μ—μ„œ λ‹€ ν•˜λ‚˜μ”© μ—‡λ‚˜κ°€λŠ” λ¬Έμ œκ°€ λ°œμƒν•˜μ˜€λ‹€.

문제λ₯Ό 작고 κ³ λ‡Œν•˜κ³  λͺ¨λ“  ν…ŒμŠ€νŠΈ μΌ€μ΄μŠ€λ₯Ό λ‹€ 톡과함에 κ±Έλ¦° μ‹œκ°„μ€ 총 3μ‹œκ°„..
κ²°κ΅­ λΈ”λ‘œκ·Έλ₯Ό λ’€μ‘Œλ”°.

stack에 λ‚΄κ°€ μ‹œλ„ν•œ 접근은 λ§žμ•˜μ§€λ§Œ 같은 μˆ˜μ— λŒ€ν•œ 처리λ₯Ό pair둜 ν•΄λ‹Ήν•˜λŠ” κ°’κ³Ό 개수λ₯Ό μ²˜λ¦¬ν•΄μ€€ κ²ƒμ΄μ˜€λ‹€.
λ‹€λ§Œ 경우의 μˆ˜κ°€ ν¬κ±°λ‚˜ κ°™κ±°λ‚˜ μž‘κ±°λ‚˜λ‘œ λ‚˜λ‰˜κ²Œ λ˜μ—ˆλ‹€.
클 경우 stack의 topλΆ€λΆ„μ—μ„œ 개수만큼 answer에 λ”ν•΄μ£ΌλŠ” κ²ƒμ΄μ˜€κ³ .
같을 경우 top의 개수λ₯Ό answer에 더해주고 ν•΄λ‹Ή κ°’μ˜ 개수λ₯Ό 1더 늘렀 λ‹€μ‹œ stack에 λ„£μ–΄μ£ΌλŠ” κ²ƒμ΄μ˜€λ‹€!
사싀 같은 뢀뢄이 λ‚œκ΄€μ΄μ—ˆλ‹€.
같을 경우 answer에 1을 λ”ν•˜λŠ” 것이 μ•„λ‹Œ μ—¬νƒœ λ‚˜μ˜¨ 개수만큼 λ”ν•΄μ£ΌλŠ” 것이 μ•„λ‹Œκ°€?
λ‚˜λŠ” 같은 μˆ˜κ°€ ν•˜λ‚˜ 더 λŠ˜μ—ˆμœΌλ‹ˆ answer에 ν•˜λ‚˜λ₯Ό λ„£μ–΄μ£Όκ³  개수 계산을 ν•˜λŠ” 것이 λ§žμ§€ μ•Šμ€κ°€? μƒκ°ν•˜μ˜€μ§€λ§Œ λ§Œμ•½ λͺ¨λ“  μˆ˜κ°€ λ‹€ κ°™λ‹€λ©΄? 그럼 λͺ¨λ“  μŒμ— λŒ€ν•œ κ³„μ‚°μœΌλ‘œ n!의 값이 λ‚˜μ˜€κ²Œ λœλ‹€! 고둜 μ—¬νƒœ λ‚˜μ˜¨ 개수λ₯Ό λ”ν•΄μ£ΌλŠ” 것이 λ§žμ•˜λ”°.

μž‘μ€ 경우λ₯Ό ꡳ이 비ꡐ해야 λ˜λ‚˜ μ‹Άμ§€λ§Œ μž‘μœΌλ©΄ κ·Έ 값을 ν¬ν•¨ν•œ λ‹€μŒ 값은 μž₯애물이 μ—†κΈ° λ•Œλ¬Έμ— λ‹€μŒ κ°’κ³Ό 무쑰건 ν•œμŒμ„ 이루게 λœλ‹€.

#include <iostream>
#include <vector>
#include <stack>

using namespace std;

long long N, n, a, b, answer;
vector<int> line;
stack<pair<int, int>> st;

// a1 보닀 bκ°€ 크면 μ’…λ£Œ
// a1 보닀 bκ°€ μž‘λ‹€λ©΄ λ‹€μŒ bλŠ” 
void Solve()
{
	cin >> N;

	for (int i = 0; i < N; i++)
	{
		cin >> n;
		line.push_back(n);
	}

	for (auto num : line)
	{
		int cnt = 1;

		while (!st.empty())
		{
			int cur = st.top().first;
			int cur_cnt = st.top().second;
			if (cur < num)
			{
				answer+= cur_cnt;
			}
			else if (cur == num)
			{
				answer += cur_cnt;
				cnt += cur_cnt;
			}
			else //if(st.top().first > num)
			{
				answer++;
				break;
			}
			st.pop();
		}
		//cout << num << ", " << answer << "\n";
		st.push({num, cnt});
	}

	cout << answer;
}

int main()
{
	cin.tie(nullptr);
	ios::sync_with_stdio(false);

	Solve();

	return 0;
}

μ΄λ ‡κ²Œ κ³ λ‡Œν•΄μ„œ 1μ‹œκ°„.. 총 8μ‹œκ°„μ΄ κ±Έλ Έλ‹€.

평가

솔직후기
λ­”κ°€ 닿을 것 κ°™μœΌλ©΄μ„œλ„ 닿지 μ•ŠλŠ” 그런 ν”Όκ³€ν•œ μŠ€νƒ€μΌμ˜ λ¬Έμ œμ˜€λ‹€..
문제 풀이 κ²½ν—˜μ΄ 많으면 ν•΄λ‹Ή λ¬Έμ œκ°€ μ˜€ν°μˆ˜μ™€ λΉ„μŠ·ν•˜λ‹€λŠ” 것을 μ•Œ 수 μžˆμ„ 것이고 leetμ½”λ“œμ—λ„ ν•΄λ‹Ή λΉ„μŠ·ν•œ λ¬Έμ œκ°€ μ‘΄μž¬ν•œλ‹€.
여기에 μΆ”μ²œν•˜κ³  κ°€κ² λ‹€!
λΉ—λ¬Ό νŠΈλž˜ν•‘!!!

πŸ“š μƒˆλ‘­κ²Œ μ•Œκ²Œλœ λ‚΄μš©

ν”Œλ ˆ μ •λ„μ˜€λ‚˜..? 싢닀가도 생각이 λ§Žμ•„μ§€λŠ” 그런 λ¬Έμ œμ˜€λ”°.
μ°Έκ³ ν•œ λΈ”λ‘œκ·Έ

Copy link
Collaborator

@seongwon030 seongwon030 left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

μ˜€ν°μˆ˜λŠ” 각 숫자의 였λ₯Έμͺ½μ— μžˆλŠ” 더 큰 숫자 μ€‘μ—μ„œ κ°€μž₯ κ°€κΉŒμš΄ κ±Έ μ°ΎλŠ”κ±΄λ° 이 λ¬Έμ œλŠ” 각 숫자의 였λ₯Έμͺ½μ— μžˆλŠ” 더 큰 μˆ«μžλ“€μ˜ κ°œμˆ˜κΉŒμ§€ 계산해야 ν•΄μ„œ μ‹œκ°„μ΄ˆκ³Ό 문제λ₯Ό 더 신경써야 ν•˜λ„€μš”. 두 문제의 λͺ©ν‘œλŠ” λΉ„μŠ·ν•˜μ§€λ§Œ λͺ¨λ“  경우의 수λ₯Ό 계산해야 ν•΄μ„œ 이번 λ¬Έμ œκ°€ 더 κΉŒλ‹€λ‘œμ› λ‹€κ³  μƒκ°ν•©λ‹ˆλ‹€. pair둜 같은 μˆ«μžκ°€ 올 경우λ₯Ό λ”°λ‘œ κ³„μ‚°ν•΄μ„œ λͺ¨λ“  μˆ˜κ°€ 같은 경우λ₯Ό λ°©μ§€ν•œ κΉ”λ”ν•œ 풀이 잘 λ΄€μŠ΅λ‹ˆλ‹€γ…Žγ…Ž

Copy link
Collaborator

@yuyu0830 yuyu0830 left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

이 문제 이해해보렀고 였큰수 λΆ€ν„° 천천히 ν’€μ–΄λ΄€λŠ”λ° μ΄μƒν•˜κ²Œ 이해가 잘 μ•ˆλ˜λ„€μš”..? 이 λ¬Έμ œλŠ” 직접 풀어봐야 μ’€ 더 이해가 될 것 κ°™λ„€μš”...
풀이가 μ–΄λ ΅λ‹€κΈ° λ³΄λ‹€λŠ” μ ‘κ·Όμ΄λž‘ ν•΄κ²° 방식 μˆ˜λ¦½ν•˜λŠ” 과정이 μ–΄λ €μš΄ 문제 κ°™μ•„μš”.. γ… γ… 

Copy link
Contributor

@dhlee777 dhlee777 left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

처음 문제λ₯Ό 보고 쑰합을 μ΄μš©ν•˜μ—¬ μ‰½κ²Œ ν’€ 수 μžˆκ² λ‹€ μƒκ°ν•˜μ˜€λŠ”λ° μŠ€νƒμ„ ν™œμš©ν•˜μ—¬ κ²½μš°μ˜μˆ˜κ°€ ν¬κ±°λ‚˜ κ°™κ±°λ‚˜ μž‘μ€ 경우둜 λ‚˜λ‰˜μ–΄μ„œ 카운트λ₯Ό ν•˜λŠ” λ°©μ‹μ΄κ΅°μš”.. μ˜ˆμ™Έμ²˜λ¦¬λΆ€λΆ„μ΄ 많이 μ–΄λ €μ›Œλ³΄μž…λ‹ˆλ‹€.. λ¬Έμ œμ ‘κ·Όλ°©μ‹λΆ€ν„° μ–΄λ €μš΄λ° μ˜€ν°μˆ˜λΆ€ν„° λ‹€μ‹œ μ œλŒ€λ‘œ ν’€μ–΄λ΄μ•Όκ² λ„€μš”

@InSange InSange merged commit 11b5d76 into main May 20, 2024
@InSange InSange deleted the 10-InSange branch May 20, 2024 03:06
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Projects
None yet
Development

Successfully merging this pull request may close these issues.

4 participants