백준 17413 단어 뒤집기 2 JAVA

hyeon·2022년 5월 4일
0

알고리즘 연습

목록 보기
5/23

문제 단어뒤집기 2

문제링크
구현 문자열
실버 3
문자열에서 단어만 뒤집기
조건 문자말고도 < >가 있을 수 있다.
태그는 단어가 아니다. 태그와 단어사이는 공백이 없다.

입력

문자열 S

출력

S의 단어를 뒤집어 출력

풀이

indexOf를 주로 사용했다.

indexOf

string.indexOf("찾는 값",탐색시작할인덱스값(초기값0) 숫자형으로 리턴

substring

string.substring(a,b) 인덱스 a와 b-1까지 잘라서 string형으로 리턴

변수

start 단어체크를 시작하는 string의 인덱스값
blank, opentag : 단어의 마지막 글자의 인덱스 값

풀이

  1. 첫글자가 <인지 체크한다
    => solve while에서 먼저 체크해서 <이면 그대로 >가 나올때까지 stringbuilder에 기록한다.
  2. 꺽쇠가 아니라면 빈칸이 먼저나오는지 꺽쇠가 먼저나오는지 확인한다.
  3. start부터 더 앞에있는 값까지 단어를 reverse한다.
  4. blank와 opentag가 모두 -1이면 while문 break

코드

import java.io.*;
import java.util.*;

public class 백준17413 {

	static Scanner scan=new Scanner(System.in);
	static String arr;
	static int blank,opentag;
	static StringBuilder sb=new StringBuilder();
	public static void main(String[] args) {
		// TODO Auto-generated method stub
			arr=scan.nextLine();
			solve();
			System.out.println(sb);
	}
	
	public static void solve() {
		int i=0;
		int start=0;
		int length=arr.length();
		while(start<length) {			
			//탐색 시작하는 위치의 첫글자가 태그이면 꺽쇠 닫힐때까지 기록
			if(arr.charAt(start)=='<') {
				int tagend=arr.indexOf('>',start);
				String str=arr.substring(start,tagend+1);
				sb.append(str);
				start=tagend+1;
				continue;
			}
			//태그가 아니고 글자이면
			
			blank=arr.indexOf(" ",start);		//int blank 
			opentag=arr.indexOf("<",start);
			
			if(blank==-1||opentag==-1) {
				if(blank<opentag) {
					reverse(start,opentag-1,false);
					start=opentag;
				}
				else if(blank==opentag) {	//마지막 단어
					reverse(start,length-1,false);
					break;
				}
				else {
					reverse(start,blank-1,true);
					start=blank+1;
				}
			}
			
			else {
				if(blank<opentag) {	
					reverse(start,blank-1,true);
					start=blank+1;
				}
				else if(blank>opentag) {
					reverse(start,opentag-1,false);
					start=opentag;
				}
			}
		}
	}
	
	public static void reverse(int start,int end,boolean isblank) {
		for(int i=end;i>=start;i--) {
			sb.append(arr.charAt(i));
		}
		if(isblank) {
			sb.append(' ');
		}
	}
}
profile
남기고 싶은 개발자입니다 :>

0개의 댓글