Hope Everyone Is Happy

[실버3] 17413. 단어 뒤집기2 (Java) 본문

※ 백준 (Baekjoon)/[Java] 문제 풀이 ( Solve the problems)

[실버3] 17413. 단어 뒤집기2 (Java)

J 크 2023. 7. 26. 16:07
728x90
반응형

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

 

17413번: 단어 뒤집기 2

문자열 S가 주어졌을 때, 이 문자열에서 단어만 뒤집으려고 한다. 먼저, 문자열 S는 아래와과 같은 규칙을 지킨다. 알파벳 소문자('a'-'z'), 숫자('0'-'9'), 공백(' '), 특수 문자('<', '>')로만 이루어져

www.acmicpc.net

 이번 문제는 백준에서 풀었던 문제 중엔 친절하게 설명해준 문제 같습니다. 진짜 몇몇 문제는 문제가 뭐라는지를 모르겠어서 어려웠던 적이 많아서.. (비록 영어지만 릿코드가 훨씬 낫다고 생각)


 해당 문제는 말 그대로 문자열을 한 줄로 입력 받아 공백으로 단어를 구분하여 단어끼리 문자를 뒤집어 출력하는 문제입니다. 추가로 '<' 열고 '>'로 닫으면 태그라고 용어를 붙여 <> 안의 단어들은 뒤집지 않으며 입력 받는 문자열은 'a'~'z', 숫자 '0'~'9', 공백(' '), 태그 (<, >) 로만 구성되있습니다. ( 입력된 문자열의 최대 길이 : 100,000)

Example :

◈ Input - 1

baekjoon online judge

◈ Output - 1

noojkeab enilno egduj

◈ Input - 2

<open>tag<close>

◈ Output - 2

<open>gat<close>

◈ Input - 3

<ab cd>ef gh<ij kl>

◈ Output - 3

<ab cd>fe hg<ij kl>

◈ Input - 4

one1 two2 three3 4fourr 5five 6six

◈ Output - 4

1eno 2owt 3eerht rruof4 evif5 xis6

 Java String의 .CharAt(i)를 활용하여 문자를 탐색, char 형태의 배열을 만들어 buffer의 역할로 활용, <>가 존재하지 않을 시 buffer에 저장해놓은 뒤, 공백이나 <>를 만나면 거꾸로 출력될 수 있도록 구성을 하였습니다.

코드 작성 전, 아래와 같이 솔루션을 정리하였습니다.

▶ '<' 발견시 bNonReverse를 true 로 변환, 이후 들어오는 문자들은 '>' 발견 전까지 차례대로 출력 

▶ 공백이나 태그 발견 전 까지는 chBuffer에 문자들을 차례대로 저장하여, 공백이나 태그 발견 시 거꾸로 출력.

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 strTemp = br.readLine();
        
		// reverse할 문자 버퍼.
		char[] chBuffer = new char[100000]; 	
        
		// 태그 유무 표시
		boolean bNonReverse = false; 	
        
		// reverse 할 문자 버퍼 갯수.
		int nIndex =0; 										
		
		for(int i = 0; i < strTemp.length(); i++) {
        			// 태그 발견
			if(strTemp.charAt(i) == '<') {					
				bNonReverse = true;
                		// 버퍼에 데이터가 있으면
				if(nIndex > 0) {
                			// 버퍼에 쌓인 문자열 출력
					for(int j = nIndex-1; j >= 0; j--) 		
						System.out.print(chBuffer[j]);
					nIndex=0;
				}
				System.out.print(strTemp.charAt(i));
			} else if(strTemp.charAt(i) == '>') {
            			// 태그 끝 
				System.out.print(strTemp.charAt(i));
				bNonReverse = false;
			} else if(bNonReverse) {
            			// 태그 안
				System.out.print(strTemp.charAt(i));
			} else if(strTemp.charAt(i) == ' ') {
            			// 공백 발생 시.
				if(nIndex > 0) {
                		// 버퍼에 쌓인 문자열 출력
					for(int j = nIndex-1; j >= 0; j--) 		
						System.out.print(chBuffer[j]);
					System.out.print(strTemp.charAt(i));
					nIndex = 0;
				}
			} else {
            			// 버퍼 쌓기
				chBuffer[nIndex++] = strTemp.charAt(i);		
			}
		}
		
		if(nIndex > 0) { 
        			// 버퍼에 남은 데이터가 있으면 버퍼에 쌓인 문자열 출력
			for(int j = nIndex-1; j >= 0; j--) 				 
				System.out.print(chBuffer[j]);
		}
	}
}

 가독성을 올리려고 주석을 작성했는데 복붙하니까 이상하게 나오네요 ㅠㅠ

긴 글 읽어주셔서 감사합니다!

Good Luck! (피드백 고맙습니다)