5622: 다이얼 - java && js

그리 어렵지 않은 문제입니다.

대문자 A가 아스키코드로 변환되면 정수 65가 된다는 개념에서 착안할게요.

A, B, C -> 65, 66, 67 //(-65) -> 0, 1, 2 -> /3 == 0
D, E, F -> 68, 69, 70//(-65) -> 3, 4, 5 -> /3 == 1
...

그럼 각 알파벳에 65를 뺀 값을 3으로 나눈 몫에
3을 더하면 알파벳에 해당하는 숫자가 나오겠죠?

그런데 잠깐!
S, V, Y, Z에 대해서는 따로 처리를 해주어야하네요..
PQRS부터 한칸씩 밀리는 녀석들에 주의해주세요!

자, 일단 자바로 문제를 풀어볼게요.

import java.io.IOException;
import java.util.Scanner;

public class Dial_5622 {
	public static void main(String[] args) throws IOException {
		Scanner stdIn = new Scanner(System.in);
		String str = stdIn.next(); 
		
		
		char[] chars = str.toCharArray();
		int answer = 0;
		for(int i = 0; i<chars.length;i++) {
			int alph = chars[i] - 65;
			answer += (alph/3) + 3;
			if(alph == 83 || alph == 86 || alph== 89 || alph == 90) { //S V Y Z
				answer -= 1;
			}
		}
		System.out.println(answer);
	}
}

이렇게 풀어도 되지만 Scanner보다 빠른 BufferedReader를 사용하는 것도 좋은 방법입니다.

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;

public class Main {
	public static void main(String[] args) throws IOException {
    		//BufferedReader 사용!
		BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
         	String str = br.readLine();// 개행 문자('\n', '\r')를 만날 때까지 한 줄을 읽습니다.
		char[] chars = str.toCharArray();
		int answer = 0;
        
		for(int i = 0; i<chars.length;i++) {
			int alph = chars[i] - 65;
			answer += (alph/3) + 3;
			if(alph == 83 || alph == 86 || alph== 89 || alph == 90) { //S V Y Z
				answer -= 1;
			}
		}
		System.out.println(answer);
	}
}

이제 자바스크립트 코드를 볼까요?
코드 진행은 같겠지만 자바 코드와 다른점 위주로 살펴볼게요!
(제가 자바가 더 익숙해서 자바를 먼저 풀고 자바스크립트를 풀었습니다. 혹시 부족한 점이 눈에 보이시면 바로 코멘트 주세요!)

let fs = require('fs');
let input = fs.readFileSync('dev/stdin').toString().split('\n');
var answer = 0;

for(var i = 0; i<input.length; i++){
    var ascii = input.charCodeAt(i); // "문자열".charCodeAt([문자열 자릿수]);
    var alph = ascii - 65;
    //answer += (alph/3) + 3; //소숫점이 계산되어 버렸음!
    answer += Math.floor((alph/3)) + 3; //Math.floor() : 소수점 버림, 정수 반환
    if(input[i] == 83 || input[i] == 85 || input[i]==89 || input[i]==90){
        answer -=1;
    }
}
console.log(answer);

다른 점이 눈에 보이시죠?

첫 번째로 아스키 코드를 읽어보는 방법에서 차이가 있군요!

자바는 아래 코드처럼 char형인 문자를 바로 아스키코드로 해석해 int형으로 계산이 가능한데요

int alph = chars[i] - 65;

자바스크립트는 "문자열".charCodeAt([idx]);
라는 함수를 사용하여 아스키 코드를 정수형태로 받을 수 있네요!

var ascii = input.charCodeAt(i); 

그 다음 눈에 띄는 것은 정수 나눗셈 계산입니다!

자바는 int형의 나눗셈 계산에서 자동으로 소숫점을 버려줍니다.

answer += (alph/3) + 3;

그런데 자바스크립트는 이렇게 하면 소숫점이 그대로 나타나네요 ㅠ
자바스크립트는 정수 나눗셈 계산에서 Math.floor() 함수를 이용해 소숫점을 직접 버려주어야 합니다.

answer += Math.floor((alph/3)) + 3;

자~ 여기서 깜짝 퀴즈!!!
같은 코드로 보이지만 사실 여기엔 어마무시한 함정이 숨겨져 있는데요!
그 함정은 저도 사실 찾지 못했습니다~ 뚜둔~!!
맞왜틀을 외치며 이번 포스트는 마무리 하겠습니다.

혹시 자바스크립트 코드가 왜 정답이 안되는지 아시는 분 있으면 코멘트 남겨 주세요 ㅠㅠ

좋은 웹페이지 즐겨찾기