본문 바로가기

algorithm/BOJ

백준 1342_행운의 문자열(JAVA)

 

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

 

1342번: 행운의 문자열

민식이와 준영이는 자기 방에서 문자열을 공부하고 있다. 민식이가 말하길 인접해 있는 모든 문자가 같지 않은 문자열을 행운의 문자열이라고 한다고 한다. 준영이는 문자열 S를 분석하기 시작

www.acmicpc.net

[문제 풀이]

DFS를 이용하여 문제를 풀었습니다.

 

이 문제는 문자열이 주어졌을 때 두 가지 비교를 통해 행운의 문자열을 찾아내는 것입니다. 

1. 사용할 알파벳이 있느냐

2. 이전 알파벳이 현재 알파벳과 같느냐

 

이 두 가지를 비교해서 만든 문자열이 주어진 문자열의 크기와 같을 경우 결과값을 올려주는 방식으로 문제를 해결했습니다.

 

문제를 푸는 순서는 다음과 같습니다.

  • 문자열을 입력 받으면 알파벳의 갯수를 기록한다.
  • 알파벳을 하나씩 추가하며, 마지막에 있는 문자와 다른 문자만을 추가한다.
  • 주어진 문자열의 크기와 같아지면 결과값을 1 올려준다.

[코드]

package coding;

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.HashSet;

public class Back1342 {

	static char[] alphabet = new char[27];
	static boolean[] visited;
	static int result = 0;
	
	public static void DFS(int idx, String temp, int len) {
		
		if(idx == len) {
			result++;
			return;
		}
		
		for(int i = 0; i < 26; i++) {
			if(alphabet[i] == 0)
				continue;
			if(temp != "" && temp.charAt(temp.length() - 1) == (char)('a' + i))
				continue;
			alphabet[i]--;
			DFS(idx + 1, temp + (char)('a' + i), len);
			alphabet[i]++;
		}
	}
	
	public static void main(String[] args) throws IOException {
		
		BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
		String str = br.readLine();
		
		
		for(int  i = 0; i < str.length(); i++)
			alphabet[str.charAt(i) - 'a']++;

		DFS(0, "", str.length());
		
		System.out.println(result);
		
	}
	
}

'algorithm > BOJ' 카테고리의 다른 글

백준 15729_방탈출(JAVA)  (0) 2022.01.15
백준 1197_최소 스패닝 트리(JAVA)  (0) 2021.04.23
백준 2156_포도주 시식(JAVA)  (0) 2021.04.23
백준 1463_1로 만들기(JAVA)  (0) 2021.04.22
백준 1717_집합의 표현(JAVA)  (0) 2021.04.16