[백준] 2675번 : 문자열 반복 - Java(자바)

이정우·2021년 9월 2일
0

백준

목록 보기
8/32

이번 문제는 반복 횟수를 셋팅으로 받으면 그만큼 문자를 반복시키는 문제였습니다.

import java.util.Scanner;
import java.util.ArrayList;

public class String_Repeat {

	public static void main(String[] args) {
		// TODO Auto-generated method stub
		Scanner sc = new Scanner(System.in);
		int test_case = sc.nextInt(); // 테스트 케이스 개수 T
		sc.nextLine(); // Line을 위한 생성자
		String test; //= sc.nextLine(); // 문자열 S
		String[] input_test = new String[test_case]; //문제에서 맨 처음에 반복 횟수만큼 입력을 한번에 줘버려서 여러번 입력받고 그 값 저장할려고 배열에 저장
		for (int k = 0; k < test_case; k++) { //문자열 S들을 테스트 케이스 개수인 T만큼 반복하며 입력받아서 배열에 저장 해줄 반복문
			test = sc.nextLine(); // 문자열 S
			input_test[k] = test; //여러 문자열들을 input_test 배열에 저장.
		}
		for (int g = 0; g < test_case; g++) {	 //테스트 케이스 개수 T만큼 반복
		int test_char = input_test[g].charAt(0) - '0';// 문자열 S에서 반복 횟수만 뽑아서 숫자로 변형
		ArrayList<Character> A_test = new ArrayList<>(); // ArrayList생성 -길이가 가변적이다.
			for (int i = 0; i < input_test[g].length() - 2; i++) { // 문자열 s에서 맨 앞 반복횟수 + 공백 한 칸 빼서 -2만큼 => 즉 순수 문자열 길이 만큼 반복 
				for (int j = 0; j < test_char; j++) { // 문자열 S의 맨 앞의 반복 횟수.
					A_test.add(input_test[g].charAt(i + 2)); // add()메서드를 사용해서 추가.
				}
			}
			for (char a : A_test) { // 향상된 for문으로 출력
				System.out.print(a);
			}System.out.println();
		}
	}
}

문제에서 제시한 변수 T라던지 S를 활용해서 설명하겠습니다.
총 테스트 케이스의 개수를 test_case에 저장 후 sc.nextLine();을 한 이유는 그 다음 input형식이 test = sc.nexLine();인데 만약 sc.nextInt()는 엔터를 인식하지 않기에 숫자 + 엔터키를 눌렀는데 그 밑에 바로 sc.nextLine()이 없다면 그 엔터가 살아서 test = sc.nextLine()으로 가서 아무것도 치지 않았는데 엔터 값이 입력되게 되버려서 넣었습니다.
그리고 input_test를 만든 이유는 문제에서 3 ABC 5/HTP 값(문자열 S)을 한번에 입력해줘가지고 저 문자열 S값들을 한번에 받아서 배열에 저장 후 하나씩 빼서 사용했습니다.
저 문장이 없다면 입력 -> 계산 후 출력 -> 입력 -> 계산 후 출력 순서라 오류가 나왔습니다.
그래서 첫 for문에서 문자열 S들을 input_test배열에 저장해주고 이 배열의 값들을 하나씩 써서 다음 중첩 for문에서 사용하였습니다. 이때

int test_char = input_test[g].charAt(0) - '0';

여기서 - '0'을 한 이유는 우변이 char형이기에 숫자로 바꾸면 아스키 코드로 나와버려서 -'0'(char형)을 해줘서 올바른 숫자형으로 바꿔줬습니다. 이게 안돼서 거의 1시간 찾은거 같네요;; 뭔가 for문을 50번씩 돌아가서 뭐지 했는데 저거였습니다. (자세한 설명 밑에 적겠습니다.)
그 후 길이가 가변적이라 길이 선언을 해주지 않아도 되는 ArrayList를 생성해서 문제에서 제시해준 횟수 만큼 값들을 추가해줬습니다. 마지막으로 향상된 for문을 통해 값을 출력받았습니다.

int test_char = input_test[g].charAt(0) - '0';

charAt을 사용하면 해당 string 타입에서 ()메소드 안에 설정한 숫자 자리에 있는 문자 하나를 가져와서 char형으로 바꿔줍니다. 위 문제에서는 저 위치에 존재하는 단어는 3 ABC 5 /HTP라고 할 때 맨 앞의 3, 5가 됩니다. 즉 3을 기준으로 보자면 int test_char = '3' - '0';이 됩니다. 만약 -'0'이 없다면 우변의 '3'은 자동 형변환을 통하여 int형으로 바뀌고 아스키 코드표를 보면 '3'은 숫자로 51입니다. 즉 int test_char = 51이 되어버립니다. 하지만 아스키 코드를 보면 모든 숫자는 +48이 된 형태이므로 -48을 해줘서 원래의 int형으로 바꿀 수 있습니다. 즉

int test_char = 51 - 48;

이러한 모양으로 되어서 저희가 원하는 3의 값을 얻을 수 있습니다. 이번에 코딩을 하다 이 부분을 놓쳐서 자꾸 반복을 51번씩 해가지고 거의 30분 ~ 1시간 찾은거 같은데 이번에 많은 공부가 되었던거 같습니다. 찾고 나니 재밌었던거 같습니다!

출처 : 백준 2675번 https://www.acmicpc.net/problem/2675

profile
프로그래밍 공부 중!

0개의 댓글