백준 풀기

백준 17413번: 단어 뒤집기 2 with Java

삼겹살파튀 2024. 7. 17. 01:47

단어 뒤집기 2

 
시간 제한메모리 제한제출정답맞힌 사람정답 비율
1 초 512 MB 33279 18733 14560 56.749%

문제

문자열 S가 주어졌을 때, 이 문자열에서 단어만 뒤집으려고 한다.

먼저, 문자열 S는 아래와과 같은 규칙을 지킨다.

  1. 알파벳 소문자('a'-'z'), 숫자('0'-'9'), 공백(' '), 특수 문자('<', '>')로만 이루어져 있다.
  2. 문자열의 시작과 끝은 공백이 아니다.
  3. '<'와 '>'가 문자열에 있는 경우 번갈아가면서 등장하며, '<'이 먼저 등장한다. 또, 두 문자의 개수는 같다.

태그는 '<'로 시작해서 '>'로 끝나는 길이가 3 이상인 부분 문자열이고, '<'와 '>' 사이에는 알파벳 소문자와 공백만 있다. 단어는 알파벳 소문자와 숫자로 이루어진 부분 문자열이고, 연속하는 두 단어는 공백 하나로 구분한다. 태그는 단어가 아니며, 태그와 단어 사이에는 공백이 없다.

입력

첫째 줄에 문자열 S가 주어진다. S의 길이는 100,000 이하이다.

출력

첫째 줄에 문자열 S의 단어를 뒤집어서 출력한다.

예제 입력 1 복사

baekjoon online judge

예제 출력 1 복사

noojkeab enilno egduj

예제 입력 2 복사

<open>tag<close>

예제 출력 2 복사

<open>gat<close>

예제 입력 3 복사

<ab cd>ef gh<ij kl>

예제 출력 3 복사

<ab cd>fe hg<ij kl>

예제 입력 4 복사

one1 two2 three3 4fourr 5five 6six

예제 출력 4 복사

1eno 2owt 3eerht rruof4 evif5 xis6

예제 입력 5 복사

<int><max>2147483647<long long><max>9223372036854775807

예제 출력 5 복사

<int><max>7463847412<long long><max>7085774586302733229

예제 입력 6 복사

<problem>17413<is hardest>problem ever<end>

예제 출력 6 복사

<problem>31471<is hardest>melborp reve<end>

예제 입력 7 복사

<   space   >space space space<    spa   c e>

예제 출력 7 복사

<   space   >ecaps ecaps ecaps<    spa   c e>

 

 

 


 

 

문제는 간단한데... ㅎㅎ

태그 <> 이거 안에 있는 단어 빼고 나머지 단어만 뒤집으라는 거 아녀

근데 어케해야하지

 

어떡하지 하다가 나온 1차 코드(1도 안 돌아감)

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
public class BJ_17413 {
	public static void main(String[] args) throws IOException {
		BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
		
        String s = br.readLine();
    
		char[] sArray = s.toCharArray();
		char[] backS = new char[sArray.length];
		
		for (int i = 0; i < sArray.length; i++) {
			if (sArray[sArray.length - i - 1] == '>') {
				int tagIndex = 0;
				for (int j = i; j >= 0; j--) {
					if (sArray[j] == '<') {
						tagIndex = j;
						break;
					}
				}
				
				int newIndex = i;
				for (int j = tagIndex; j <= i; j++) {
					backS[newIndex++] = sArray[j];
				}
			}
			else {
				backS[i] = sArray[sArray.length - i - 1];
			}
		}
	}
}

진심 아예 돌아가지도 않음ㅎ

뭐 어쩌란 말이냐~

 

일단 돌아가지도 않는 김에 StringBuilder 사용법이나 찾아봄

append로 뒤에 붙이고 앞에 붙일라면 insert(0, 붙일 거); 이렇게 하면 된다는데..??

근데 짜다 보니까 태그 뒤에 붙여야 한다는 사실.... 맨 앞에 붙이면 안 된다고....

보다 보니까 띄어쓰기도 ... 

 

 

수정해봤다

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
public class BJ_17413 {
	public static void main(String[] args) throws IOException {
		BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
		
        String s = br.readLine();	// 문자열 s 입력받음
        
        StringBuilder result = new StringBuilder();	// 결과 담음
        StringBuilder tmp = new StringBuilder();	// 임시로 담음
        boolean isTag = false;	// 태그 안인지 확인
        
        // 원본 문자열 s array로 바꿔서 순회
        for (char word : s.toCharArray()) {
        	if (word == '<') {
        		result.append(tmp.reverse());
        		tmp.setLength(0);
        		tmp.append(word);
        		isTag = true;
        	}
        	else if (word == '>') {
        		tmp.append(word);
        		result.append(tmp);
        		tmp.setLength(0);
        		isTag = false;
        	}
        	else if (word == ' ' && !isTag) {
        		result.append(tmp.reverse());
        		result.append(word);
        		tmp.setLength(0);
        	}
        	else {
        		tmp.append(word);
        	}
        	
        	result.append(tmp.reverse());
        }
        
        System.out.println(result.toString());

	}
}

 

근데 사실 이것두 안 돌아간다 

입력 abcde
출력 abacabdbacecabd

겁내 어이없는 출력;;;;;; 

 

... 근데 넘 졸려서 일단 씻고 자야겠다. 

 

아 어이없는 점 잘라고 했는데 보다가 찾았다.

 

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
public class BJ_17413 {
	public static void main(String[] args) throws IOException {
		BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
		
        String s = br.readLine();	// 문자열 s 입력받음
        
        StringBuilder result = new StringBuilder();	// 결과 담음
        StringBuilder tmp = new StringBuilder();	// 임시로 담음
        boolean isTag = false;	// 태그 안인지 확인
        
        // 원본 문자열 s array로 바꿔서 순회
        for (char word : s.toCharArray()) {
        	// 태그 시작하면
        	if (word == '<') {
        		result.append(tmp.reverse());	// 임시로 담아놨던 단어들 뒤집어서 결과에 담음
        		tmp.setLength(0);	// 결과에 담았으니까 임시 데이터 지워버림
        		tmp.append(word);	// 임시 데이터에 추가
        		isTag = true;	// 태그 안인지 확인하는 boolean true로 설정
        	}
        	// 태그 끝나면
        	else if (word == '>') {
        		tmp.append(word);	// 태그도 tmp에 넣어주기
        		result.append(tmp);	// 결과에 담기
        		tmp.setLength(0);	// tmp 지우기
        		isTag = false;	// isTage false로 바꿈
        	}
        	// 태그 밖이고 공백 나왔을 때
        	else if (word == ' ' && !isTag) {
        		result.append(tmp.reverse());	// tmp 뒤집어서 result에 더해줌
        		result.append(word);	// 그 담에 공백 넣어주기
        		tmp.setLength(0);	// tmp 지우기
        	}
        	else {
        		tmp.append(word);	// 것도 아니면 tmp에 word 더해주기
        	}
        }
    	result.append(tmp.reverse());	// 마지막에 안 더해진 거 더해주기
     
        System.out.println(result.toString());
	}
}

 

맨 마지막에 안 더해진 거 더해주는 코드를 for문 안에 넣었다.. 그래서 저런 괴상한 결과가 나온 것 ㅎ;;;

 

돌리니까

 

예~~~~~~~~~~~~~~

맞았돠