문제

길이가 N으로 같은 문자열 X와 Y가 있을 때, 두 문자열 X와 Y의 차이는 X[i] ≠ Y[i]인 i의 개수이다. 예를 들어, X=”jimin”, Y=”minji”이면, 둘의 차이는 4이다.

두 문자열 A와 B가 주어진다. 이때, A의 길이는 B의 길이보다 작거나 같다. 이제 A의 길이가 B의 길이와 같아질 때 까지 다음과 같은 연산을 할 수 있다.

  1. A의 앞에 아무 알파벳이나 추가한다.
  2. A의 뒤에 아무 알파벳이나 추가한다.

이때, A와 B의 길이가 같으면서, A와 B의 차이를 최소로 하는 프로그램을 작성하시오.

입력

첫째 줄에 A와 B가 주어진다. A와 B의 길이는 최대 50이고, A의 길이는 B의 길이보다 작거나 같고, 알파벳 소문자로만 이루어져 있다.

출력

A와 B의 길이가 같으면서, A와 B의 차이를 최소가 되도록 했을 때, 그 차이를 출력하시오.

풀이

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


int main() {
	
	string a, b; 
	int cnt = 0;
	int temp = 987654321;
	cin >> a >> b;
	for (int j = 0; j < b.length() - a.length() + 1; j++) {
		for (int i = 0; i < a.length(); i++) { //a는 0부터 a.length()-1까지 고정
			if (a[i] != b[i+j]) // b만 증가시켜가며 비교
			{
				cnt++;
			}
		}
		temp = min(cnt, temp);
		cnt = 0;
	}

	printf("%d", temp);

	return 0;
}

 

 풀다보니 C와 C++의 혼종이 되어버림;

'알고리즘 코딩' 카테고리의 다른 글

[BOJ C/C++] 2875 대회 or 인턴  (0) 2019.09.28
[BOJ C/C++] 10610 30  (0) 2019.09.28
[BOJ C/C++] 11047 동전 0  (0) 2019.06.27
[BOJ C/C++] 15999 (카카오 코드 페스티벌 2018-C)  (0) 2019.06.25

문제

백준대학교에서는 대회에 나갈 때 2명의 여학생과 1명의 남학생이 팀을 결성해서 나가는 것이 원칙이다. (왜인지는 총장님께 여쭈어보는 것이 좋겠다.)

백준대학교는 뛰어난 인재들이 많아 올해에도 N명의 여학생과 M명의 남학생이 팀원을 찾고 있다.

그런데 올해에는 대회에 참여하려는 학생들 중 K명을 반드시 인턴쉽 프로그램에 참여하라는 학교의 방침이 생기게 되었다. 인턴쉽에 참여하는 학생은 대회에 참여하지 못한다.

백준대학교에서는 뛰어난 인재들이 많기 때문에, 많은 팀을 만드는 것이 최선이다.

여러분은 N명의 여학생과 M명의 남학생, K명의 인턴쉽에 참여해야하는 인원이 주어질 때 만들 수 있는 최대의 팀 수를 구하면 된다.

입력

첫째 줄에 N, M, K가 순서대로 주어진다. (0 ≤ M ≤ 100), (0 ≤ N ≤ 100), (0 ≤ K ≤ M+N),

출력

만들 수 있는 팀의 최댓값을 출력하면 된다.

풀이

#include <stdio.h>

int main() {

	int n, m, k;
	int teamCount;
	int etc;

	scanf("%d %d %d", &n, &m, &k);
	//3팀 - 3부터 1팀 -14 = -5팀으로 계산 그러면 일단 여학생과 남학생으로 팀 개수 구하고, k로 팀 개수를 뺀다.
	if ((n / 2) > m) {
		teamCount = m;
	}
	else {
		teamCount = n/2;
	}
	// 팀개수 일단 구했음 이제 필요없는 애들수랑 K 비교 
	// 필애수>K = 팀개수그대로 반대일경우 팀개수 감소하겠지 -1~-3은 1 -4~-6은 2 이런식
	// 15 13 6 했을때 현재 teamCount = 7 필요없는 애들수= n + m - teamCount*3 
	
	//필요없는 애들 수

	etc = n + m - (teamCount * 3);
	if (etc >= k) {
		printf("%d", teamCount);
	}
	else { 
		if ((k - etc) % 3 == 0)
		{
			teamCount = teamCount - ((k - etc) / 3); // 0으로 나누어질때는 -1 하면 안됨
		}
		else
		{
			teamCount = teamCount - ((k - etc) / 3) - 1;
		}
		if (teamCount == -1)
		{
			printf("%d", 0);
		}
		else
		{
			printf("%d", teamCount);
		}

	}

	return 0;
}

'알고리즘 코딩' 카테고리의 다른 글

[BOJ C/C++] 1120 문자열  (0) 2019.09.29
[BOJ C/C++] 10610 30  (0) 2019.09.28
[BOJ C/C++] 11047 동전 0  (0) 2019.06.27
[BOJ C/C++] 15999 (카카오 코드 페스티벌 2018-C)  (0) 2019.06.25

문제

어느 날, 미르코는 우연히 길거리에서 양수 N을 보았다. 미르코는 30이란 수를 존경하기 때문에, 그는 길거리에서 찾은 수에 포함된 숫자들을 섞어 30의 배수가 되는 가장 큰 수를 만들고 싶어한다.

미르코를 도와 그가 만들고 싶어하는 수를 계산하는 프로그램을 작성하라.

입력

N을 입력받는다. N는 최대 105개의 숫자로 구성되어 있으며, 0으로 시작하지 않는다.

출력

미르코가 만들고 싶어하는 수가 존재한다면 그 수를 출력하라. 그 수가 존재하지 않는다면, -1을 출력하라.

풀이

#include <stdio.h>

int i, sum, cnt[10];
char str[100002];

int main() {
	scanf("%s", str);

	for (i = 0; str[i]; i++) // 문자열 끝까지( 널까지 ) 실행
		cnt[str[i] - '0']++, sum += str[i] - '0'; // str[i] - '0' -> 문자를 숫자로 바꿔줌
	
	if (!cnt[0] || sum % 3) {
		printf("-1");
	}
	
	else
	{
		for (i = 9; i >= 0; i--)
			while (cnt[i]--) {  // cnt[i]가 0이되면 while문 멈춤. 그래서 반복이 안됨.
				printf("%d", i);
			}
	}

	return 0;
}

 

'알고리즘 코딩' 카테고리의 다른 글

[BOJ C/C++] 1120 문자열  (0) 2019.09.29
[BOJ C/C++] 2875 대회 or 인턴  (0) 2019.09.28
[BOJ C/C++] 11047 동전 0  (0) 2019.06.27
[BOJ C/C++] 15999 (카카오 코드 페스티벌 2018-C)  (0) 2019.06.25

C++로 간단하게 만든 Text RPG

C++ 강의를 들으면서 Text RPG를 만들어 보았다.

아래는 게임 실행 화면의 일부이다.

그리고 소스파일이다 한 500줄정도 되는거같다..

위 실행파일 외에도 상점기능, 인벤토리 기능이 구현되어있다. 

#include <iostream>
#include <time.h>

using namespace std;

/*
1. 무기상점에서 판매할 아이템 목록을 만들어주고 해당 목록을 출력해준다.
2. 출력할때 앞에 번호를 부여해주고 번호를 입력받아서 해당 번호의 아이템을
구입하게 해준다. 가장 마지막 번호에 뒤로가기 기능을 만든다.
단, 가방이 꽉 찼거나 돈이 부족할 경우 구매하지 못하게 한다.
3. 가방을 선택하면 가방안의 아이템을 보여준다.
*/
enum MAIN_MENU
{
	MM_NONE,
	MM_MAP,
	MM_STORE,
	MM_INVENTORY,
	MM_EXIT
};

enum MAP_TYPE
{
	MT_NONE,
	MT_EASY,
	MT_NORMAL,
	MT_HARD,
	MT_BACK
};

enum JOB
{
	JOB_NONE,
	JOB_KNIGHT,
	JOB_ARCHER,
	JOB_WIZARD,
	JOB_END
};

enum BATTLE
{
	BATTLE_NONE,
	BATTLE_ATTACK,
	BATTLE_BACK
};

enum ITEM_TYPE
{
	IT_NONE,
	IT_WEAPON,
	IT_ARMOR,
	IT_BACK
};

enum ITEM_ATTACK_TYPE
{
	IAT_NONE,
	IAT_WOODSWORD,
	IAT_STONESWORD
};

enum STORE_MENU
{
	SM_NONE,
	SM_WEAPON,
	SM_ARMOR,
	SM_BACK
};

#define NAME_SIZE 32
#define ITEM_DESC_LENGTH 512
#define INVENTORY_MAX 20
#define STORE_WEAPON_MAX 3
#define STORE_ARMOR_MAX 3

struct _tagItem
{
	char	strName[NAME_SIZE];
	char	strTypeName[NAME_SIZE];
	ITEM_TYPE	eType;
	int		iMin;
	int		iMax;
	int		iPrice;
	int		iSell;
	char	strDesc[ITEM_DESC_LENGTH];
};

struct _tagInventory
{
	_tagItem    tItem[INVENTORY_MAX];
	int			iItemCount;
	int			iGold;
};

struct _tagPlayer
{
	char	strName[NAME_SIZE];
	char	strJobName[NAME_SIZE];
	JOB		eJob;
	int		iAttackMin;
	int		iAttackMax;
	int		iArmorMin;
	int		iArmorMax;
	int		iHP;
	int		iHPMax;
	int		iMP;
	int		iMPMax;
	int		iExp;
	int		iLevel;
	_tagInventory tInventory;
};

struct _tagMonster
{
	char strName[NAME_SIZE];
	int		iAttackMin;
	int		iAttackMax;
	int		iArmorMin;
	int		iArmorMax;
	int		iHP;
	int		iHPMax;
	int		iMP;
	int		iMPMax;
	int		iLevel;
	int		iExp;
	int		iGoldMin;
	int		iGoldMax;
};

int main() 
{
	srand((unsigned int) time(0));
	
	// 게임을 시작할때 플레이어 정보를 설정하게 한다.
	_tagPlayer		tPlayer = {};
	// 플레이어 이름을 입력받는다.
	cout << "이름 : ";
	cin.getline(tPlayer.strName, NAME_SIZE - 1);

	int iJob = JOB_NONE;
	while (iJob == JOB_NONE)
	{
		system("cls");
		cout << "1. 기사" << endl;
		cout << "2. 궁수" << endl;
		cout << "3. 마법사" << endl;
		cout << "직업을 선택하세요 : ";
		cin >> iJob;

		if (cin.fail())
		{
			cin.clear();
			cin.ignore(1024, '\n');
			continue;
		}

		else if (iJob <= JOB_NONE || iJob >= JOB_END)
		{
			iJob = JOB_NONE;
		}

		tPlayer.iLevel = 1;
		tPlayer.iExp = 0;
		tPlayer.eJob = (JOB)iJob;
		tPlayer.tInventory.iGold = 10000;
		tPlayer.tInventory.iItemCount = 0;

		switch (tPlayer.eJob)
		{
		case JOB_KNIGHT:
			strcpy_s(tPlayer.strJobName, "기사");
			tPlayer.iAttackMin = 5;
			tPlayer.iAttackMax = 10;
			tPlayer.iArmorMin = 15;
			tPlayer.iArmorMax = 20;
			tPlayer.iHPMax = 500;
			tPlayer.iHP = 500;
			tPlayer.iMP = 100;
			tPlayer.iMPMax = 100;
			break;

		case JOB_ARCHER:
			strcpy_s(tPlayer.strJobName, "궁수");
			tPlayer.iAttackMin = 10;
			tPlayer.iAttackMax = 15;
			tPlayer.iArmorMin = 10;
			tPlayer.iArmorMax = 15;
			tPlayer.iHPMax = 400;
			tPlayer.iHP = 400;
			tPlayer.iMP = 200;
			tPlayer.iMPMax = 200;
			break;

		case JOB_WIZARD:
			strcpy_s(tPlayer.strJobName, "마법사");
			tPlayer.iAttackMin = 15;
			tPlayer.iAttackMax = 20;
			tPlayer.iArmorMin = 5;
			tPlayer.iArmorMax = 10;
			tPlayer.iHPMax = 300;
			tPlayer.iHP = 300;
			tPlayer.iMP = 300;
			tPlayer.iMPMax = 300;
			break;
		}
	}

	// 몬스터를 생성한다.
	_tagMonster		tMonsterArr[MT_BACK - 1] = {};

	// 고블린 생성
	strcpy_s(tMonsterArr[0].strName, "고블린");
	tMonsterArr[0].iAttackMin = 20;
	tMonsterArr[0].iAttackMax = 30;
	tMonsterArr[0].iArmorMin = 2;
	tMonsterArr[0].iArmorMax = 5;
	tMonsterArr[0].iHP = 100;
	tMonsterArr[0].iHPMax = 100;
	tMonsterArr[0].iMP = 10;
	tMonsterArr[0].iMPMax = 10;
	tMonsterArr[0].iLevel = 1;
	tMonsterArr[0].iExp = 1000;
	tMonsterArr[0].iGoldMin = 500;
	tMonsterArr[0].iGoldMax = 1500;

	// 트롤 생성
	strcpy_s(tMonsterArr[1].strName, "트롤");
	tMonsterArr[1].iAttackMin = 80;
	tMonsterArr[1].iAttackMax = 130;
	tMonsterArr[1].iArmorMin = 60;
	tMonsterArr[1].iArmorMax = 90;
	tMonsterArr[1].iHP = 2000;
	tMonsterArr[1].iHPMax = 2000;
	tMonsterArr[1].iMP = 100;
	tMonsterArr[1].iMPMax = 100;
	tMonsterArr[1].iLevel = 5;
	tMonsterArr[1].iExp = 7000;
	tMonsterArr[1].iGoldMin = 6000;
	tMonsterArr[1].iGoldMax = 8000;

	// 드래곤 생성
	strcpy_s(tMonsterArr[2].strName, "드래곤");
	tMonsterArr[2].iAttackMin = 250;
	tMonsterArr[2].iAttackMax = 500;
	tMonsterArr[2].iArmorMin = 200;
	tMonsterArr[2].iArmorMax = 400;
	tMonsterArr[2].iHP = 30000;
	tMonsterArr[2].iHPMax = 30000;
	tMonsterArr[2].iMP = 20000;
	tMonsterArr[2].iMPMax = 20000;
	tMonsterArr[2].iLevel = 10;
	tMonsterArr[2].iExp = 30000;
	tMonsterArr[2].iGoldMin = 20000;
	tMonsterArr[2].iGoldMax = 50000;
				
	// 상점에서 판매할 아이템 목록 생성한다.
	_tagItem	tStoreWeapon[STORE_WEAPON_MAX] = {};
	_tagItem	tStoreArmor[STORE_ARMOR_MAX] = {};

	// 각 아이템 정보들을 설정해준다.
    
	//나무검 생성
	strcpy_s(tStoreWeapon[0].strName, "나무검");
	strcpy_s(tStoreWeapon[0].strTypeName, "무기");
	tStoreWeapon[0].eType = (ITEM_TYPE)1;
	tStoreWeapon[0].iMin = 20;
	tStoreWeapon[0].iMax = 40;
	tStoreWeapon[0].iPrice = 10000;
	tStoreWeapon[0].iSell = 4000;
	strcpy_s(tStoreWeapon[0].strDesc, "나무로 만든 나무검입니다.");

	//돌검 생성
	strcpy_s(tStoreWeapon[1].strName, "돌검");
	strcpy_s(tStoreWeapon[1].strTypeName, "무기");
	tStoreWeapon[1].eType = (ITEM_TYPE)2;
	tStoreWeapon[1].iMin = 80;
	tStoreWeapon[1].iMax = 100;
	tStoreWeapon[1].iPrice = 1000;
	tStoreWeapon[1].iSell = 40000;
	strcpy_s(tStoreWeapon[1].strDesc, "돌로 만든 돌검입니다.");


	while (true) 
	{
		system("cls");
		cout << "******************************* 로비 ***************************" << endl;
		cout << "1. 맵" << endl;
		cout << "2. 상점" << endl;
		cout << "3. 가방" << endl;
		cout << "4. 종료" << endl;
		cout << "메뉴를 선택하세요 : " << endl;
		int iMenu;
		cin >> iMenu;

		if (cin.fail())
		{
			cin.clear();
			cin.ignore(1024, '\n');
			continue;
		}

		if (iMenu == MM_EXIT)
		{
			break;
		}

		switch (iMenu)
		{
		case MM_MAP:
			while (true)
			{
				system("cls");
				cout << "******************************* 맵 ***************************" << endl;
				cout << "1. 쉬움" << endl;
				cout << "2. 보통" << endl;
				cout << "3. 어려움" << endl;
				cout << "4. 뒤로가기" << endl;
				cout << "맵을 선택하세요 : ";
				cin >> iMenu;

				if (cin.fail())
				{
					cin.clear();
					cin.ignore(1024, '\n');
					continue;
				}

				// 이 if문에 속한 break는 맵 메뉴를 돌려주기 위한 while에 속해 있으므로
				// 이 while문을 빠져나간다.
				if (iMenu == MT_BACK)
				{
					break;
				}

				// 선택한 메뉴에서 1을 빼주면 몬스터 배열의 인덱스가 된다.
				// 그렇게 해서 해당 맵의 몬스터를 생성해준다.
				_tagMonster tMonster = tMonsterArr[iMenu - 1];

				while (true)
				{
					system("cls");
					switch (iMenu)
					{
					case MT_EASY:
						cout << "******************************* 쉬움 ***************************" << endl;
						break;
					case MT_NORMAL:
						cout << "******************************* 보통 ***************************" << endl;
						break;
					case MT_HARD:
						cout << "******************************* 어려움 ***************************" << endl;
						break;
					}

					// 플레이어 정보를 출력한다.
					cout << "====================== Player ======================" << endl;
					cout << "이름 : " << tPlayer.strName << "\t직업 : " <<
						tPlayer.strJobName << endl;
					cout << "레벨 : " << tPlayer.iLevel << "\t 경험치 : " <<
						tPlayer.iExp << endl;
					cout << "공격력 : " << tPlayer.iAttackMin << " - " <<
						tPlayer.iAttackMax << "\t방어력 : " << tPlayer.iArmorMin <<
						" - " << tPlayer.iArmorMax << endl;
					cout << "체력 : " << tPlayer.iHP << " / " << tPlayer.iHPMax <<
						"\t마나 : " << tPlayer.iMP << " / " << tPlayer.iMPMax << endl;
					cout << "보유골드 : " << tPlayer.tInventory.iGold << " Gold" << endl;

					// 몬스터 정보 출력
					cout << "====================== Monster ======================" << endl;
					cout << "이름 : " << tMonster.strName << "\t레벨 : " <<
						tMonster.iLevel << endl;
					cout << "공격력 : " << tMonster.iAttackMin << " - " <<
						tMonster.iAttackMax << "\t방어력 : " << tMonster.iArmorMin <<
						" - " << tMonster.iArmorMax << endl;
					cout << "체력 : " << tMonster.iHP << " / " << tMonster.iHPMax <<
						"\t마나 : " << tMonster.iMP << " / " << tMonster.iMPMax << endl;
					cout << "획득경험치 : " << tMonster.iExp << " Exp" << "\t획득골드 : " <<
						tMonster.iGoldMin << " - " << tMonster.iGoldMax << endl;

					cout << "1. 공격" << endl;
					cout << "2. 도망가기" << endl;
					cout << "메뉴를 선택하세요 : ";
					cin >> iMenu;

					if (cin.fail())
					{
						cin.clear();
						cin.ignore(1024, '\n');
						continue;
					}

					else if (iMenu == BATTLE_BACK) 
					{
						tPlayer.iHP = tPlayer.iHPMax;
						tPlayer.iMP = tPlayer.iMPMax;
						tMonster.iHP = tMonster.iHPMax;
						tMonster.iMP = tMonster.iMPMax;
						break;
					}

					switch (iMenu)
					{
					case BATTLE_ATTACK:
					{
						int iAttack = rand() % (tPlayer.iAttackMax - tPlayer.iAttackMin + 1) +
							tPlayer.iAttackMin;		
						int iArmor = rand() % (tMonster.iArmorMax - tMonster.iArmorMin + 1) +
							tMonster.iArmorMin;

						int iDamage = iAttack - iArmor;
						iDamage = iDamage < 1 ? 1 : iDamage;

						tMonster.iHP -= iDamage;

						cout << tPlayer.strName << " 가 " << tMonster.strName <<
							"에게 " << iDamage << " 피해를 입혔습니다." << endl;
						

						// 몬스터가 죽었을 경우 처리
						if (tMonster.iHP <= 0)
						{
							cout << tMonster.strName << " 몬스터가 죽었습니다." << endl;

							tPlayer.iExp += tMonster.iExp;
							int iGold = (rand() % (tMonster.iGoldMax - tMonster.iGoldMin + 1) +
								tMonster.iGoldMin);
							tPlayer.tInventory.iGold += iGold;

							cout << tMonster.iExp << " 경험치를 획득하였습니다." << endl;
							cout << iGold << " Gold를 획득하였습니다." << endl;
							
							tPlayer.iHP = tPlayer.iHPMax;
							tPlayer.iMP = tPlayer.iMPMax;
							tMonster.iHP = tMonster.iHPMax;
							tMonster.iMP = tMonster.iMPMax;

							system("pause");
							break;
						}
							// 몬스터가 살아있다면 플레이어를 공격한다
							iAttack = rand() % (tMonster.iAttackMax - tMonster.iAttackMin + 1) +
								tMonster.iAttackMin;
							iArmor = rand() % (tPlayer.iArmorMax - tPlayer.iArmorMin + 1) +
								tPlayer.iArmorMin;

							iDamage = iAttack - iArmor;
							iDamage = iDamage < 1 ? 1 : iDamage;

							// 플레이어의 HP를 감소시킨다.
							tPlayer.iHP -= iDamage;
							cout << tMonster.strName << " 가 " << tPlayer.strName <<
								"에게 " << iDamage << " 피해를 입혔습니다." << endl;
							

							// 플레이어가 죽었을 경우
							if (tPlayer.iHP <= 0)
							{
								cout << tPlayer.strName << " 플레이어가 사망하였습니다." << endl;

								int iExp = tPlayer.iExp * 0.1f;
								int iGold = tPlayer.tInventory.iGold * 0.1f;

								tPlayer.iExp -= iExp;
								tPlayer.tInventory.iGold -= iGold;

								cout << iExp << " 경험치를 잃었습니다." << endl;
								cout << iGold << " Gold를 잃었습니다." << endl;

								// 플레이어의 HP와 MP를 회복한다.
								tPlayer.iHP = tPlayer.iHPMax;
								tPlayer.iMP = tPlayer.iMPMax;
								tMonster.iHP = tMonster.iHPMax;
								tMonster.iMP = tMonster.iMPMax;
							}

							system("pause");
					}
						break;
					}

				}
			}

			break;
		case MM_STORE:
			while (true)
			{
				system("cls");
				cout << "******************************* 상점 ***************************" << endl;
				cout << "1. 무기상점" << endl;
				cout << "2. 방어구상점" << endl;
				cout << "3. 뒤로가기" << endl;
				cout << "상점을 선택하세요 : ";
				cin >> iMenu;

				if (cin.fail())
				{
					cin.clear();
					cin.ignore(1024, '\n');
					continue;
				}

				else if (iMenu == SM_BACK)
					break;

				switch (iMenu)
				{
				case SM_WEAPON:
					while (true)
					{
						system("cls");

						cout << "******************************* 무기상점 ***************************" << endl;
						// 판매 목록을 보여준다.
						cout << "1. 나무검" << endl;
						cout << "2. 돌검" << endl;
						cout << "3. 뒤로가기" << endl;
						cout << "아이템을 선택하세요 : ";
						cin >> iMenu;

						if (cin.fail())
						{
							cin.clear();
							cin.ignore(1024, '\n');
							continue;
						}

						else if (iMenu == IT_BACK)
							break;

						switch (iMenu)
						{
						case IAT_WOODSWORD:
						{
							if (tPlayer.tInventory.iItemCount >= 20)
							{
								cout << "가방이 꽉 찼습니다." << endl;
								system("pause");
								break;
							}
							else if (tPlayer.tInventory.iGold < tStoreWeapon[iMenu - 1].iPrice)
							{
								cout << "돈이 모자랍니다." << endl;
								system("pause");
								break;
							}
							else
							{
								strcpy_s(tPlayer.tInventory.tItem[tPlayer.tInventory.iItemCount].strName, "나무검");
								tPlayer.tInventory.iItemCount++;
								tPlayer.iAttackMin += tStoreWeapon[iMenu - 1].iMin;
								tPlayer.iAttackMax += tStoreWeapon[iMenu - 1].iMax;
								tPlayer.tInventory.iGold -= tStoreWeapon[iMenu - 1].iPrice;
								cout << "구매에 성공하였습니다." << endl;
								system("pause");
							}
							break;
						}
						case IAT_STONESWORD:
						{
							if (tPlayer.tInventory.iItemCount >= 20)
							{
								cout << "가방이 꽉 찼습니다." << endl;
								system("pause");
								break;
							}
							else if (tPlayer.tInventory.iGold < tStoreWeapon[iMenu - 1].iPrice)
							{
								cout << "돈이 모자랍니다." << endl;
								system("pause");
								break;
							}
							else
							{
								strcpy_s(tPlayer.tInventory.tItem[tPlayer.tInventory.iItemCount].strName, "돌검");
								tPlayer.tInventory.iItemCount++;
								tPlayer.iAttackMin += tStoreWeapon[iMenu - 1].iMin;
								tPlayer.iAttackMax += tStoreWeapon[iMenu - 1].iMax;
								tPlayer.tInventory.iGold -= tStoreWeapon[iMenu - 1].iPrice;
								cout << "구매에 성공하였습니다." << endl;
								system("pause");
							}
							break;
						}
						}
					}
					break;
				case SM_ARMOR:
					break;
				}
			}
			break;
		case MM_INVENTORY:
			system("cls");
			cout << "******************************* 가방 ***************************" << endl;
			cout << tPlayer.tInventory.iItemCount << endl;
			for (int i = 0; i < tPlayer.tInventory.iItemCount; i++) {
				cout << tPlayer.tInventory.tItem[i].strName << endl;
			}
			system("pause");
			break;
		default:
			cout << "잘못 선택하였습니다." << endl;
			break;
		}
	}

	return 0;
}

동전 0 성공

 

문제

준규가 가지고 있는 동전은 총 N종류이고, 각각의 동전을 매우 많이 가지고 있다.

동전을 적절히 사용해서 그 가치의 합을 K로 만들려고 한다. 이때 필요한 동전 개수의 최솟값을 구하는 프로그램을 작성하시오.

입력

첫째 줄에 N과 K가 주어진다. (1 ≤ N ≤ 10, 1 ≤ K ≤ 100,000,000)

둘째 줄부터 N개의 줄에 동전의 가치 Ai가 오름차순으로 주어진다. (1 ≤ Ai ≤ 1,000,000, A1 = 1, i ≥ 2인 경우에 Ai는 Ai-1의 배수)

출력

첫째 줄에 K원을 만드는데 필요한 동전 개수의 최솟값을 출력한다.

예제 입력 1 복사

10 4200 1 5 10 50 100 500 1000 5000 10000 50000

예제 출력 1 복사

6

 

접근방법

예제에서 4200원을 동전으로 나눌때 4200보다 큰 숫자로 나누면 몫이 0이다.

그래서 몫이 0이 아닌 숫자가 나타났을때 나누도록 해서 코드를 짰다.

 

소스

#include  <stdio.h>
.
int main()
{
int n, k, coin[10];
int cnt = 0;
scanf("%d %d", &n, &k);

for (int i = 0; i < n; i++)
{
    scanf("%d", &coin[i]);
}

for (int i = 0; i < n; i++)
{
    if (k / coin[n-1-i] != 0)
        {
            cnt = cnt + (k / coin[n - 1 - i]);
            k = k % coin[n-1-i];
        }
}
printf("%d", cnt);

return 0;
}


'알고리즘 코딩' 카테고리의 다른 글

[BOJ C/C++] 1120 문자열  (0) 2019.09.29
[BOJ C/C++] 2875 대회 or 인턴  (0) 2019.09.28
[BOJ C/C++] 10610 30  (0) 2019.09.28
[BOJ C/C++] 15999 (카카오 코드 페스티벌 2018-C)  (0) 2019.06.25

BOJ 15999 (카카오 코드 페스티벌 2018-C)


어느 날, 네오는 길을 걷다가 격자판 하나를 주웠다. 그 격자판은 행 열로, 각 격자는 흰색 또는 검은색으로 칠해져 있다.

네오는 이 격자판에는 분명 엄청난 비밀이 숨겨져 있을 것이라고 생각해 나중에 해독을 시도해 보기로 하였다. 아래 그림은 격자판 상태의 예시이다.


네오가 잠시 외출한 사이, 프로도는 네오의 격자판을 이리저리 살펴보았다. 얼마 뒤, 하나의 격자를 누르게 되면 자신을 포함해 그 격자와 연결된 모든 칸들의 색이 반전된다는 사실을 관찰할 수 있었다. 여기서, 두 격자가 연결되었다는 것은 두 격자 사이를 서로 같은 색이면서 변을 공유하는 격자들로만 이동하여 오갈 수 있다는 것을 뜻한다. 집으로 돌아온 네오는 프로도가 격자판의 상태를 바꿔버렸다는 것을 알고 좌절했다. 하지만 최종 상태를 알고 있기 때문에, 초기 상태를 추측할 수 있을 것이라는 희망을 가지기로 했다.

프로도는 격자판을 0번 이상 눌렀다(아직 한 번도 누르지 않은 상태일 수도 있다). 현재 각 격자의 색깔이 주어졌을 때, 격자판의 초기 상태로 가능한 경우의 수를 1,000,000,007(109 + 7)로 나눈 나머지를 구하여라. 두 격자판의 상태가 다르다는 것은, 같은 위치의 격자의 색이 다른 경우가 존재할 때로 정의한다.

입력

첫 줄에 격자판의 행의 수 과 열의 수 이 주어진다. (1 ≤ NM ≤ 2,000)

둘째 줄부터 개의 줄에 걸쳐 현재 각 격자의 색을 나타내는 문자열이 주어진다.

개의 줄 중에서 번째 줄의 번째 문자는 행 열 격자의 색을 나타내며, 'B'인 경우 검은색, 'W'인 경우 흰색임을 나타낸다.

출력

첫 줄에 격자의 초기 상태로 가능한 경우의 수를 1,000,000,007(109 + 7)로 나눈 나머지를 출력한다.

예제 입력 1 

2 2
WB
BB

예제 출력 1 

2

WB
BB

WB
BW

이렇게 두 가지가 가능하다.


문제 분석

일단 문제에서 하나의 격자를 누르게 되면 자신을 포함해 그 격자와 연결된 모든 칸들의 색이 반전된다.

그런데 여기서 연결되어있다는 것은 같은 색 타일이 변으로 연결되어 있다는 것을 의미한다.

위 예제에서 WB 

                    BB  는 B 세칸이 서로 연결되어있어서 아무 B 타일을 누르면 B 타일이 모두 반전된다.

예제에서 왜 WB  WB 가 초기상태로 가능하냐면 WB 을 제외한 다른 상태에서는 WB 모양을 만들 수가 없기 때문이다.

                    BB   BW                                              BW                                             BB

그래서 인접한 타일이 모두 같은 색깔인 타일로만 이루어진 타일의 개수를 구해 그 개수만큼 2를 제곱하면 된다. ex) 10개일 경우 2의 10승


코드

#include <stdio.h>

#define MOD 1000000007


int pow(int x) {  // 2의 x승 구하는 함수

if (x == 0) return 1; 

if (x == 1) return 2;


long long value = calcPow(x / 2);

if (x % 2 == 0) {

return (value * value) % MOD; // 2^2x = 2^x * 2^x

}

else {

return (((value * value) % MOD) * 2) % MOD; // 2^(2x + 1) = 2^x * 2^x * 2

}

}

int main()

{

int n, m;

char block[2001][2001];

int cnt=0;

int sum;


scanf("%d %d", &n, &m);


for (int i = 0; i < n; i++)

{

scanf("%s", block[i]);

}


for (int i = 0; i < n; i++)

{

for (int j = 0; j < m; j++)

{

if ((i == 0 || block[i - 1][j] == block[i][j]) && (i == n - 1 || block[i + 1][j] == block[i][j]) && (j == 0 || block[i][j - 1] == block[i][j]) && (j == m - 1 || block[i][j + 1] == block[i][j])) {

cnt++; // 인접한 타일이 모두 같은 색깔로 둘러싸인 타일 개수 구하기

}

}

}

printf("%d", pow(cnt));


return 0;

}




'알고리즘 코딩' 카테고리의 다른 글

[BOJ C/C++] 1120 문자열  (0) 2019.09.29
[BOJ C/C++] 2875 대회 or 인턴  (0) 2019.09.28
[BOJ C/C++] 10610 30  (0) 2019.09.28
[BOJ C/C++] 11047 동전 0  (0) 2019.06.27

+ Recent posts