백준 - 펠린드롬

phoenixKim·2022년 5월 21일
0

백준 알고리즘

목록 보기
30/174

2번.

풀이전략

  • string을 head, mid, tail로 구분함.
  • 문제 흐름 상 홀수는 최소한 한번만 나와야함, 2개 이상 나오면, 종료
  • tail을 어떻게 할 것인지가 관건이었음.
    - 순차적으로 오는 알파벳의 경우, 앞에다가 해야함.
    그래서 tail만 list로 한후, 최종 출력때 사용하는 식으로 하마.

코드

#include <iostream>
#include <string>
#include <map>
using namespace std;
#include <algorithm>
#include <list>
//팰린드롬/
// 카운팅으로 풀었을 때와 
// map으로 풀었을 때의 시간을 측정해보자.


int main()
{
	//홀수인 알파벳은 최소 1개가 있어야함.
	// 2개이상일 경우, 종료

	//사전 순이므로, 일단 정렬을 한후,,, 
	// 가장 앞선 것을 먼저 위치시켜야 함.
	

	// 어제 생각했을 때는 head에다가 반절..
	// tail에다가 반절인데 

	//만약 aaaabbbbcccc
	// 일경우 
	//aabbcc ccbbaa 이므로. 
	// tail부분을 어떻게 처리할지 생각해야함.

	//tail 부분을 aa 넣고 앞에다가 bb 앞에다가  cc 를 넣어야함.

	string s;
	cin >> s;
	sort(s.begin(), s.end());


	string head = "";
	string tail = "";
	string mid = "";
	//카운팅 체크를 해야함.
	//홀수가 있을 때 mid로 설정.
	map<char, int>m;
	for (auto iter : s)
	{
		m[iter]++;
	}

	int cnt = 0;
	//카운팅 
	for (auto iter : m)
	{
		if (iter.second % 2 != 0)
		{
			++cnt;
			mid = iter.first;
		}
	}

	list<char>l;
	if (cnt > 1)
		cout << "I'm Sorry Hansoo";
	else
	{
		// 알파벳 순으로 진행함.
		for (auto iter : m)
		{
			for (int i = 0; i < iter.second / 2; ++i)
			{
				head += iter.first;
				l.push_front(iter.first);
			}
		}

		for(auto iter : head)
		{
			cout << iter;
		}
		cout << mid;

		for (auto iter : l)
		{
			cout << iter;
		}
	}
}

1번.

풀이전략 1번

  1. 대문자만 있으므로 arr[] 카운팅 하는 방식으로 접근해야 함.
  2. 고심해보면,,, 카운팅 배열 중에서 두 개이상이 홀수가 나오면 불가함.
  3. list의 반복자는 += 증감 연산이 불가능하다라는 것을 알아야 함.
  4. 앞과 뒤를 삽입하고, 만약에 홀수개인 카운팅 배열은 중간 삽입을 한번 해야함.
    -> c++ stl list 공부 필요

코드 1번

#include <stdio.h>
#include <iostream>
#include <string>
using namespace std;

#include <list>

int main()
{
	list<char>l;

	int arr[26]{0,};

	string word;
	cin >> word;

	for (char iter : word)
	{
		++arr[iter - 'A'];
	}
	
	//string result = "";
	int cnt{ 0 };
	// 홀수가 2개 이상이면 종료
	// 홀수 처리는 나머지 연산자와 &연산자를 통해 찾을 수 있음.
	for (int i = 25; i >= 0; --i)
	{
		//for (int k = 0; k < arr[i]; k += 2)
		//{
		//	l.push_back(i + 'A');
		//	l.push_front(i + 'A');
		//}

		if ( ( arr[i] & 1 ) == 1)
		{
			++cnt;

			if (cnt >= 2)
			{
				cout << "I'm Sorry Hansoo";
				return 0;
			}
			// 가운데다가 넣어야 함...
			//auto iter = l.begin() + l.size() / 2;
			//l.insert( iter , i + 'A');

			int a = l.size() / 2;
			// 리스트는 랜덤 반복자가 아니므로, 인덱스 접근 불가능함...
			auto iter = l.begin();
			for (int l = 0; l < a; l++)
				iter++;
			l.insert(iter, i + 'A');

			//카운팅은 여러개일 수도..
			// 중간에 들어가야해
			for (int k = 0; k < arr[i] - 1; k+= 2)
			{
				l.push_back(i + 'A');
				l.push_front(i + 'A');
			}

		}
		else if (arr[i] != 0)
		{
			// 앞 뒤로 넣자.
			for (int k = 0; k < arr[i]; k += 2)
			{
				l.push_front(i + 'A');
				l.push_back(i + 'A');
			}
		}

		
	}

	for (auto iter : l)
	{
		cout << iter;
	}

}

profile
🔥🔥🔥

0개의 댓글

관련 채용 정보