본문 바로가기

Dev/Algorithm

[백준] 1759 - 암호만들기

https://www.acmicpc.net/problem/1759

 

1759번: 암호 만들기

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

www.acmicpc.net

 일전에 풀었던 N-Queen 문제와 비슷한 백트래킹을 이용한 문제이다. (N-Queen 문제가 순수 백트래킹 알고리즘만을 이용하는 것이므로 백트래킹에 대해서 좀더 높은 이해를 원한다면 이전글을 참고할 것.)

[Dev/Algorithm] - [백준] 9663 - N-Queen

 

[백준] 9663 - N-Queen

https://www.acmicpc.net/problem/9663 9663번: N-Queen N-Queen 문제는 크기가 N × N인 체스판 위에 퀸 N개를 서로 공격할 수 없게 놓는 문제이다. N이 주어졌을 때, 퀸을 놓는 방법의 수를 구하는 프로그램..

nemowork.com

 이번 문제는 백트래킹 이외에도 몇가지 주의해야할 사항이 있는데..

  1. 최소 한개의 자음과 최소 두개의 자음으로 구성되어야 하는 조건
    - 재귀 호출을 하면서, 자음과 모음의 구성을 확인하고 조건 검색을 해야한다.
  2. 정렬된 문자열을 선호하는 조교들의 성향
    - 꽤 이해할수 없는 취향이긴 하지만, 백트레킹 알고리즘을 돌리기 전에 입력받은 문자들을 정렬해주면 된다.

 생각보다는 쉽게 풀렸다.

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

int L, C;
char input[16];
char password[16];
bool moum[27];

int cmp(const void * a, const void * b)
{
    return ( *(char*)a - * (char*)b );
}

void solve(int pw_count, int start_idx, int pw_point, string str){
  if(pw_count == L){
    if(pw_point >=2 && pw_point <= L-1){
      printf("%s\n", str.c_str());
    }
    return;
  } 
  if(start_idx == C){
    return;
  }
  string add_str = str + input[start_idx];
  solve(pw_count+1, start_idx+1, pw_point-(moum[input[start_idx]-'a']?1:0), add_str);
  solve(pw_count, start_idx+1, pw_point, str);

}

int main(){
  scanf("%d%d", &L, &C);
  memset(password, '\0', sizeof(password));
  memset(input, '\0', sizeof(input));
  memset(moum, false, sizeof(moum));
  moum['a'-'a'] = true;
  moum['e'-'a'] = true;
  moum['i'-'a'] = true;
  moum['o'-'a'] = true;
  moum['u'-'a'] = true;

  for(int i=0; i<C; ++i){
    char temp[2];
    scanf("%s", temp);
    input[i] = temp[0];
  }

  qsort(&(input[0]), C, sizeof(char), cmp);

  solve(0, 0, L, "");

  return 0;
}