본문 바로가기
백준

[백준] 알고리즘 분류(문자열,JAVA)17413번, 단어 뒤집기 2

by 열정적인 이찬형 2022. 9. 19.

문제 링크

 

17413번: 단어 뒤집기 2

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

www.acmicpc.net


주의사항

  • JAVA를 사용하여 프로그램을 사용하였습니다.
  • 백준에서 코드를 작성하였을 때 아래 형태에서 Main에서 결과가 출력되어야 합니다.
public class Main{ 	
	public static void main(String[] args){
    }
}

문제 설명


접근 방법

이 문제에 핵심

 

1. 입력되는 문자열은 알파벳 소문자, 숫자, 공백, 특수문자(<, >)로만 이루어져있습니다.

2. 문자열의 단어들을 조건에 맞게 뒤집은 결과를 출력합니다.

3. <, >으로 둘러싼 단어는 뒤집기를 진행하지 않습니다.

 

알고리즘 진행 순서.

 

1. 입력된 문자열을 저장합니다.

 

2. 조건에 맞게 단어들을 뒤집기를 진행합니다.

 

3. 뒤집기가 종료된 문자열을 결과로 출력합니다.

 

뒤집기

 

단어에 대한 순서를 반대로 바꾸는 것입니다.

단어에 정보를 StringBuilder에 저장하여 reverse()라는 Method를 사용하여 뒤집도록 하였습니다.

 

※문제에 조건에서는 <, >로 덮인 단어는 뒤집기를 진행하지 않습니다.

 

단어 : abc

뒤집기 : cba

 

예제입력 3.

 

1. 입력된 문자열을 저장합니다.

 

<ab cd>ef gh <ij jk>

 

2. 조건에 맞게 단어들을 뒤집기를 진행합니다.

 

<ab cd>ef gh <ij jk>

 

단어 : <ab cd>, ef, gh, <ij jk>

 

뒤집기 진행

 

<ab cd> : <, > 덮인 단어로 뒤집기 X

ef : fe

gh : hg

<ij jk> : <, > 덮인 단어로 뒤집기 X

 

단어 합치기

 

<ab cd>ef hg<ij jk>

 

3. 뒤집기가 종료된 문자열을 결과로 출력합니다.

 

<ab cd>ef hg<ij jk>을 결과로 출력합니다.

 

 

  • BufferedReader를 사용하여 입력되는 문자열을 저장합니다.
  • for문을 통해서 각 단어들이 덮인 단어, 일반 단어로 구분하여 뒤집기를 진행하였습니다.
  • 모든 뒤집기가 종료된 후에 문자열을 BufferedWriter 저장하였습니다.
  • BufferedWriter에 저장된 결과값을 출력하였습니다.

 

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

public class Main {
    public static void main(String[] args) throws IOException {
        //입력값 처리하는 BufferedReader
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        //결과값 출력하는 BufferedWriter
        BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(System.out));
        String input = br.readLine();	//입력되는 문자열 저장
        boolean check = false;		//<, > 에 덮인 단어인지 확인하는 변수
        StringBuilder sb = new StringBuilder();		//뒤집기를 진행한 문자열 저장
        StringBuilder temp = new StringBuilder();	//현재 단어 저장
        //문자열 각 글자 탐색!
        for(int i=0;i<input.length();i++){
            char c = input.charAt(i);
            if(c=='<'){		//'<'일 경우 덮인 단어로 진행
                check = true;	//덮인 단어 확인
                sb.append(temp.reverse());	//이전 단어 뒤집기 진행
                sb.append(c);	//'<' 추가
                temp = new StringBuilder();	//현재 단어 초기화
            }else if(c=='>'){		//'>' 덮인 단어 종료시
                check = false;		//덮인 단어 취소
                sb.append(temp).append(c);	//덮인 단어 추가
                temp = new StringBuilder();		//현재 단어 초기화
            }else if(c==' '){
                if(check)	//덮인 단어 안에 ' '인 경우
                    temp.append(c);
                else{		//덮인 단어가 아닌 ' '인 경우
                    sb.append(temp.reverse()).append(c);	//이전 단어 뒤집기 진행
                    temp = new StringBuilder();	//현재 단어 초기화
                }
            }else
                temp.append(c);		//현재 단어의 글자 추가
        }
        if(!temp.equals(""))		//마지막 단어가 남은 경우
            sb.append(temp.reverse());
        bw.write(sb.toString());		//뒤집은 문자열 BufferedWriter 저장
        bw.flush();		//결과 출력
        bw.close();
        br.close();
    }
}

댓글