나만보는개발공부블로그

[구름 먼데이 챌린지] 폴더 폰 자판 본문

Algorithms

[구름 먼데이 챌린지] 폴더 폰 자판

alexrider94 2023. 10. 9. 01:47

문제

10년 전, 구름이가 처음으로 구매했던 휴대폰은 폴더 폰이다. 이 폴더 폰의 자판은 최근의 휴대폰의 입력 방식과는 차이가 있다.

구름이가 사용했던 폴더 폰의 자판은 아래 그림과 같다.

자판

자판은 9개의 버튼으로 이루어져 있다. 이 자판은 이용해서 문자를 입력하는 방법은 아래와 같다.

  • 버튼을 한 번 누르면 그 버튼에 해당하는 숫자를 입력할 수 있다.
  • 버튼을 k번 누르면 그 버튼의 k-1번째에 해당하는 문자를 입력할 수 있다. 예를 들어 5번 버튼을 두 번 누르면 J가 입력된다.
  • 만약 그 버튼에 적혀있는 숫자와 문자의 개수보다 더 많은 버튼을 누르면, 다시 숫자, 첫 번째 문자, 두 번째 문자... 순서로 입력되는 문자가 반복된다. 예를 들어 6번 버튼을 다섯 번 누르면 6이 입력되고, 여섯 번 누르면 M이 입력된다.

구름이가 폴더 폰의 숫자 버튼을 누른 순서가 주어진다. 이 순서를 보고 구름이가 원래 입력하려고 했던 문장을 유추해보자.

 

입력 예시

2
11

출력 예시

.

해결 방안

먼저 폴더 폰의 자판을 객체형태로 구현해주고 입력에서 누른 버튼이 연속적으로 달라지는 부분에서 누른 순서의 카운트를 자판기의 숫자와 문자 총합의 나머지를 결과값에 추가해서 보여준다.

 

자바스크립트 코드

// Run by Node.js
const readline = require('readline');
let input = [];
let rl = readline.createInterface({ input: process.stdin });

rl.on('line', (l) => {
	input.push(l);
}).on('close', () => {
	let n = Number(input[0]);
	let numbers = input[1].split("").map(Number);
	
	let pad = {
		1 : ['.',',','?',"!"],
		2 : ['A','B','C'],
		3 : ['D','E','F'],
		4 : ['G','H','I'],
		5 : ['J','K','L'],
		6 : ['M','N','O'],
		7 : ['P','Q','R','S'],
		8 : ['T','U','V'],
		9 : ['W','X','Y','Z']
	}
	
	let count = 0;
	let result = '';
	for(let i=0; i<numbers.length; ++i){
		if(numbers[i] !== numbers[i+1]) {
			let selected = count % (pad[numbers[i]].length + 1);
			count = 0;
			if(pad[numbers[i]]) {
				if(selected === 0) {
					result += numbers[i];
				} else {
					result += pad[numbers[i]][selected-1];
				}
			}
		} else {
			count++;
		}
	}
	
	console.log(result);
})