본문 바로가기
백준(C언어)/23년 11월

[C] 백준 - 1759번: 암호 만들기

by C0MPAS 2023. 11. 23.

11월 23일(목) - 브루트포스 (1759번)

 

1759번: 암호 만들기

첫째 줄에 두 정수 L, C가 주어진다. (3 ≤ L ≤ C ≤ 15) 다음 줄에는 C개의 문자들이 공백으로 구분되어 주어진다. 주어지는 문자들은 알파벳 소문자이며, 중복되는 것은 없다.

www.acmicpc.net

ㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡ

 

최초 생각 정리

ㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡ

 

문제점

ㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡ

 

풀이

(풀이출처 -> https://juintination.tistory.com/26)

#define _CRT_SECURE_NO_WARNINGS
#pragma warning(disable: 4996)

#include <stdio.h>
#include <stdlib.h>

int l, c;
char* arr, * password;

int compare(const void* a, const void* b)
{
	char o1 = *(char*)a;
	char o2 = *(char*)b;
	if (o1 > o2) return 1;
	else if (o1 < o2) return -1;
	else return 0;
}
void dfs(int dpth, int idx)
{
	if (dpth == l) {
		int vowel = 0, consonant = 0;
		for (int i = 0; i < l; i++)
		{
			switch (arr[i])
			{
			case 'a': case 'e': case'i': case'o': case'u':
				vowel++;
				break;
			default:
				consonant++;
				break;
			}
		}
		if (vowel > 0 && consonant >= 2) {
			printf("%s\n", arr);
		}
		return;
	}
	for (int i = idx; i < c; i++) {
		arr[dpth] = password[i];
		dfs(dpth + 1, i + 1);
	}
}
int main(void) {
	scanf("%d %d", &l, &c);
	password = (char*)malloc(sizeof(char) * c);
	arr = (char*)malloc(sizeof(char) * c);

	for (int i = 0; i < c; i++)
	{
		getchar();
		scanf("%c", &password[i]);
	}
	qsort(password, c, sizeof(char), compare);

	dfs(0, 0);

	return 0;
}

ㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡ

'백준(C언어) > 23년 11월' 카테고리의 다른 글

[C] 백준 - 2212번: 센서  (0) 2023.11.22
[C] 백준 - 1043번: 거짓말  (0) 2023.11.21
[C] 백준 - 1520번: 내리막 길  (2) 2023.11.20
[C] 백준 - 2133번: 타일 채우기  (1) 2023.11.13
[C] 백준 - 2437번: 저울  (0) 2023.11.08

댓글