본문 바로가기
Algorithm/백준 단계별 문제

[백준] 7. String 문자열 - Java 코드

https://www.acmicpc.net/step/7

 

문자열 단계

정수를 문자열로 입력받는 문제. Python처럼 정수 크기에 제한이 없다면 상관 없으나, 예제 3은 일반적인 정수 자료형에 담기에 너무 크다는 점에 주목합시다.

www.acmicpc.net

 

개별문제 리뷰전에 코드모음부터 올리겠습니다.

package 기초문법;
import java.util.Scanner;

public class _08string {

	public static void main(String[] args) { // main이라는 클래스가 예약어임 Main 아님
		ex11654();
	}
	
	// char 입력받기
    public static void ex11654() {
    	Scanner sc = new Scanner(System.in);
		int n = sc.next().charAt(0);	//a=97 , A=65
		System.out.println(n);		
		sc.close();
    }
    
    // char -> int 변환후 연산
    public static void ex11720() {
    	Scanner sc = new Scanner(System.in);
		int n = sc.nextInt();
		String str = sc.next();
		int res=0;
		for(int i=0; i < n; i++) {
			// char -> int 방법 2가지
//			res += Character.getNumericValue(str.charAt(i));
			res += str.charAt(i) - '0';
		}
		System.out.println(res);		
		sc.close();
    }
    
    public static void ex10809() {
    	Scanner sc = new Scanner(System.in);
		String str = sc.next();
		int[] alpha = new int[26];
		int tmp;
		// -1로 초기화
		for(int i=0; i<26;i++) {
			alpha[i]=-1;
		}

		for(int i=0; i<str.length(); i++) {
			tmp = str.charAt(i) - 97;
			if(alpha[tmp]==-1)	// -1일떄만 수정
				alpha[tmp] = i;
		}
		for(int i=0;i<alpha.length;i++)
			System.out.print(alpha[i]+" ");		
		sc.close();
    }
    
    public static void ex2575() {
    	Scanner sc = new Scanner(System.in);
    	int n = sc.nextInt();
    	int a;
    	String str,res;
    	for(int i=0;i<n;i++) {
    		a= sc.nextInt();
    		str = sc.next();    		
    		res="";
    		for(int j=0;j<str.length();j++) {
    			for(int k=0; k<a;k++) {
    				res+=str.charAt(j);
    			}
    		}
    		System.out.println(res);
    	}
		sc.close();
    }
    
    // 조금 어려웠음, 해쉬맵쓰려고 하다가.. ㅠ
    public static void ex1157() {
    	Scanner sc = new Scanner(System.in);
    	String str = sc.next().toUpperCase();
    	int [] cnt = new int[26];
    	int max=0;
    	char result='?';
    	for(int i=0;i<str.length();i++) {
    		cnt[str.charAt(i)-65]++;
    		if(max < cnt[str.charAt(i)-65]) {
    			max = cnt[str.charAt(i)-65];
    			result = str.charAt(i);
    		}
    		else if(max == cnt[str.charAt(i)-65])
    			result ='?';
    	}
    	System.out.println(result);

		sc.close();
    }
    
    public static void ex1152() {
    	Scanner sc = new Scanner(System.in);
		String input = sc.nextLine().trim();
    	sc.close();

		if (input.isEmpty()) {		// 0을 생각해야 한다. 예외처리는 필수다
			System.out.println(0);
		} 
		else {
	    	String a[] = input.split(" ");
	        System.out.println(a.length);
		}
    	
    }
    
    public static void ex1152(String[] args) {
    	Scanner sc = new Scanner(System.in);
		int a = sc.nextInt();
		int b = sc.nextInt();
		a = reverse(a);
		b = reverse(b);
		System.out.println(a>b?a:b);
    }
    public static int reverse(int a) {
    	String out = "";
    	while(a>0) {
    		out+=a%10;
    		a/=10;
    	}
    	// String -> int 기억하기!
    	return Integer.parseInt(out);
    }
}

 

-

 

 

String class 에 메소드 잘 알고 계셔애합니다.

자바는 임포트하지않아도 java.lang 패키지가 자동으로 포함되는데,

lang에 obkect 클래스에 메소드를 알아둘 필요가있다.

우리가 다룰 String은 java.lang.Object 에 속해있으며, 자동으로 임포트된다. 꼭 기억하자.

String class에 메소드를 잠깐 정리하자.

String a = "aaa"; // 초기화

String a += "bbb // a = aaabbb가 되는 것이 아니라 새롭게 생성한다. 

                       // String 타입을 비교할때 == 연산자를 쓰지 않고 .equals()를 쓰는 이유가 그것이다.

.length() : 길이를 int형으로 반환

.isEmpty() : 변수가 비었는지아닌지 bool값 반환

.indexOf("문자,문자열") : 해당문자,문자열의 시작번호를 알려줌

.substring( 시작숫자, 마지막숫자 ): 문자열 슬라이싱

.replaceAll( " 정규표현식 ", "변경할 문자 ") : 찾아서 모두 변경 

.toUpperCase()

.toLowerCase()

.trim() 앞뒤 공백제거 (유용하게 쓰임)

.charAt( 숫자 ) : 해당위치에 문자한개를 char로 반환

.valueOf(  ) : toString()과 같지 않냐고 하겠지만, valueOf()는 nullPointer 오류가 없다. 모두 인자로 받을 수 있다.

.toCharArray() : STring에 문자하나씩 배열로 변경해줌

.split("나눌 문자")  : 문자열을 파라미터 기준으로 찢어 배열로반환.

 

문자열에쓰이는 기본적이면서 꼭 사용하며 알아야하는 메소드입니다.

 

형변환

# CHAR -> INT

String str = "123";

res += Character.getNumericValue(str.charAt(i)); 

res += str.charAt(i) - '0';

# String -> int 

int a;
String b="abc";
a = Integer.parseInt(b);

 

 

+

 

 

# 1152 단어의 개수

public static void ex1152() {
    	Scanner sc = new Scanner(System.in);
		String input = sc.nextLine().trim();
    	sc.close();

		if (input.isEmpty()) {		// 0을 생각해야 한다. 예외처리는 필수다
			System.out.println(0);
		} 
		else {
	    	String a[] = input.split(" ");
	        System.out.println(a.length);
		}
    	
    }

 

꼭 예외사항을 생각하자.

0일떄를 잘 처리해주어야한다.

split은 위에서 언급한 중요 메소드중 하나이니 기억해야합니다.

 

 

 

# 2908 상수

 

거꾸로 뒤집어 주기 위해서는

int형으로 받아서 문자열에 붙이는 방식으로 이어 붙이면 편할것이다.

다시 비교연산을 위해서는 String to int 형변환이 필요하고,.

Integer.parseInt(다른형식-문자열)

public static void main(String[] args) {
    	Scanner sc = new Scanner(System.in);
		int a = sc.nextInt();
		int b = sc.nextInt();
		a = reverse(a);
		b = reverse(b);
		System.out.println(a>b?a:b);
    }
    public static int reverse(int a) {
    	String out = "";
    	while(a>0) {
    		out+=a%10;
    		a/=10;
    	}
    	// String -> int 기억하기!
    	return Integer.parseInt(out);
    }

 요렇게 풀어주면 되겠다.

 

-----------------------------------------------------------------------------------------------------------------------------------

지급부터는 난이도 있는 문제들에 대해 리뷰하겠슴다

-----------------------------------------------------------------------------------------------------------------------------------

# 다이얼 5622

import java.util.Scanner;
public class Main {
       public static void main(String[] args) {
             Scanner sc = new Scanner(System.in);
             String input = sc.nextLine();
             char arr[] = input.toCharArray();
             
             int sum=0;
             for(char i : arr)
             {
                    sum += Dial(i) + 1;
             }
             System.out.println(sum);
       }
       
       public static int Dial(char input)
       {
             switch (input)
             {
             case 'A':case 'B':case 'C':
                    return 2;
             case 'D':case 'E':case 'F':
                    return 3;
             case 'G':case 'H':case 'I':
                    return 4;
             case 'J':case 'K':case 'L':
                    return 5;
             case 'M':case 'N':case 'O':
                    return 6;
             case 'P':case 'Q':case 'R':case 'S':
                    return 7;
             case 'T':case 'U':case 'V':
                    return 8;
             case 'W':case 'X':case 'Y':case 'Z':
                    return 9;
             default:
                    return -1;
             }
       
       }
}

switch case로 풀면 쉽다.

 if else로 풀어줘도 문제없다.

하지만, 나의 첫번째 풀이.

package 기초문법;

import java.util.*;
public class Main{
    public static void main(String[] args) {
    	Scanner sc = new Scanner(System.in);
		String str = sc.nextLine();
		int num = changeNumber(str);
		int res=0;
//		System.out.println(num);
		while(num>0) {
			res+=num%10+1;
			num/=10;
		}
		System.out.println(res);
    }
    
    public static int changeNumber(String str) {
    	String out = "";
    	for(int i=0;i<str.length();i++) {
        	if(str.charAt(i)>=65 && str.charAt(i)<=67)
        		out+=2;
        	else if(str.charAt(i)>=68 && str.charAt(i)<=70)
        		out+=3;
        	else if(str.charAt(i)>=71 && str.charAt(i)<=73)
        		out+=4;
        	else if(str.charAt(i)>=74 && str.charAt(i)<=76)
        		out+=5;
        	else if(str.charAt(i)>=77 && str.charAt(i)<=79)
        		out+=6;
        	else if(str.charAt(i)>=80 && str.charAt(i)<=82)
        		out+=7;
        	else if(str.charAt(i)>=83 && str.charAt(i)<=85)
        		out+=8;
        	else if(str.charAt(i)>=86 && str.charAt(i)<=88)
        		out+=9;
    	}
    	return Integer.parseInt(out);
    }
    
  
}

문제는      return Integer.parseInt(out);  과정에서

NumberFormatException.forInputString 에러가 발생했다.

입력값이 길때 나는걸로 보아, 오버플로문제가 아닌가 싶다.

 

import java.util.*;
public class Main{
    public static void main(String[] args) {
    	Scanner sc = new Scanner(System.in);
		String str = sc.next().toUpperCase();
		int num=0;
		for(int i=0;i<str.length();i++) 
			num += changeNumber(str.charAt(i))+1;
		System.out.println(num);
    }
    
    public static int changeNumber(char i) {
    	if(i>=65 && i<=67)
    		return 2;
    	else if(i>=68 && i<=70)
    		return 3;
    	else if(i>=71 && i<=73)
    		return 4;
    	else if(i>=74 && i<=76)
    		return 5;
    	else if(i>=77 && i<=79)
    		return 6;
    	else if(i>=80 && i<=83)
    		return 7;
    	else if(i>=84 && i<=86)
    		return 8;
    	else if(i>=87 && i<=90)
    		return 9;
    	else
    		return -1;
    }
    
}

 요렇게 바꿔서 바로 해결!

 

 

 

# 2941 크로아티아 알파벳

 

고민해보시고 정답을 보시기 바랍니다.

 

 

 

 

초간단 심플 정답 코드

import java.util.*;
public class Main{
	public static void main(String[] args) {
		Scanner sc = new Scanner(System.in);
		String croAlpha = sc.next();
		String[] word = {"c=","c-","dz=","d-","lj","nj","s=","z="};
		for(int i=0;i<word.length;i++) {
			if(croAlpha.contains(word[i])) {
				croAlpha = croAlpha.replaceAll(word[i], "*");
			}
		}
		System.out.println(croAlpha.length());
	}
}

바꿔야하는 문자를 배열로 입력하고

포합되는지 contains를 통해 검사하고

replaceAll을 통해 *로 변환시켜

길이를 구하면, 알파벳의 개수를 쉽게 구할수있습니다.

 

 

저는 이런 방법을 모르고, 뱅뱅 몇시간 돌았네요ㅠㅠ 풀이는 지저분하여 생략.

if switch.... 이 문제는 머릿속에 꼭 저장!

 

# 1316 그룹단어 체커

 

그룹단어가 무엇인지 이해하셨나요?

단어안에서 이미 출현한 알파벳이 뒤에 다시출현한다면,

그룹단어가 아니며, 새로운알파벳만 계속적으로 출현하는 경우 그룹단어로 인정합니다.

설명이 뭐같아서 부연설명을 붙였습니다.

 

그럼 풀어봅시다.

 

import java.util.*;
public class Main{
	public static void main(String[] args) {
		Scanner sc = new Scanner(System.in);
		int n = sc.nextInt();
		int res = n;
		boolean[] flag = new boolean[26];
		for(int i=0; i<n; i++) {
			String str = sc.next();	
			Arrays.fill(flag, false);
			flag[str.charAt(0)-97]=true;
			for(int j=1;j<str.length();j++) {
				if(str.charAt(j-1)!=str.charAt(j)) {
					if(flag[str.charAt(j)-97]==false)
						flag[str.charAt(j)-97]=true;
					else {
						res--;
						break;
					}
				}
			}
		}
		System.out.println(res);
	}
}

 

어려웠습니다. 다른분의 풀이를 참고했는데요,

알파벳 중복을 검사하기위한 flag 배열을 선언해주고,

단어검사를 시작할때마다 arrays.fill을 이용하여 false로 초기화해주었습니다.

이미나왔던 알파벳이 다시나오는 경우 for문을 바로 종료하고 값을 차감했는데요,

메모리와 런타임측면에서 좋은 코딩이지만

나중에 다른방식으로 더 풀어보고 싶은 문제입니다.

오늘은 새벽이 깊어 그만 자려합니다.