[백준]단어뒤집기_9093

정원석·2024년 3월 16일

문제

문자열을 단어 단위로 배열에 저장

출력의 결과가 문자열 전체의 스펠링 순서는 변하지 않고 단어에서의 스펠링 순서가 바뀌는 것을 알 수 있다. 그러므로 단어 단위로 나누거나 띄워쓰기를 만났을 때 초기화를 시켜야 한다고 생각했다.

public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        System.out.println("문장 개수를 입력하세요:");
        int T = sc.nextInt();
        sc.nextLine();

        for (int i = 0; i < T; i++) {
            System.out.println("문장을 입력하세요:");
            String change_before = sc.nextLine();

            String[] words = change_before.split("\\s+");
            for (String word : words) {
                System.out.print(reverseString(word) + " ");
            }
            System.out.println();
        }
        sc.close();
    }

sc.nextLine(); 을 왜 써야 하는가?

int T = sc.nextInt(); 로 숫자를 읽고 줄바꿈 문자를 제거하지 않기 때문에 sc.nextLine(); 을 통해 버퍼에 남아있는 줄바꿈 문자를 읽어서 문자열을 반환하고 예기치 않은 상황을 방지한다.

문자열을 스페이스바 기준으로 분리해 단어 단위로 배열에 저장

String[] words = change_before.split("\\s+");

는 change_before 문자열에서 하나 이상의 공백문자를 기준으로 분할하여 각각의 단어로 나누고, 이를 문자열배열인 'words'에 저장한다. 예를들어 change_before이 "my name is tony"라 하면 words[0]=my, words[1]=name, words[2]=is, words[3]=tony 가 저장된다.

향상된 for문에 대하여

for (String word : words) {
                System.out.print(reverseString(word) + " ");
            }

문자열 배열인 words의 각 요소를 반복적으로 처리하는 구문이다.

  • String word : 루프의 각 반복에서 현재 요소가 저장될 변수를 선언한다. 즉, word라는 문자열 변수가 생성되는 것이다.
  • words배열의 각 요소를 순회하며 반복적으로 실행되는 루프를 나타낸다.

따라서 이 구문은 words 배열의 각 요소를 순회하며 각 요소를 순서대로 word 변수에 저장하고, 루프의 각 반복에서 변수 word를 사용하여 처리 작업을 수행한다.

단어 뒤집기 함수

public static String reverseString(String str) {
        char[] charArray = str.toCharArray(); 
        //문자열 str을 charArray배열에 문자 단위로 대입

        int left = 0;
        int right = charArray.length - 1; //문자열을 이루는 갯수 -1
        while (left < right) {
            char temp = charArray[left];
            charArray[left] = charArray[right];
            charArray[right] = temp;

            left++;
            right--;
        }
        return new String(charArray);
    }

전체 코드

import java.util.Scanner;

public class beak_9093 {
    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        System.out.println("문장 개수를 입력하세요:");
        int T = sc.nextInt();
        sc.nextLine();

        for (int i = 0; i < T; i++) {
            System.out.println("문장을 입력하세요:");
            String change_before = sc.nextLine();

            String[] words = change_before.split("\\s+");
            for (String word : words) {
                System.out.print(reverseString(word) + " ");
            }
            System.out.println();
        }
        sc.close();
    }

    public static String reverseString(String str) {
        char[] charArray = str.toCharArray(); //문자열 str을 charArray배열에 문자 단위로 대입

        int left = 0;
        int right = charArray.length - 1; //문자열을 이루는 갯수 -1
        while (left < right) {
            char temp = charArray[left];
            charArray[left] = charArray[right];
            charArray[right] = temp;

            left++;
            right--;
        }
        return new String(charArray);
    }
}

BufferedReader, BufferedWriter, StringTokenizer 변환

import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.InputStreamReader;
import java.io.OutputStreamWriter;
import java.util.StringTokenizer;
import java.io.IOException;

public class Main {
    public static void main(String[] args) throws IOException {
        // BufferedReader와 BufferedWriter 객체 생성
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(System.out));

        // 문장 개수 입력 받기
        int sentenceCount = Integer.parseInt(br.readLine());

        // 문장 개수만큼 반복하여 문장 입력받고 뒤집어 출력
        for (int i = 0; i < sentenceCount; i++) {
            // 문장 입력 받기
            String sentence = br.readLine();

            // 문장을 단어로 분리하여 뒤집고 출력
            StringTokenizer tokenizer = new StringTokenizer(sentence);
            while (tokenizer.hasMoreTokens()) {
                bw.write(reverseString(tokenizer.nextToken()));
                bw.write(" ");
            }
            bw.newLine(); // 다음 줄로 이동
        }

        // BufferedWriter 비우고 닫기
        bw.flush();
        bw.close();

        // BufferedReader 닫기
        br.close();
    }

    public static String reverseString(String str) {
        // 문자열을 문자 배열로 변환
        char[] charArray = str.toCharArray();

        // 문자 배열을 뒤집음
        int left = 0;
        int right = charArray.length - 1;
        while (left < right) {
            // 왼쪽과 오른쪽 문자를 교환
            char temp = charArray[left];
            charArray[left] = charArray[right];
            charArray[right] = temp;

            // 다음 문자로 이동
            left++;
            right--;
        }

        // 뒤집힌 문자 배열을 다시 문자열로 변환하여 반환
        return new String(charArray);
    }
}
profile
Back-End-Dev

0개의 댓글