본문 바로가기
Problem Solving/SWEA

[SWEA] 4261. 빠른 휴대전화 키패드

by 테리는당근을좋아해 2020. 3. 9.

문제

동한이는 창고에서 오래된 애니콜 휴대전화를 발견했다.

이 휴대전화의 키패드는 아래와 같이 생겼다.



이 키패드는 각 키를 여러 번 눌러 영문을 입력할 수 있는데, a를 입력하려면 2를 한 번, b를 입력하려면 2를 두 번 누르는 식이다.

그러나 동한이는 이 방식이 너무 느리다고 생각하여 문자열을 빠르게 타이핑할 수 있도록 키패드를 다음과 같이 바꿔 보려고 한다.

사용할 단어들을 미리 휴대폰에 저장한 뒤, 해당 알파벳이 써있는 숫자를 한 번씩만 누르면 가능한 여러 단어 중에 사전에 저장된 단어를 찾아서 입력하는 것이다.

예를 들면 car를 입력하려면 222, 2, 777을 입력하는 것이 정상이지만 이 자판의 경우 227을 입력하면 aap, aaq, …, ccs 등 3×3×4=36개의 단어 중에 사전에 존재하는 단어를 출력해준다.

하지만 동한이는 이 시스템의 문제점을 발견하였다. 이 예시의 경우 car는 cap과 표현이 겹친다는 점을 확인할 수 있는데,

이처럼 키 입력이 동일한 단어가 여럿 존재할 수 있다는 것이다.

동한이는 얼마나 이런 경우가 자주 발생되는지 확인하기 위해, 사전과 키 입력이 주어지면 해당하는 키 입력과 대응되는 단어가 몇 개인지 구하는 프로그램을 원한다.

이러한 프로그램을 작성하라.

 

풀이방법

각 문자 a, b, c, d, ... ,y, z를 int형으로 바꿔 키패드가 문자를 정수형으로 바꾼 범위안에 포함되는지 확인한다.

 

97(a) <= 키패드 2 <= 99(c)

 

97(d) <= 키패드 3 <= 99(f)

 

97(g) <= 키패드 4 <= 99(i)

 

97(j) <= 키패드 5 <= 99(l)

 

97(m) <= 키패드 6 <= 99(o)

 

97(p) <= 키패드 7 <= 99(s)

 

97(t) <= 키패드 8 <= 99(v)

 

97(w) <= 키패드 9 <= 99(z)

 

소스코드

package samsung;

import java.util.*;

public class s_4261 {
	public static void main(String[] args) {
		Scanner sc = new Scanner(System.in);
		int tc = sc.nextInt();
		int[][] range = {{97, 99}, {100, 102}, {103, 105}, {106, 108}, {109, 111}, {112, 115}, {116, 118}, {119, 122}};
		for(int t = 1; t <= tc; t++) {
			String num = sc.next();
			int n = sc.nextInt();
			int cnt = 0;
			
			for(int i = 0; i < n; i++) {
				String s = sc.next();
				int flag = 0;
				if(s.length() != num.length()) continue;
				
				for(int j = 0; j < s.length(); j++) {
					if((int)s.charAt(j) < range[num.charAt(j) - '0' - 2][0] || (int)s.charAt(j) > range[num.charAt(j) - '0' - 2][1]) {
						flag = 1;
						break;
					}
				}
				if(flag == 0)
					cnt++;
			}
			
			System.out.println("#" + t + " " + cnt);
		}
	}
}

 

댓글