์ž๋ฐ”(Java) ์•Œ๊ณ ๋ฆฌ์ฆ˜ ๋ฌธ์ œํ’€์ด ์ž…๋ฌธ 1-2. ๋Œ€์†Œ๋ฌธ์ž ๋ณ€ํ™˜. #StringBuilder

2024. 7. 4. 11:20ใ†๐ŸŒŠ์•Œ๊ณ ๋ฆฌ์ฆ˜ ํ”ผ๋“œ๋ฐฑ/์ฝ”ํ…Œ ๊ด€๋ จ ๊ฐ•์ขŒ

 

 

 

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

class Main {
    public void solution() throws Exception{
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        String str = br.readLine();
        String lowerCase = str.toLowerCase();
        String upperCase = str.toUpperCase();
        for(int i=0; i<str.length(); i++){
            if(str.charAt(i)==lowerCase.charAt(i)){
                str.charAt(i) = upperCase.charAt(i);   //์ฝ”๋“œ ์—๋Ÿฌ
            }else{
                str.charAt(i) = lowerCase.charAt(i);   //์ฝ”๋“œ ์—๋Ÿฌ
            }
        }
        System.out.println(str);
    }
    public static void main(String[] args) throws Exception{
        new Main().solution();
    }
}

 

[ charAt() ์ด๋ž€? ]

์ฝ”๋“œ์—์„œ ์‚ฌ์šฉํ•œ BufferedReader ๋Š” ๊ฐœํ–‰๋ฌธ์ž๋งŒ ๊ฒฝ๊ณ„๋กœ ์ธ์‹ํ•˜๊ณ , ์ž…๋ ฅ๋ฐ›์€ ๋ฐ์ดํ„ฐ๊ฐ€ String์œผ๋กœ ๊ณ ์ •๋œ๋‹ค

-> charํƒ€์ž…์„ ์‚ฌ์šฉํ•  ์ˆ˜ ์—†๋Š” ๋ฌธ์ œ

charํƒ€์ž…์€ ํ•œ ๊ธ€์ž๋งŒ ์ €์žฅํ•  ์ˆ˜ ์žˆ๋Š” ๋ณ€์ˆ˜์ธ๋ฐ, BufferedReader๋กœ ์ž…๋ ฅ ๋ฐ›์„ ๋•๋А Stringํƒ€์ž…์œผ๋กœ๋ฐ–์— ๋ฐ›์„ ์ˆ˜ ์—†๋‹ค

 

  • ๋ฌธ์ž์—ด.charAt(์ธ๋ฑ์Šค)  : String์œผ๋กœ ์ €์žฅ๋œ ๋ฌธ์ž์—ด ์ค‘์—์„œ ํ•œ ๊ธ€์ž๋งŒ ์„ ํƒํ•ด์„œ charํƒ€์ž…์œผ๋กœ ๋ณ€ํ™˜ํ•ด์ค€๋‹ค!

Stringํƒ€์ž…์˜ ์ฐธ์กฐ๋ณ€์ˆ˜ ๋’ค์— ๋ถ™์—ฌ์„œ ์‚ฌ์šฉํ•˜๊ฑฐ๋‚˜, 

br.readLine().charAt(0) ์™€ ๊ฐ™์€ ์‹์œผ๋กœ ์ž…๋ ฅ๋ฐ›๋Š” ๊ณณ์— ๋ฐ”๋กœ ๋ถ™์—ฌ์„œ๋„ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋‹ค.

 

 

[StringBuilder ๋ž€?]

์ž๋ฐ”์—์„œ ๋ฌธ์ž์—ด์„ ๋”ํ•  ๋•Œ ๊ฐ„๋‹จํ•˜๊ฒŒ + ๋ฅผ ์ด์šฉํ•ด์„œ ์—ฐ๊ฒฐํ•  ์ˆ˜ ์žˆ๋‹ค.

String๊ฐ์ฒด๋ผ๋ฆฌ ๋”ํ•˜๋Š” ๋ฐฉ๋ฒ•์€ ๋ฉ”๋ชจ๋ฆฌ ํ• ๋‹น๊ณผ ํ•ด์ œ๋ฅผ ๋ฐœ์ƒ์‹œํ‚ค๋Š”๋ฐ, ๋ง์…ˆ ์—ฐ์‚ฐ์ด ๋งŽ์•„์ง„๋‹ค๋ฉด ๋น„ํšจ์œจ์ ์ธ ์ฝ”๋“œ๊ฐ€ ๋œ๋‹ค!

 

์ž๋ฐ”์—์„œ String ๊ฐ์ฒด๋Š” ๋ณ€๊ฒฝ ๋ถˆ๊ฐ€๋Šฅํ•˜๋‹ค.  ๋”ฐ๋ผ์„œ ํ•˜๋‚˜์˜ ๋ฌธ์ž์—ด์„ ๋‹ค๋ฅธ ๋ฌธ์ž์—ด๊ณผ ์—ฐ๊ฒฐํ•˜๋ฉด ์ƒˆ ๋ฌธ์ž์—ด์ด ์ƒ์„ฑ๋˜๊ณ , ์ด์ „ ๋ฌธ์ž์—ด์€ ๊ฐ€๋น„์ง€ ์ปฌ๋ ‰ํ„ฐ๋กœ ๋“ค์–ด๊ฐ„๋‹ค. ๋ฌธ์ž์—ด๋ผ๋ฆฌ ์—ฐ๊ฒฐํ•˜๋Š” ์ž‘์—… ์‹œ์—๋Š” ๋‚ด๋ถ€์ ์œผ๋กœ ์—ฌ๋Ÿฌ ์ž‘์—…์ด ๋ฐœ์ƒํ•˜๊ณ , ๊ธฐ์กด ๋ฌธ์ž์—ด ๊ฐ’์˜ ๊ธธ์ด์— ์ถ”๊ฐ€๋œ ๋ฌธ์ž์—ด์˜ ํฌ๊ธฐ๋ฅผ ๋”ํ•œ ํฌ๊ธฐ์˜ ์ƒˆ๋กœ์šด ๋ฌธ์ž์—ด์ด ์ƒ์„ฑ๋œ๋‹ค. ์ด ์ž‘์—…์ด ๋งŽ์•„์ง€๋ฉด, ๋ฉ”๋ชจ๋ฆฌ๋ฅผ ๋งŽ์ด ์žก์•„๋จน๊ฒŒ ๋œ๋‹ค

 

  • StringBuilder   -> ๋ณ€๊ฒฝ ๊ฐ€๋Šฅํ•œ ๋ฌธ์ž์—ด์„ ๋งŒ๋“ค์–ด์ค€๋‹ค.

Stirng์€ ๋ณ€๊ฒฝ ๋ถˆ๊ฐ€๋Šฅํ•œ ๋ฌธ์ž์—ด์„ ์ƒ์„ฑํ•˜์ง€๋งŒ StringBuilder๋Š” ๋ณ€๊ฒฝ ๊ฐ€๋Šฅํ•œ ๋ฌธ์ž์—ด์„ ๋งŒ๋“ค์–ด ์ฃผ๊ธฐ ๋•Œ๋ฌธ์—, String์„ ํ•ฉ์น˜๋Š” ์ž‘์—… ์‹œ ํ•˜๋‚˜์˜ ๋Œ€์•ˆ์ด ๋  ์ˆ˜ ์žˆ๋‹ค.

 

[StringBuilder ์‚ฌ์šฉ ๋ฐฉ๋ฒ•]

public class Main
{
    public static void main(String[] args)
    {
        StringBuilder stringBuilder = new StringBuilder();  //๊ฐ์ฒด ํ˜ธ์ถœ
        stringBuilder.append("๋ฌธ์ž์—ด ").append("์—ฐ๊ฒฐ"); //๋ฌธ์ž์—ด ์—ฐ๊ฒฐ
//        String str = stringBuilder;   // String์— StringBuilder๋ฅผ ๊ทธ๋Œ€๋กœ ๋„ฃ์„ ์ˆœ ์—†๋‹ค. toString()์„ ๋ถ™์—ฌ์•ผ ํ•œ๋‹ค
        String str = stringBuilder.toString();  //String๋ณ€์ˆ˜์— ๋„ฃ์„๋•Œ๋Š” toString()์‚ฌ์šฉํ• ๊ฒƒ!!
        // ๋‘ println()์€ ๊ฐ™์€ ๊ฐ’์„ ์ถœ๋ ฅํ•œ๋‹ค
        System.out.println(stringBuilder);
        System.out.println(str);
    }

}

๋จผ์ € StringBuilder์˜ ๊ฐ์ฒด๋ฅผ ์ƒ์„ฑํ•œ ํ›„, append()์˜ ์ธ์ž๋กœ ์—ฐ๊ฒฐํ•˜๊ณ ์ž ํ•˜๋Š” ๋ฌธ์ž์—ด์„ ๋„ฃ์–ด์„œ StringBuilder์˜ ๊ฐ์ฒด๋ฅผ ํ†ตํ•ด ํ˜ธ์ถœํ•œ๋‹ค. 

์ถœ๋ ฅ ์‹œ์—,  String ๋ณ€์ˆ˜์— ๋„ฃ์„ ๋•Œ๋Š” .toString()์„ ์‚ฌ์šฉํ•ด์•ผํ•œ๋‹ค!

 

 

 

 

- [ํ†ต๊ณผ]

import java.io.*;

public class Main {
    public void solution() throws Exception {
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        String str = br.readLine();

        // StringBuilder๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ๊ฒฐ๊ณผ ๋ฌธ์ž์—ด์„ ๊ตฌ์„ฑ
        StringBuilder result = new StringBuilder();

        for (int i = 0; i < str.length(); i++) {
            char ch = str.charAt(i);

            // ๋Œ€๋ฌธ์ž์ธ ๊ฒฝ์šฐ ์†Œ๋ฌธ์ž๋กœ ๋ณ€ํ™˜ํ•˜์—ฌ ์ถ”๊ฐ€
            if (Character.isUpperCase(ch)) {
                result.append(Character.toLowerCase(ch));
            } 
            // ์†Œ๋ฌธ์ž์ธ ๊ฒฝ์šฐ ๋Œ€๋ฌธ์ž๋กœ ๋ณ€ํ™˜ํ•˜์—ฌ ์ถ”๊ฐ€
            else if (Character.isLowerCase(ch)) {
                result.append(Character.toUpperCase(ch));
            } 
            // ์•ŒํŒŒ๋ฒณ์ด ์•„๋‹Œ ๊ฒฝ์šฐ(๊ณต๋ฐฑ ๋“ฑ) ๊ทธ๋Œ€๋กœ ์ถ”๊ฐ€
            else {
                result.append(ch);
            }
        }

        // ๊ฒฐ๊ณผ ๋ฌธ์ž์—ด ์ถœ๋ ฅ
        System.out.println(result.toString());
    }

    public static void main(String[] args) throws Exception {
        new Main().solution();
    }
}

 

- [๋‹ค๋ฅธ ๋ฐฉ๋ฒ•] -> ํ–ฅ์ƒ๋œ for๋ฌธ, str.toCharArray() ์‚ฌ์šฉ

 

 

 

 

- [ ๋‘ ๋ฐฉ๋ฒ• ๋น„๊ต] -> chatGPT ์‚ฌ์šฉ

 

๋‘ ๊ฐœ์˜ Java ์ฝ”๋“œ๋ฅผ ๋น„๊ตํ•  ๋•Œ, ๋ฌธ์ž์—ด์˜ ๊ฐ ๋ฌธ์ž์˜ ๋Œ€์†Œ๋ฌธ์ž๋ฅผ ํ† ๊ธ€ํ•˜๋Š” ํšจ์œจ์„ฑ์„ ์‚ดํŽด๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค.

 [  ์ฒซ ๋ฒˆ์งธ ์ฝ”๋“œ (StringBuilder ์‚ฌ์šฉ)  ] 

  • ๋ฐฉ์‹: `BufferedReader`๋ฅผ ์‚ฌ์šฉํ•ด ์ž…๋ ฅ์„ ๋ฐ›๊ณ , `StringBuilder`์ธ `result`๋ฅผ ์‚ฌ์šฉํ•ด ์ˆ˜์ •๋œ ๋ฌธ์ž์—ด์„ ํšจ์œจ์ ์œผ๋กœ ๊ตฌ์„ฑํ•ฉ๋‹ˆ๋‹ค. ๊ฐ ๋ฌธ์ž์˜ ๋Œ€์†Œ๋ฌธ์ž๋ฅผ ํ† ๊ธ€ํ•˜๊ณ , ์•ŒํŒŒ๋ฒณ์ด ์•„๋‹Œ ๋ฌธ์ž๋Š” ๊ทธ๋Œ€๋กœ ์ถ”๊ฐ€ํ•ฉ๋‹ˆ๋‹ค.
  • ํšจ์œจ์„ฑ ์žฅ์ :
      - StringBuilder์˜ ํšจ์œจ์„ฑ : `StringBuilder`๋Š” ๊ฐ€๋ณ€(mutable)ํ•˜๋ฉฐ ๋ฌธ์ž์—ด ์กฐ์ž‘์— ์ตœ์ ํ™”๋˜์–ด ์žˆ์Šต๋‹ˆ๋‹ค. ๋ฐ˜๋ณต๋ฌธ ์•ˆ์—์„œ ๋ฌธ์ž๋ฅผ ์ถ”๊ฐ€ํ•  ๋•Œ ์ƒˆ๋กœ์šด ๋ฌธ์ž์—ด ๊ฐ์ฒด๋ฅผ ์ƒ์„ฑํ•˜์ง€ ์•Š๊ณ  ๋‚ด๋ถ€ ๋ฒ„ํผ์— ์ง์ ‘ ์ถ”๊ฐ€ํ•˜๊ธฐ ๋•Œ๋ฌธ์— ๋ฉ”๋ชจ๋ฆฌ ์‚ฌ์šฉ์ด ํšจ์œจ์ ์ž…๋‹ˆ๋‹ค.
      - ์‹œ๊ฐ„ ๋ณต์žก๋„ : ์ž…๋ ฅ ๋ฌธ์ž์—ด์˜ ๊ธธ์ด์— ์„ ํ˜•์— ๋น„๋ก€ํ•˜๋Š” O(n)์˜ ์‹œ๊ฐ„ ๋ณต์žก๋„๋ฅผ ๊ฐ€์ง‘๋‹ˆ๋‹ค. ๊ฐ ๋ฌธ์ž ์ฒ˜๋ฆฌ๋Š” ์ƒ์ˆ˜ ์‹œ๊ฐ„์ด ์†Œ์š”๋˜๋ฉฐ, `StringBuilder`์— ๋ฌธ์ž ์ถ”๊ฐ€๋Š” ์•”ํ˜ธํ™”๋œ ์ƒ์ˆ˜ ์‹œ๊ฐ„ ๋ณต์žก๋„๋ฅผ ๊ฐ€์ง‘๋‹ˆ๋‹ค.

 

[ ๋‘ ๋ฒˆ์งธ ์ฝ”๋“œ (String๊ณผ ๋ฌธ์ž์—ด ์—ฐ๊ฒฐ ์‚ฌ์šฉ) ]

 

  •   ๋ฐฉ์‹: ์ž…๋ ฅ ๋ฌธ์ž์—ด์˜ ๊ฐ ๋ฌธ์ž๋ฅผ ๋ฐ˜๋ณตํ•˜๋ฉฐ, ์†Œ๋ฌธ์ž์ธ์ง€ ๋Œ€๋ฌธ์ž์ธ์ง€ ํ™•์ธํ•˜์—ฌ ASCII ์ฝ”๋“œ๋ฅผ ์ด์šฉํ•ด ๋Œ€์†Œ๋ฌธ์ž๋ฅผ ํ† ๊ธ€ํ•œ ํ›„ ๊ฒฐ๊ณผ ๋ฌธ์ž์—ด์ธ `answer`์— ์ถ”๊ฐ€ํ•ฉ๋‹ˆ๋‹ค.
  • ํšจ์œจ์„ฑ ๊ณ ๋ ค ์‚ฌํ•ญ:
      -  ๋ฐ˜๋ณต๋ฌธ ๋‚ด ๋ฌธ์ž์—ด ์—ฐ๊ฒฐ:  ๋ฐ˜๋ณต๋ฌธ ์•ˆ์—์„œ `String`์— ๋ฌธ์ž์—ด์„ ์—ฐ๊ฒฐํ•˜๋Š” (`answer += ...`) ๋ฐฉ์‹์€ Java์—์„œ `String`์ด ๋ถˆ๋ณ€(immutable)ํ•˜๊ธฐ ๋•Œ๋ฌธ์— ๋น„ํšจ์œจ์ ์ผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๊ฐ ์—ฐ๊ฒฐ ์—ฐ์‚ฐ์€ ์ƒˆ๋กœ์šด `String` ๊ฐ์ฒด๋ฅผ ์ƒ์„ฑํ•˜๋ฉฐ, ๋ฉ”๋ชจ๋ฆฌ ํ• ๋‹น๊ณผ ๋ณต์‚ฌ๊ฐ€ ๋ฐœ์ƒํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
      - ์‹œ๊ฐ„ ๋ณต์žก๋„ : ์ตœ์•…์˜ ๊ฒฝ์šฐ O(n^2)์˜ ์‹œ๊ฐ„ ๋ณต์žก๋„๋ฅผ ๊ฐ€์ง‘๋‹ˆ๋‹ค. ์—ฌ๊ธฐ์„œ n์€ ์ž…๋ ฅ ๋ฌธ์ž์—ด์˜ ๊ธธ์ด์ž…๋‹ˆ๋‹ค. ๊ฐ ์—ฐ๊ฒฐ ์—ฐ์‚ฐ์ด ๊ธฐ์กด ๋ฌธ์ž์—ด์˜ ๋‚ด์šฉ์„ ์ƒˆ๋กœ์šด ๋ฌธ์ž์—ด๋กœ ๋ณต์‚ฌํ•˜๊ธฐ ๋•Œ๋ฌธ์— ์‹œ๊ฐ„์ด ๋งŽ์ด ์†Œ๋ชจ๋  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

 


[๊ฒฐ๋ก  ]

`StringBuilder`๋ฅผ ์‚ฌ์šฉํ•œ ๋‘ ๋ฒˆ์งธ ๋ฐฉ๋ฒ•์ด ๋ฌธ์ž์—ด์˜ ๋Œ€์†Œ๋ฌธ์ž๋ฅผ ํ† ๊ธ€ํ•˜๋Š” ๋ฐ ๋” ํšจ์œจ์ ์ž…๋‹ˆ๋‹ค. `String` ์—ฐ๊ฒฐ ์—ฐ์‚ฐ๋ณด๋‹ค ๋ฉ”๋ชจ๋ฆฌ ์‚ฌ์šฉ๊ณผ ์‹คํ–‰ ์‹œ๊ฐ„ ๋ฉด์—์„œ ๋” ํšจ์œจ์ ์ด๋ฉฐ, ์‹ค์ œ๋กœ ๊ธด ๋ฌธ์ž์—ด์—์„œ๋„ ๋” ๋‚˜์€ ์„ฑ๋Šฅ์„ ๋ณด์žฅํ•ฉ๋‹ˆ๋‹ค. ๋”ฐ๋ผ์„œ ๋Œ€๋ถ€๋ถ„์˜ ์ƒํ™ฉ์—์„œ `StringBuilder`๋ฅผ ์‚ฌ์šฉํ•œ ๋‘ ๋ฒˆ์งธ ๋ฐฉ๋ฒ•์ด ๋” ์ข‹์€ ์„ ํƒ์ž…๋‹ˆ๋‹ค.

 

[ Character.isUpperCase() ๋ฅผ ์ด์šฉํ•œ ๋น„๊ต vs. ๋ฌธ์ž์˜ ASCII ์ฝ”๋“œ๋ฅผ ๋น„๊ต   ]

์ผ๋ฐ˜์ ์œผ๋กœ๋Š” Character.isUpperCase(ch)์™€ Character.isLowerCase(ch)๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๋ฐฉ์‹์ด ๋” ๊ถŒ์žฅ๋ฉ๋‹ˆ๋‹ค. ์ด ๋ฐฉ์‹์€ ๊ฐ€๋…์„ฑ์ด ์ข‹๊ณ , ์ฝ”๋“œ์˜ ์˜๋„๊ฐ€ ๋ช…ํ™•ํžˆ ๋“œ๋Ÿฌ๋‚˜๊ธฐ ๋•Œ๋ฌธ์ž…๋‹ˆ๋‹ค. ๋˜ํ•œ ์„ฑ๋Šฅ ์ฐจ์ด๋Š” ๋Œ€๋ถ€๋ถ„ ๋ฏธ๋ฏธํ•˜๋ฉฐ, ๋Œ€๋ถ€๋ถ„์˜ ์ƒํ™ฉ์—์„œ๋Š” ๋ฌด์‹œํ•  ์ˆ˜ ์žˆ์„ ์ •๋„์ž…๋‹ˆ๋‹ค. ๋”ฐ๋ผ์„œ, ์ผ๋ฐ˜์ ์ธ ๊ฐœ๋ฐœ์—์„œ๋Š” ํ‘œ์ค€ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ์˜ ๋ฉ”์„œ๋“œ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ์ฝ”๋“œ๋ฅผ ์ž‘์„ฑํ•˜๋Š” ๊ฒƒ์ด ์ข‹์Šต๋‹ˆ๋‹ค.

 

 


[Scanner vs BufferedReader ์— ๋Œ€ํ•ด์„œ ๋” ์•Œ์•„๋ณด๊ธฐ]

https://juno-juno.tistory.com/99

[charAt() ์ •๋ฆฌ ์ฐธ๊ณ ์ž๋ฃŒ]

https://colossus-java-practice.tistory.com/31

[StringBuilder ์ •๋ฆฌ ์ฐธ๊ณ ์ž๋ฃŒ]

https://onlyfor-me-blog.tistory.com/317