티스토리 뷰

[BJ] 17413. 단어 뒤집기2

www.acmicpc.net/problem/17413

 

17413번: 단어 뒤집기 2

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

www.acmicpc.net

 

1. StringBuilder의 메소드 이용

- charAt(idx), substring(start, end), reverse(), replace(start, end, newStr)

import java.io.*;
import java.util.*;
// 210226
// https://www.acmicpc.net/problem/17413

public class Main_BJ_17413_단어뒤집기2_2 {

	public static void main(String[] args) {
		Scanner sc = new Scanner(System.in);
		StringBuilder sb = new StringBuilder();
		sb.append(sc.nextLine());
		
		for(int i=0; i<sb.length(); i++) {
			if(sb.charAt(i)==' ') continue;
			
			if(sb.charAt(i)=='<') {
				for(int j=i+1; j<sb.length(); j++) {
					if(sb.charAt(j)=='>') {
						i=j; break;
					}
				}
			} else { // 문자는 뒤집는다.
				for(int j=i+1; j<sb.length(); j++) {
					if(sb.charAt(j)=='<' || sb.charAt(j)==' ' || j==sb.length()-1) {
						if(j==sb.length()-1) ++j;
						StringBuilder origin = new StringBuilder();
						origin.append(sb.substring(i, j));
						origin.reverse();
						sb.replace(i, j, origin.toString());
						i=(j-1); break; 
						// substring(i, j)과 replace(i, j, str) 모두 i<= x <j인 범위에서 메소드를 수행하지만
						// for을 돌 때 마다 i++되기 때문에, i가 두번 커지지 않도록 i를 j-1로 만들어야 한다.
						// 즉, i의 위치를 검사할 다음 위치 이전으로 만든다.
					}
				}
			}
		} // for
		
		System.out.println(sb.toString());
		
		sc.close();
	} // 
}

 

2. swap() 함수 구현 후 이용

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

// 210214

public class Main_BJ_17413_단어뒤집기2 {
	static char[] arr;
	
	static void swap(int i, int j) {
		char tmp = arr[i];
		arr[i] = arr[j];
		arr[j] = tmp;
	}
	
	public static void main(String[] args) throws Exception {
		BufferedReader br = new BufferedReader(new InputStreamReader(System.in));

		arr = br.readLine().toCharArray();
		
		for(int i=0; i<arr.length; i++) {
			
			if (arr[i] == ' ') continue; 
			
			if (arr[i] =='<') {
				int j = i+1;
				for(; j<arr.length;j++) {
					if (arr[j]=='>') break;
				}
				i = j;
			} else {
				int j = i+1;
				for(; j<arr.length;j++) {
					if (arr[j]==' ' || arr[j]=='<') break;
				}
				j-=1;
				for(int k=0; k<=(j-i)/2; k++) {
					swap(i+k, j-k);
				}
				i = j;
			}
		}
		StringBuilder sb = new StringBuilder();
		for(int i=0; i<arr.length;i++) sb.append(arr[i]);
		System.out.println(sb.toString());
		br.close();
	}
}

'코딩테스트 > 백준' 카테고리의 다른 글

[BJ] 9663. N-Queen  (0) 2021.03.02
[BJ] 8320. 직사각형을 만드는 방법  (0) 2021.02.26
[BJ] 1244. 스위치 켜고 끄기  (0) 2021.02.26
[BJ] 10158. 개미  (0) 2021.02.25
[BJ] 13300번: 방 배정  (0) 2021.02.22
댓글
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
«   2024/11   »
1 2
3 4 5 6 7 8 9
10 11 12 13 14 15 16
17 18 19 20 21 22 23
24 25 26 27 28 29 30
글 보관함