본문 바로가기
Problem Solving/SWEA

[SWEA] 7853. 오타

by 테리는당근을좋아해 2020. 2. 29.

문제

방송사에서 생방송 자막 송출을 담당하고 있는 재경이는 한글 타자가 무려 1000에 육박한다.

누구보다 빠른 한글 타자를 보유하고 있지만 치명적인 단점이 있다. 영어 타자의 오타가 극심하게 발생한다.

재경이는 어떤 단어를 쓸 때에 오타를 특정한 방법으로 발생시킨다.

치고자 하는 단어와 길이는 동일한 단어를 쓰지만, i번째 문자에다가 원래 단어의 (i-1) 번째, i 번째, (i+1) 번째 문자 중 무엇이든 쳐버린다.

특히 제일 첫 문자는 첫 문자와 그 다음 문자 중 하나를 쓸 수 있고, 마지막 문자는 마지막과 그 앞의 문자를 쓸 수 있다.

예를 들어서, apa 라는 단어에서 재경이가 낼 수 있는 오타는 aaa, aap, apa, app, paa, pap, ppa, ppp 중 하나를 칠 수 있는 것이다.

단어가 주어졌을 때에 재경이가 칠 수 있는 서로 다른 단어의 개수를 구하여라.

 

풀이방법

DFS(깊이 우선 탐색)으로 모든 경우의 수를 구했다가 시간초과가 발생했다.

 

요즘들어서 문제를 제대로 읽지도 않고, DFS, BFS, DP를 우선적으로 사용할 생각을 하는 것 같다.

 

친한 친구가 매번 해주었던 말이 생각났다.

 

"Simple is best!"

 

문제가 주어졌을 때 가장 간단하면서도 최적의 알고리즘을 선택하는 능력이 필요하다.

 

DFS를 사용해 시간초과가 발생하고 나서 문제를 제대로 읽어볼 수 있었다.

 

반복문을 한 번 돌려 각 문자에서 존재할 수 있는 모든 경우의 수를 곱해주기만 하면 되는 문제였다.

 

단, 각 문자에서 발생하는 경우의 수는 조건이 따른다.

 

주어진 문자열을 a[i]라고 했을 때, 각 경우의 수는

 

i=0일 때,

a[i] != a[i+1] 일 경우 : 2

a[i] == a[i+1] 일 경우 : 1

 

i=n-1일 때,

a[i-1] != a[i] 일 경우 : 2

a[i-1] == a[i] 일 경우 : 1

 

나머지

a[i-1] == a[i+1]이면서 a[i] != a[i-1]일 경우 2

a[i-1] != a[i+1]이면서 a[i-1] == a[i] 또는 a[i+1] == a[i]일 경우 2

a[i-1] != a[i] != a[i+1]일 경우 3

a[i-1] == a[i] == a[i+1]일 경우 1 

 

소스코드

package samsung;

import java.util.*;

public class s_7853 {
	public static void main(String[] args) {
		Scanner sc = new Scanner(System.in);
		int tc = sc.nextInt();
		
		for(int t = 1; t <= tc; t++) {
			String s = sc.next();
			long cnt = 1;
			int n = s.length();
			
			for(int i = 0; i < n; i++) {
				int r = 1;
				if(i == 0) {
					if(s.charAt(i) != s.charAt(i + 1)) r++;
				}
				else if(i == n - 1) {
					if(s.charAt(i - 1) != s.charAt(i)) r++;
				}
				else {
					if(s.charAt(i - 1) != s.charAt(i)) r++;
					if(s.charAt(i) != s.charAt(i + 1)) r++;
					if(r > 1 && s.charAt(i - 1) == s.charAt(i + 1)) r--;
				}
				cnt *= r;
				cnt %= 1000000007;
			}
			System.out.println("#" + t + " " + cnt);
		}
	}
}

 

'Problem Solving > SWEA' 카테고리의 다른 글

[SWEA] 6190. 정곤이의 단조 증가하는 수  (0) 2020.03.04
[SWEA] 3750. Digit sum  (0) 2020.03.04
[SWEA] 5688. 세제곱근을 찾아라  (0) 2020.02.29
[SWEA] 8840. 아바바바  (0) 2020.02.29
[SWEA] 3408. 세가지 합 구하기  (1) 2020.02.29

댓글