5 분 소요

백준 1152 - 단어의 개수

문제 설명

문제

영어 대소문자와 공백으로 이루어진 문자열이 주어진다. 이 문자열에는 몇 개의 단어가 있을까? 이를 구하는 프로그램을 작성하시오. 단, 한 단어가 여러 번 등장하면 등장한 횟수만큼 모두 세어야 한다.


입력

첫 줄에 영어 대소문자와 공백으로 이루어진 문자열이 주어진다. 이 문자열의 길이는 1,000,000을 넘지 않는다. 단어는 공백 한 개로 구분되며, 공백이 연속해서 나오는 경우는 없다. 또한 문자열은 공백으로 시작하거나 끝날 수 있다.


출력

첫째 줄에 단어의 개수를 출력한다.


예제 입력

The Curious Case of Benjamin Button

예제 출력

6


우선 여기서 구해야할 것은 문장에서 사용된 단어의 수이다.

그러면 Scanner혹은 BufferedRead로 입력을 받고 split 혹은 StringTokenizer를 사용해 공백을 기준으로 나누고 배열에 넣어준다.

그리고 배열의 length를 출력한다.

import java.util.Scanner;

public class Main_1152_단어의개수 {

	public static void main(String[] args) {
		Scanner sc =  new Scanner(System.in);
		String str = sc.nextLine().trim();
		sc.close();
		String[] sarr = str.split(" ");
		System.out.println(sarr.length);
	}

}
//trim 왼쪽 오른쪽에 있는 공백을 다 제거해준다.

그래서 작성한 나의 코드인데 틀렸다..

이유는 아래와 같다.

문자열이 주어질 때 공백만 주어질 수 있다.

공백만 주어진다면 trim()을 했을 때, 빈 문자열이 되고 만약 이걸 배열에 넣는다면 그 길이는 1이되어서, 단어가 존재하지 않기 때문에 0이 나와야하는데, 1이 나와버린다.

해결

import java.util.Scanner;

public class Main_1152_단어의개수 {

	public static void main(String[] args) {
		Scanner sc = new Scanner(System.in);
		String str = sc.nextLine().trim();
		sc.close();
		String[] sarr = str.split(" ");
		if (sarr[0].equals("")) {
			System.out.println(0);
		} else {
			System.out.println(sarr.length);
		}
	}

}
//trim 왼쪽 오른쪽에 있는 공백을 다 제거해준다.

중간에 str을 받을 때 trim()으로 공백을 제거해주니 0번째 인덱스의 값이 빈 문자열이 나오는 경우는 공백을 입력한 경우다.

그래서 0번이 공백이면 0을 반환하도록 했다.

백준 2908 - 상수

문제 설명

문제

상근이의 동생 상수는 수학을 정말 못한다. 상수는 숫자를 읽는데 문제가 있다. 이렇게 수학을 못하는 상수를 위해서 상근이는 수의 크기를 비교하는 문제를 내주었다. 상근이는 세 자리 수 두 개를 칠판에 써주었다. 그 다음에 크기가 큰 수를 말해보라고 했다.

상수는 수를 다른 사람과 다르게 거꾸로 읽는다. 예를 들어, 734와 893을 칠판에 적었다면, 상수는 이 수를 437과 398로 읽는다. 따라서, 상수는 두 수중 큰 수인 437을 큰 수라고 말할 것이다.

두 수가 주어졌을 때, 상수의 대답을 출력하는 프로그램을 작성하시오.


입력

첫째 줄에 상근이가 칠판에 적은 두 수 A와 B가 주어진다. 두 수는 같지 않은 세 자리 수이며, 0이 포함되어 있지 않다.


출력

첫째 줄에 상수의 대답을 출력한다.


예제 입력

734 893

예제 출력

437

해결

import java.util.Arrays;
import java.util.Scanner;

public class Main_2908_상수 {

	public static void main(String[] args) {
		// 두 수가 주어지는데 이들의 순서를 거꾸로해서 큰수 출력
		Scanner sc = new Scanner(System.in);
		String A = sc.next();
		String [] arrA = A.split(""); 
		String B = sc.next();
		String [] arrB = B.split(""); 

		A="";
		B="";
		for(int i=2; i>=0; i--){
			A +=arrA[i];
			B +=arrB[i];
		}
		int M = Math.max(Integer.parseInt(A), Integer.parseInt(B));
		System.out.println(M);
		
//		System.out.println(Arrays.toString(arrA));
//		System.out.println(Arrays.toString(arrB));
	}

}

다른 풀이

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().split(" ");
		
		br.close();
		
		int a = Integer.parseInt(new StringBuilder().append(str[0]).reverse().toString());
		int b = Integer.parseInt(new StringBuilder().append(str[1]).reverse().toString());
		
		System.out.println(a>b?a:b);
	}
}

백준 5622 - 다이얼

문제 설명

문제

상근이의 할머니는 아래 그림과 같이 오래된 다이얼 전화기를 사용한다.

img

전화를 걸고 싶은 번호가 있다면, 숫자를 하나를 누른 다음에 금속 핀이 있는 곳 까지 시계방향으로 돌려야 한다. 숫자를 하나 누르면 다이얼이 처음 위치로 돌아가고, 다음 숫자를 누르려면 다이얼을 처음 위치에서 다시 돌려야 한다.

숫자 1을 걸려면 총 2초가 필요하다. 1보다 큰 수를 거는데 걸리는 시간은 이보다 더 걸리며, 한 칸 옆에 있는 숫자를 걸기 위해선 1초씩 더 걸린다.

상근이의 할머니는 전화 번호를 각 숫자에 해당하는 문자로 외운다. 즉, 어떤 단어를 걸 때, 각 알파벳에 해당하는 숫자를 걸면 된다. 예를 들어, UNUCIC는 868242와 같다.

할머니가 외운 단어가 주어졌을 때, 이 전화를 걸기 위해서 필요한 최소 시간을 구하는 프로그램을 작성하시오.입력

첫 줄에 영어 대소문자와 공백으로 이루어진 문자열이 주어진다. 이 문자열의 길이는 1,000,000을 넘지 않는다. 단어는 공백 한 개로 구분되며, 공백이 연속해서 나오는 경우는 없다. 또한 문자열은 공백으로 시작하거나 끝날 수 있다.


출력

첫째 줄에 다이얼을 걸기 위해서 필요한 최소 시간을 출력한다.


예제 입력

WA

예제 출력

13


해결

import java.util.HashMap;
import java.util.Map;
import java.util.Scanner;

public class Main_5622_다이얼 {

	public static void main(String[] args)throws Exception {
		//숫자 1을 입력하려면 2초
		//+1 할 때마다 +1초
		Map<String, Integer> maps = new HashMap<>(); 
		Scanner sc = new Scanner(System.in);
		String str = sc.nextLine();
		String [] arr = str.split("");
 		maps.put("A", 3);
		maps.put("B", 3);
		maps.put("C", 3);
		maps.put("D", 4);
		maps.put("E", 4);
		maps.put("F", 4);
		maps.put("G", 5);
		maps.put("H", 5);
		maps.put("I", 5);
		maps.put("J", 6);
		maps.put("K", 6);
		maps.put("L", 6);
		maps.put("M", 7);
		maps.put("N", 7);
		maps.put("O", 7);
		maps.put("P", 8);
		maps.put("Q", 8);
		maps.put("R", 8);
		maps.put("S", 8);
		maps.put("T", 9);
		maps.put("U", 9);
		maps.put("V", 9);
		maps.put("W", 10);
		maps.put("X", 10);
		maps.put("Y", 10);
		maps.put("Z", 10);
		
		int sum=0;
		for(int i=0; i<str.length(); i++) {
			sum+=maps.get(arr[i]);
		}
		System.out.println(sum);
	}

}

다이얼을 어떻게 설정을 해놔야하는지 고민하다가 Map을 이용해서 설정해 놓았는데 너무 길다.. 다른 방법은 뭐가 있을까?

다른 풀이

import java.io.*;

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

        String S = br.readLine();
        int time = 0;

        for(int i = 0; i < S.length(); i++) {
            time += dial(S.charAt(i));
        }
        System.out.println(time);
    }
    public static int dial(int ASCII) {
        if(ASCII >= 'A' && ASCII <= 'C') return 3;
        else if(ASCII <= 'F') return 4;
        else if(ASCII <= 'I') return 5;
        else if(ASCII <= 'L') return 6;
        else if(ASCII <= 'O') return 7;
        else if(ASCII <= 'S') return 8;
        else if(ASCII <= 'V') return 9;
        else if(ASCII <= 'Z') return 10;

        return 0;
    }
}

아스키 코드를 통해서 푸는 방법이 있고

switch와 case를 이용해서 하는법이 있다.

import java.io.*;


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

        char[] num = br.readLine().toCharArray();
        int sec = 0;

        for (char value : num) {
            switch(value) {
                case 'A': case 'B': case 'C':
                    sec += 3;
                    break;
                case 'D': case 'E': case 'F':
                    sec += 4;
                    break;
                case 'G': case 'H': case 'I':
                    sec += 5;
                    break;
                case 'J': case 'K': case 'L':
                    sec += 6;
                    break;
                case 'M': case 'N': case 'O':
                    sec += 7;
                    break;
                case 'P': case 'Q': case 'R': case 'S':
                    sec += 8;
                    break;
                case 'T': case 'U': case 'V':
                    sec += 9;
                    break;
                case 'W': case 'X': case 'Y': case 'Z':
                    sec += 10;
                    break;

            }
        }
        System.out.println(sec);

    }
}

백준11718 - 그대로 출력하기

문제 설명

문제

입력 받은 대로 출력하는 프로그램을 작성하시오.


입력

입력이 주어진다. 입력은 최대 100줄로 이루어져 있고, 알파벳 소문자, 대문자, 공백, 숫자로만 이루어져 있다. 각 줄은 100글자를 넘지 않으며, 빈 줄은 주어지지 않는다. 또, 각 줄은 공백으로 시작하지 않고, 공백으로 끝나지 않는다.


출력

입력받은 그대로 출력한다.


예제 입력

Hello Baekjoon Online Judge

예제 출력

Hello Baekjoon Online Judge


해결

import java.util.Scanner;

public class Main_11718_그래도출력하기 {

	public static void main(String[] args) {
		// 입력받은 그대로 출력
		Scanner sc = new Scanner(System.in);
		while (sc.hasNextLine()) {
			String str = sc.nextLine();
			System.out.println(str);
		}
		sc.close();
	}
}

업데이트:

댓글남기기