5622:ダイヤル-java&&js

17115 ワード

はそんなに難しい問題ではありません.
大文字AをAskyコードに変換すると整数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から格押ししていく奴らに注意!
まずはJavaで解きましょう
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);
	}
}
JavaScriptコードを見てみましょうか?
コードの進捗は同じですが、javaコードとは違うところをメインに見てみます!
△私はJavaに詳しいので、まずJavaを解いて、それからJavaScriptを解いた.足りないところを見たら、すぐにメッセージを残してください.
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);
違う点が見えますよね?
最初にAskyコードを読む方法には違いがあるでしょう.
JAvaは,以下のコードのように文字型の文字を直接askiコードと解釈し,int型と計算することができる.
int alph = chars[i] - 65;
JavaScriptは「文字列」です.charCodeAt([idx]);
名前の関数を使用して、Askyコードを整数で受信できます.
var ascii = input.charCodeAt(i); 
次に注意したいのは整数除算計算です!
int型の除算計算ではJavaは小数点を自動的に放棄する.
answer += (alph/3) + 3;
しかしjavascriptがそうすると小数点がそのまま出てきますㅠ
JavaScriptは整数除算計算にMathを使用します.floor()関数を使用して小数点を直接破棄する必要があります.
answer += Math.floor((alph/3)) + 3;
さぁ~ここでいきなりクイズ!!
同じコードに見えますが、実はここには恐ろしい罠が隠されています!
実は私もその罠を見つけていません~ブーブー~!
そう「なんでフレーム」と叫んで今回のポスターを終わらせよう
なぜjavascriptコードが正しく答えられないのかご存知の方がいらっしゃいましたら、メッセージをお願いしますㅠㅠ