본문 바로가기
코딩테스트/백준

[백준/Java] 5622: 다이얼 (+)

by naahy 2022. 10. 19.

https://www.acmicpc.net/problem/5622

 

5622번: 다이얼

첫째 줄에 알파벳 대문자로 이루어진 단어가 주어진다. 단어의 길이는 2보다 크거나 같고, 15보다 작거나 같다.

www.acmicpc.net

 


 


알파벳과 매칭되는 숫자를 찾는 데에서 고민을 많이 했다.
아무리 생각해봐도 if문(혹은 switch-case문)으로 알파벳을 구별해 숫자를 매칭하는 방법밖에 떠오르지 않았다.


근데 진짜 그렇게 푸는 게 맞았다(...).
다른 규칙이 있는 줄 알고 끙끙댔는데, 최대한 단순하게 생각해볼 필요가 있었다.
아직 문제를 많이 안 풀어봐서 뭐가 맞는 방법인지 알기 어려우니 더 열심히 풀어봐야 할 듯...

 

🚀 참고
https://st-lab.tistory.com/67

 


 

풀이1

더보기
  • 단어를 입력받은 후 for문을 통해 각 알파벳을 확인한다.
  • if문 혹은 switch-case문을 통해 알파벳별 숫자를 확인한다.
  • 숫자를 입력하는 데 걸리는 시간을 전체 시간 변수에 더한다.

 

코드

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

public class Dial5622 {

	public static void main(String[] args) throws IOException {
		BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
		
		String word = br.readLine();
		
		int time = 0;
		for (int i=0; i<word.length(); i++) {
			int alphabet = word.charAt(i);
			
			if (alphabet>='A' && alphabet<='C')
				time += 3;
			else if (alphabet>='D' && alphabet<='F')
				time += 4;
			else if (alphabet>='G' && alphabet<='I')
				time += 5;
			else if (alphabet>='J' && alphabet<='L')
				time += 6;
			else if (alphabet>='M' && alphabet<='O')
				time += 7;
			else if (alphabet>='P' && alphabet<='S')
				time += 8;
			else if (alphabet>='T' && alphabet<='V')
				time += 9;
			else if (alphabet>='W' && alphabet<='Z')
				time += 10;
		}
		
		System.out.println(time);
	}

}

 


 

풀이2 - System.in.read() 사용

더보기

BufferedReader를 사용할 필요 없이 System.in.read()를 사용해 한 글자씩 읽어들이는 방법도 있다.

  • 루프를 돌며 System.in.read()로 한 글자씩 읽어들인다.
  • 해당 값의 크기를 확인하고 맞는 시간을 계산한다.

 

코드

import java.io.IOException;

public class Main {

	public static void main(String[] args) throws IOException {
		int alphabet;
		int count = 0;
		
		while ((alphabet = System.in.read()) != '\n') {
			switch (alphabet) {
			case 'A':	case 'B': case 'C':
				count += 3;
				break;
			case 'D':	case 'E':	case 'F':
				count += 4; 
				break;
				
			case 'G':	case 'H':	case 'I':
				count += 5; 
				break;
				
			case 'J':	case 'K':	case 'L':
				count += 6; 
				break;
			case 'M':	case 'N':	case 'O':
				count += 7; 
				break;
                
			case 'P':	case 'Q':	case 'R':	case 'S':
				count += 8; 
				break;
                
			case 'T':	case 'U':	case 'V':
				count += 9; 
				break;
                
			case 'W':	case 'X':	case 'Y':	case 'Z':
				count += 10; 
				break;
			}
		}
		
		System.out.println(count);
	}

}

 


 

풀이3 (2025-03-09)

몇몇의 숫자를 제외하곤 기본적으로 숫자마다 3개의 문자가 할당되어 있음

  1. 각 문자를 char 값으로 받아 'A' 값을 뺀 후
  2. 그 값을 3으로 나눈 몫에 3을 더한 뒤 구해야 하는 시간에 더함
    • 3을 더하는 이유는 다이얼에서 1을 눌렀을 때 2초가 걸리므로 2를 눌렀을 때의 값을 더해주는 것
  3. 규칙이 깨지는 숫자부터는 범위를 각각 구해 알맞은 값을 더해줌

 

코드

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

public class Main {

    public static void main(String[] args) throws IOException {
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        String str = br.readLine();

        int time = 0;

        for (int i = 0; i < str.length(); i++) {
            // 한 글자씩 확인
            int tmp = str.charAt(i) - 'A';
            
            if (tmp < 15) { // A~O
                time += tmp / 3 + 3;
            } else if (tmp >= 15 && tmp <= 18) {    // PQRS
                time += 8;
            } else if (tmp >= 19 && tmp <= 21) {    // TUV
                time += 9;
            } else if (tmp >= 22 && tmp <= 25) {    // XWYZ
                time += 10;
            } else {
                time += 11;
            }
        }

        System.out.println(time);
    }

}

댓글