백준 야바위 대장

KIMYEONGJUN·2일 전
0
post-thumbnail

문제

내가 생각했을때 문제에서 원하는부분

첫 번째 줄에 문자열 S가 주어지고 두 번째 줄에 T가 주어진다.
문자열 S의 길이는 100보다 작거나 같은 자연수이며, 알파벳 대소문자와 하이픈(-)으로만 이루어져 있다.
T는 50보다 작거나 같은 자연수이다.
그 다음 T개의 줄에 걸쳐 A와 B가 주어진다.
A와 B는 문자열의 길이보다 작은 음이 아닌 정수이며, 문자열의 맨 처음 글자는 0번째 글자이다.

바뀐 문자열의 결과를 출력한다.

내가 이 문제를 보고 생각해본 부분

BufferedReader br = new BufferedReader(new InputStreamReader(System.in));: System.in(표준 입력, 즉 키보드 입력)으로부터 데이터를 효율적으로 읽어올 수 있도록 BufferedReader 객체를 생성한다.
초기 문자열 읽기 및 StringBuilder 생성:
String s = br.readLine();: 첫 번째 줄에 주어지는 초기 문자열 S를 읽어와 s 변수에 저장한다.
StringBuilder sb = new StringBuilder(s);: String 객체는 한 번 생성되면 변경할 수 없는(immutable) 특성을 가진다. 
하지만 이 문제에서는 문자열의 특정 문자를 여러 번 변경해야 하므로, 변경 가능한 StringBuilder 객체로 s를 변환하여 sb에 저장한다.
StringBuilder를 사용하면 문자열을 효율적으로 조작할 수 있다.
교환 횟수 T 읽기:
int t = Integer.parseInt(br.readLine());: 두 번째 줄에 주어지는 교환 횟수 T를 읽어와 정수형으로 변환하여 t 변수에 저장한다. 
Integer.parseInt() 메서드는 문자열을 정수로 변환하는 역할을 한다.
T번 반복하며 문자 교환:
for (int i = 0; i < t; i++) { ... }: t번의 교환 작업을 수행하기 위한 반복문이다.
StringTokenizer st = new StringTokenizer(br.readLine());: 각 반복마다 A와 B가 한 줄에 공백으로 구분되어 주어지므로, 해당 줄을 읽어와 StringTokenizer로 분리할 준비를 한다.
int a = Integer.parseInt(st.nextToken());: StringTokenizer에서 다음 토큰(문자열)을 가져와 A값으로 정수 변환합니다. a는 첫 번째 교환할 문자의 인덱스이다.
int b = Integer.parseInt(st.nextToken());: 마찬가지로 다음 토큰을 가져와 B값으로 정수 변환합니다. b는 두 번째 교환할 문자의 인덱스이다.
char charA = sb.charAt(a);: StringBuilder sb에서 인덱스 a에 위치한 문자를 가져와 charA 변수에 저장한다.
char charB = sb.charAt(b);: StringBuilder sb에서 인덱스 b에 위치한 문자를 가져와 charB 변수에 저장한다.
sb.setCharAt(a, charB);: StringBuilder sb의 인덱스 a 위치에 charB (원래 b 위치의 문자)를 넣어준다.
sb.setCharAt(b, charA);: StringBuilder sb의 인덱스 b 위치에 charA (원래 a 위치의 문자)를 넣어준다. 
이렇게 두 setCharAt 호출을 통해 두 문자의 위치를 서로 바꾼다.
최종 결과 출력:
System.out.println(sb.toString());: t번의 모든 교환 작업이 완료된 후, 최종적으로 StringBuilder sb에 저장된 문자열을 toString() 메서드를 사용하여 String으로 변환한 뒤 표준 출력(System.out)으로 출력한다.
br.close();: BufferedReader 사용이 끝났으므로 close() 메서드를 호출하여 열려 있던 입력 스트림을 닫고 자원을 해제한다.

코드로 구현

package baekjoon.baekjoon_30;

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

// 백준 15814번 문제
public class Main1164 {
    public static void main(String[] args) throws IOException {
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));

        // 1. 첫 번째 줄에서 문자열 S를 읽어옵니다.
        String s = br.readLine();

        // 2. 문자열 S를 효율적으로 변경하기 위해 StringBuilder로 변환합니다.
        StringBuilder sb = new StringBuilder(s);

        // 3. 두 번째 줄에서 교환 횟수 T를 읽어옵니다.
        int t = Integer.parseInt(br.readLine());

        // 4. T번만큼 반복하며 A와 B 위치의 문자를 교환합니다.
        for(int i = 0; i < t; i++) {
            // A와 B는 한 줄에 공백으로 구분되어 주어지므로 StringTokenizer를 사용합니다.
            StringTokenizer st = new StringTokenizer(br.readLine());
            int a = Integer.parseInt(st.nextToken()); // A번째 인덱스
            int b = Integer.parseInt(st.nextToken()); // B번째 인덱스

            // 두 위치의 문자를 가져옵니다.
            char charA = sb.charAt(a);
            char charB = sb.charAt(b);

            // A 위치에 B 문자를 넣고, B 위치에 A 문자를 넣어서 교환합니다.
            sb.setCharAt(a, charB);
            sb.setCharAt(b, charA);
        }

        // 5. 모든 교환이 끝난 후 최종 문자열을 출력합니다.
        System.out.println(sb.toString());
        br.close(); // BufferedReader 사용 후 닫아주는 것이 좋습니다.
    }
}

마무리

코드와 설명이 부족할수 있습니다. 코드를 보시고 문제가 있거나 코드 개선이 필요한 부분이 있다면 댓글로 말해주시면 감사한 마음으로 참고해 코드를 수정 하겠습니다.

profile
Junior backend developer

0개의 댓글