본문 바로가기

코딩테스트

[JAVA] 문자열

27866 문자와 문자열

import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.util.StringTokenizer;
import java.io.IOException;
//import java.io.BufferedWriter;
//import java.io.OutputStreamWriter;

import java.util.Arrays;


public class Main {
    public static void main(String[] args) throws IOException {

      BufferedReader br = new BufferedReader(new InputStreamReader(System.in));

      String a = br.readLine();
      int n = Integer.parseInt(br.readLine()) - 1;

      System.out.println(a.charAt(n));

      br.close();

    }
}

charAt() 메서드를 이용하면 문자열의 n번째 문자열을 쉽게 출력할 수 있다.

charAt()는 인덱스 0번째부터 시작하기 때문에 입력받은  -1을 저장한다.

 


2743 단어 길이 재기

import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.util.StringTokenizer;
import java.io.IOException;
//import java.io.BufferedWriter;
//import java.io.OutputStreamWriter;


public class Main {
    public static void main(String[] args) throws IOException {

      BufferedReader br = new BufferedReader(new InputStreamReader(System.in));

      String a = br.readLine();

      System.out.println(a.length());

      br.close();

    }
}

length() 메서드는 배열 뿐만 아니라 문자열의 길이도 반환해준다.

 


9086 문자열

import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.util.StringTokenizer;
import java.io.IOException;
//import java.io.BufferedWriter;
//import java.io.OutputStreamWriter;


public class Main {
    public static void main(String[] args) throws IOException {

      BufferedReader br = new BufferedReader(new InputStreamReader(System.in));

      int num = Integer.parseInt(br.readLine());

      for (int i=0; i<num; i++){
        String st = br.readLine();
        System.out.print(st.charAt(0));
        System.out.print(st.charAt(st.length()-1));
        System.out.println();
        
      }
      br.close();

    }
}

print문을 사용할 때 + 기호를 사용하면 int형으로 출력된다.

이유를 물어봤는데 char와 char의 연산은 int로 캐스팅된 후에 이루어지기 때문이라고 한다.(아스키 코드겠지?)

만약 내가 생각한대로 하나의 print 구문을 이용하고자 한다면

System.out.println(String.valueOf(st.charAt(0))+String.valueOf(st.charAt(st.length()-1));

이런식으로 쓰면 된다고 한다. 


11654 아스키 코드

scanner 혹은 bufferedreader를 이용해도 되지만 기본적인 System.in을 사용하는 것이 빠르고 쉽다.

import java.io.IOException;


public class Main {
    public static void main(String[] args) throws IOException {

      int a = System.in.read();
      System.out.print(a);

    }
}

위 방법을 쓰기 싫다면 문자/문자열을 입력받은 뒤 charAt(0)을 이용해 문자로 잘라준 후, int형 변수에 저장한다.

int형 변수에 저장하기 위해 문자에 대응하는 아스키 코드로 변환하여 알아서 저장한다.


11720 숫자의 합

StringTokenizer가 혹시 입력을 나눠받는 기준으로 ""가 가능한지 해봤는데 역시 안된다 ㅎㅎ

가장 클래식한 방법은 문자열을 입력받아서 sum += a.charAt(i)-'0'; 와 같이 각 문자를 int로 변환해주는 방식이다.

charAt는 문자의 아스키 코드를 int로 반환하므로 -'0' 혹은 -48 해주기.

import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.io.IOException;
 
public class Main {
	public static void main(String[] args) throws IOException {		
 
		BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
		br.readLine();	// N 은 쓸모가 없으므로 입력만 받는다.
		
		int sum = 0;
		
		for(byte value : br.readLine().getBytes()) {
			sum += (value - '0');	// 또는 (a-48)
		}
		
		System.out.print(sum);
		
	}
}

 

위 방식은 String 패키지에 내장된 getBytes()를 이용하는 방식이다.

getBytes()는 문자열에 대하여 하나의 Byte 배열을 반환해주는 메소드이다.

즉 readLine()으로 문자열을 입력받고, for-each문을 이용하여 배열의 각 자릿수(문자)를 하나씩 읽어와 int형으로 바꾼 뒤 합한다.

마찬가지로 int형으로 변환 시 아스키 코드값을 반환하므로 따로 처리를 해준다.

 

새롭게 for-each문을 사용했는데, 이는 배열이나 컨테이너 값에서 반복문을 처리할 때 사용하면 편리한 구문이다.

 for( 각 요소 값 : 배열이나 컨테이너 값 )
 {
     //반복 수행할 작업
 }

위와 같이 사용가능하다.

 


10809 알파벳 찾기

 

import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.util.StringTokenizer;
import java.io.IOException;
//import java.io.BufferedWriter;
//import java.io.OutputStreamWriter;


public class Main {
    public static void main(String[] args) throws IOException {

      BufferedReader br = new BufferedReader(new InputStreamReader(System.in));

      int arr[] = new int[26];

      for (int i=0;i<26;i++){
        arr[i]=-1;
      }

      String s = br.readLine();
      for(int i = 0; i < s.length(); i++){
        char ch = s.charAt(i);

        if(arr[ch - 'a'] == -1) {	
          arr[ch - 'a'] = i;
        }
      }

      for(int val : arr) {
        System.out.print(val + " ");
      }

    }
}

혹시 좀 더 쉬운 방법...알파벳 초기화라던가 index를 반환해주는 메소드가 있을까 했는데 없는듯..파이썬 그립다.

문자의 아스키 코드(인코딩 값) - 'a' or 97을 하게되면 알파벳 순서에 알맞는 숫자를 반환한다.

단, 처음 자리를 반환하므로 if문을 이용해준다.

 


2675 문자열 반복

 

import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.util.StringTokenizer;
import java.io.IOException;
//import java.io.BufferedWriter;
//import java.io.OutputStreamWriter;


public class Main {
    public static void main(String[] args) throws IOException {

      BufferedReader br = new BufferedReader(new InputStreamReader(System.in));

      int a = Integer.parseInt(br.readLine());

      for (int i=0;i<a;i++){
        StringTokenizer st = new StringTokenizer(br.readLine(), " ");
        int b = Integer.parseInt(st.nextToken());
        String s = st.nextToken();

        for (int j=0; j<s.length();j++){
          for (int k=0;k<b;k++){
            System.out.print(s.charAt(j));
          }
        }
        System.out.println();
      }

    }
}

 

약간 비효율적으로 보이지만, 최선을 다해 풀었다.

 

시간을 줄이고 싶다면 아래와 같이 출력 횟수를 간소화한다.

for (int i = 0; i < T; i++) {
 
			String[] str = br.readLine().split(" ");
 
			int R = Integer.parseInt(str[0]);
 
			for (byte val : str[1].getBytes()) {
				for (int j = 0; j < R; j++) {
					sb.append((char)val);
				}
			}
			sb.append('\n');
		}

 


1152 단어의 개수

StringTokenizer이용해서 풀기

import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.io.IOException;
import java.util.StringTokenizer;
 
public class Main {
 
	public static void main(String[] args) throws IOException {
		BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
		
		StringTokenizer st = new StringTokenizer(br.readLine()," ");
		System.out.print(st.countTokens());
	}
}

나는 처음에 String[] str = br.readLine().strip().split(" ") 을 이용해서 풀었다. 

근데 split()의 경우 공백만 입력되는 경우에도 무조건 배열을 반환하도록 되어있어서 1을 출력한다.

그래서 따로 처리를 해주거나...StringTokenizer를 이용해서 풀면된다. StringTokenizer는 문자열 분리 문자(공백)는 token에 포함하지 않는다.

 


2908 상수

 

import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.util.StringTokenizer;
import java.io.IOException;
//import java.io.BufferedWriter;
//import java.io.OutputStreamWriter;


public class Main {
  public static void main(String[] args) throws IOException {

    BufferedReader br = new BufferedReader(new InputStreamReader(System.in));

    StringTokenizer st = new StringTokenizer(br.readLine()," ");

    int A = Integer.parseInt(new StringBuilder(st.nextToken()).reverse().toString());
    int B = Integer.parseInt(new StringBuilder(st.nextToken()).reverse().toString());

    System.out.print(A > B ? A:B);

  }
}

 

StringBuilder에는 reverse()라는 문자열 뒤집기 메소드가 있어 이를 이용했다. 

문자열을 reverse()로 뒤집은 후 toString() 메소드로 문자열로 변환한다.

출력은 삼항연산자를 이용한다.

 

찾아보니 문자 하나만 입력받는 System.in.read()를 이용해 입력받을 때부터 reverse하여 저장하는 수학적인 방법도 있었다.

수학적으로 풀어내는게 더 어려운 것 같다.😂


5622 다이얼

 

public class Main {
	public static void main(String[] args) throws IOException {
    
		BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        
		String s = br.readLine();
        
		int count=0;
		int k = s.length();
        
		for(int i = 0 ; i < k ; i++) {
        
			switch(s.charAt(i)) {
			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.print(count);
	}
}

규칙이 매우 불규칙하므로 switch-case문을 이용한다.

좀 귀찮아서 다른 방법이 없을까 찾아봤는데 없더라..ㅎ


11718 그대로 출력하기

 

import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.util.StringTokenizer;
import java.io.IOException;
//import java.io.BufferedWriter;
//import java.io.OutputStreamWriter;


public class Main {
  public static void main(String[] args) throws IOException {

    BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
    String str = "";

    while ((str = br.readLine()) != null) {
        System.out.println(str);
    }

  }
}

파이썬은 try-catch를 이용했는데 자바는 따로 입력오류를 이용하지는 않는다.

BufferedReader를 이용하면 아무것도 입력이 안될때 null값이 들어으므로 이를 이용하고,

Scanner를 이용하게 된다면 hasNext() 함수를 이용해서 다음 입력값이 있는지 확인한다.


# 회고

 

System.in, Scanner, BufferedReader에 대하여 더 자세히 알고 싶다면 아래 참고

https://st-lab.tistory.com/41?category=830901

 

JAVA [자바] - 입력 뜯어보기 [Scanner, InputStream, BufferedReader]

이 글을 지금 이 시점에 써야 할까 고민을 많이 했다. 사실 자바를 그냥 다룰 줄만 아는 것에 목표를 둔다면 이 글이 무의미할 수도 있다. 그러나 자바에 대해 조금이라도 관심이 있고 더 배우고

st-lab.tistory.com

 

'코딩테스트' 카테고리의 다른 글

[JAVA] 2차원 배열  (0) 2024.01.18
[JAVA] 심화 1  (0) 2024.01.17
[JAVA] 1차원 배열  (0) 2024.01.14
[JAVA] 반복문  (1) 2024.01.13
[JAVA] 조건문  (0) 2024.01.12