[문제링크]

 

1342번: 행운의 문자열

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

www.acmicpc.net

 

0. 주어진 문자로 만들수 있는 모든 순열 중, 조건을 만족하는 갯수를 구하는 문제

  - 조건 1. 인접한 문자는 달라야 한다

  - 조건 2. 최종 결과가 달라야 한다 (a 2개로 aa', a'a을 만들수 있지만, 둘은 같은것으로 취급한다)

 

1. 순열의 i번째 자리를 정할 때 이전 문자정보를 참고해 다른 문자만 사용한다면, 조건 1번은 해결할 수 있다

  - 0번째 자리에서 참조할 값으로는 입력값(알파벳)이 아닌 아무 문자나 주면 된다

 

2. 조건 2번의 경우, 여러번 등장하는 같은 문자를 다른 문자로서 사용하기 때문에 발생한다.

  - 즉, i번째 자리에 한번 a 문자를 사용했다면 a가 또 등장해도 사용하지 않으면 해결할 수 있다

 

3. 이를 위해, 한번 사용한 문자의 정보를 저장해두어 중복 사용하는것을 막았다 (bitmask)

 

4. 2/3번에서 걸러지지 않고 끝까지 완료된 순열만 count해주면 된다

 

import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.util.Arrays;

public class Main{
	public static void main(String[] args)throws Exception {
		BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
		
		s = br.readLine().toCharArray();
		isC=new boolean[s.length];
		cntLuck=0;
		lucky(0, ' ');
		System.out.println(cntLuck);
	}
	
	static char[] s;
	static boolean[] isC;
	static int cntLuck;
	
	static void lucky(int cnt, char prev) {
		if(cnt==s.length) {
			cntLuck++;
			return;
		}
		int bitMask=0;
		for (int i = 0; i < s.length; i++) {
			if(!isC[i] && s[i]!=prev && ( (bitMask&1<<(s[i]-'a')) == 0)) {
				//not used + not same with prev
				isC[i]=true;
				bitMask|=1<<(s[i]-'a');
				lucky(cnt+1, s[i]);
				isC[i]=false;
			}
		}
	}
	
	static int pint(String s) {
		return Integer.parseInt(s);
	}
}

결과 화면

'알고리즘 문제 풀이 > BOJ 골드' 카테고리의 다른 글

[백준] 16120 - PPAP  (0) 2021.06.24
[백준] 13904 - 과제  (0) 2021.06.24
[백준] 1747 - 소수 & 팰린드롬  (0) 2021.06.18
[백준] 9081 - 단어 맞추기  (0) 2021.06.18
[백준] 16234 - 인구 이동  (0) 2021.06.15
[백준] 14503 - 로봇 청소기  (0) 2021.06.15
[백준] 15685 - 드래곤 커브  (0) 2021.06.15

+ Recent posts