문제
동한이는 창고에서 오래된 애니콜 휴대전화를 발견했다.
이 휴대전화의 키패드는 아래와 같이 생겼다.
이 키패드는 각 키를 여러 번 눌러 영문을 입력할 수 있는데, 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);
}
}
}
'Problem Solving > SWEA' 카테고리의 다른 글
[SWEA] 8659. GCD (0) | 2020.03.10 |
---|---|
[SWEA] 4050. 재관이의 대량 할인 (0) | 2020.03.09 |
[SWEA] 5432. 쇠막대기 자르기 (0) | 2020.03.09 |
[SWEA] 1861. 정사각형 방 (0) | 2020.03.09 |
[SWEA] 1258. [S/W 문제해결 응용] 7일차 - 행렬찾기 (0) | 2020.03.09 |
댓글