๋ณธ๋ฌธ ๋ฐ”๋กœ๊ฐ€๊ธฐ
Programmers lv-0

์ค‘๋ณต๋œ ๋ฌธ์ž ์ œ๊ฑฐ - Java [ํ”„๋กœ๊ทธ๋ž˜๋จธ์Šค ์ž…๋ฌธ]

by ๊ทคํ”ผํ‚ค 2022. 11. 27.

 

โค๏ธ Problem

๋”๋ณด๊ธฐ
  • ๋ฌธ์ œ
    ๋ฌธ์ž์—ด my_string์ด ๋งค๊ฐœ๋ณ€์ˆ˜๋กœ ์ฃผ์–ด์ง‘๋‹ˆ๋‹ค. my_string์—์„œ ์ค‘๋ณต๋œ ๋ฌธ์ž๋ฅผ ์ œ๊ฑฐํ•˜๊ณ  ํ•˜๋‚˜์˜ ๋ฌธ์ž๋งŒ ๋‚จ๊ธด ๋ฌธ์ž์—ด์„ returnํ•˜๋„๋ก solution ํ•จ์ˆ˜๋ฅผ ์™„์„ฑํ•ด์ฃผ์„ธ์š”.
  • ์ œํ•œ ์‚ฌํ•ญ
    • 1 ≤ my_string ≤ 110
    • my_string์€ ๋Œ€๋ฌธ์ž, ์†Œ๋ฌธ์ž, ๊ณต๋ฐฑ์œผ๋กœ ๊ตฌ์„ฑ๋˜์–ด ์žˆ์Šต๋‹ˆ๋‹ค.
    • ๋Œ€๋ฌธ์ž์™€ ์†Œ๋ฌธ์ž๋ฅผ ๊ตฌ๋ถ„ํ•ฉ๋‹ˆ๋‹ค.
    • ๊ณต๋ฐฑ(" ")๋„ ํ•˜๋‚˜์˜ ๋ฌธ์ž๋กœ ๊ตฌ๋ถ„ํ•ฉ๋‹ˆ๋‹ค.
    • ์ค‘๋ณต๋œ ๋ฌธ์ž ์ค‘ ๊ฐ€์žฅ ์•ž์— ์žˆ๋Š” ๋ฌธ์ž๋ฅผ ๋‚จ๊น๋‹ˆ๋‹ค.
  • ์ž…์ถœ๋ ฅ ์˜ˆ & ์„ค๋ช…

no my_string result
1 "people" "peol"
2 "We are the world" "We arthwold"
  1. "people"์—์„œ ์ค‘๋ณต๋œ ๋ฌธ์ž "p"์™€ "e"์„ ์ œ๊ฑฐํ•œ "peol"์„ returnํ•ฉ๋‹ˆ๋‹ค.
  2. "We are the world"์—์„œ ์ค‘๋ณต๋œ ๋ฌธ์ž "e", " ", "r" ๋“ค์„ ์ œ๊ฑฐํ•œ "We arthwold"์„ returnํ•ฉ๋‹ˆ๋‹ค

 


 

๐Ÿ’› Solution

ํ’€์ด 1

import java.util.LinkedList;
import java.util.Queue;

class Solution {
    public String solution(String my_string) {
        String[] trans = my_string.split("");
        Queue<String> qu = new LinkedList<>();

        for(int i=0; i<trans.length; i++) {
            if(qu.contains(trans[i])) {
                continue;
            } else {
                qu.add(trans[i]);
            }
        }

        System.out.println(qu);

        StringBuffer sb = new StringBuffer();
         while(!qu.isEmpty()) {
            sb.append(qu.poll());
        }

        return sb.toString();
    }
}

 

์ฒ˜๋ฆฌ์†๋„์— ๋Œ€ํ•œ ๋ณด์™„์ด ํ•„์š”ํ•ด ๋ณด์ธ๋‹ค

 

ํ’€์ด 1์— ๋Œ€ํ•œ ๊ฒฐ๊ณผ

 


 

ํ’€์ด 2

class Solution {
    public String solution(String my_string) {
        StringBuffer answer = new StringBuffer();

        for(int i=0; i<my_string.length(); i++){
            if(i==my_string.indexOf(my_string.charAt(i)))
                answer.append(my_string.charAt(i));
        }

      return answer.toString();
    }
}

 

์ฒ˜๋ฆฌ์†๋„ ๋ณด์™„ ์™„๋ฃŒ

ํ’€์ด 2์— ๋Œ€ํ•œ ๊ฒฐ๊ณผ

 

 


 

๐Ÿ’œ Comment

์ฒ˜์Œ์—๋Š” Queue๋ฅผ ์‚ฌ์šฉํ•ด์„œ ์ฝ”๋“œ๋ฅผ ์ž‘์„ฑํ•˜์˜€๋‹ค.

Queue์•ˆ์— trans[i]๊ฐ€ ์žˆ๋Š”์ง€ ๊ฒ€์‚ฌํ•˜๊ณ  ์—†๋Š” ๊ฒฝ์šฐ์—๋งŒ Queue์— ํ•ด๋‹น ๊ฐ’์„ ์‚ฝ์ž…ํ•˜๋„๋ก ํ•˜์˜€๋‹ค. ๊ทธ ํ›„ Queue์—์„œ ๊ฐ’์„ ์ˆœ์ฐจ์ ์œผ๋กœ ๊บผ๋‚ด StringBuffer์— ๋„ฃ๋„๋ก ๊ตฌํ˜„ํ•˜์˜€๋‹ค.


์—ฌ๊ธฐ๊นŒ์ง€ ๊ตฌํ˜„ ์ž์ฒด๋Š” ์–ด๋ ต์ง€ ์•Š์•˜๋Š”๋ฐ ์ฒ˜๋ฆฌ ์†๋„๊ฐ€ ๋„ˆ๋ฌด ๋Š๋ฆฌ๋‹ค๋Š” ๋ฌธ์ œ๊ฐ€ ๋ฐœ์ƒํ•˜์˜€๋‹ค. String ๋ฐฐ์—ด, Queue, StringBuffer๋ฅผ ์‚ฌ์šฉํ•œ ๊ฒƒ์ด ์„ฑ๋Šฅ์— ๋ฌธ์ œ๋ฅผ ์ผ์œผ์ผฐ๋‹ค๊ณ  ์ƒ๊ฐํ–ˆ๋‹ค.

๊ทธ๋ž˜์„œ ๋‘๋ฒˆ์งธ๋กœ ๊ตฌ์„ฑํ•œ ์ฝ”๋“œ๋Š” String ๋ฐฐ์—ด์„ ์‚ฌ์šฉํ•˜์ง€ ์•Š๊ณ  String์˜ indexOf๋ฅผ ์‚ฌ์šฉํ•˜์˜€๋‹ค. my_string.charAt(i)์ด ์ฒ˜์Œ ๋“ฑ์žฅํ•  ๋•Œ๋งŒ StringBuffer์— ๋„ฃ์œผ๋ฉด ๋œ๋‹ค๊ณ  ์ƒ๊ฐํ–ˆ๊ธฐ ๋•Œ๋ฌธ์ด๋‹ค. ๋‹คํ–‰ํžˆ ํ…Œ์ŠคํŠธ๋ฅผ ํ†ต๊ณผํ–ˆ๊ณ  ์„ฑ๋Šฅ๋„ ํ–ฅ์ƒ์‹œํ‚ฌ ์ˆ˜ ์žˆ์—ˆ๋‹ค.

๋ฌธ์ž์—ด์„ ์ถ”๊ฐ€ํ•ด์•ผํ•˜๋Š” ์ƒํ™ฉ์—์„œ ๋‚˜๋Š” ์Šต๊ด€์ฒ˜๋Ÿผ StringBuffer๋ฅผ ์‚ฌ์šฉํ•˜๊ณค ํ–ˆ๋‹ค. ๋งˆ์นจ ์˜ค๋Š˜ ํ™œ์šฉ์„ ํ•˜์˜€์œผ๋‹ˆ ์˜ค๋Š˜ StringBuffer์— ๋Œ€ํ•ด ์ •๋ฆฌํ•ด๋ณด๊ณ ์ž ํ•œ๋‹ค.

 

 


 

๐Ÿค Concept

1. StringBuffer

  • java.lang.StringBuffer Class
  • ๊ฐ€๋ณ€ ํด๋ž˜์Šค(mutable class) ↔ ๋ถˆ๋ณ€ ํด๋ž˜์Šค(immutable class): String
    String ํด๋ž˜์Šค์˜ ์ธ์Šคํ„ด์Šค๋Š” ํ•œ ๋ฒˆ ์ƒ์„ฑ๋˜๋ฉด ๊ฐ’์„ ์ฝ๊ธฐ๋งŒ ํ•  ์ˆ˜ ์žˆ๊ณ , ๋ณ€๊ฒฝ ๋ถˆ๊ฐ€
    StringBuffer ํด๋ž˜์Šค์˜ ์ธ์Šคํ„ด์Šค๋Š” ๊ฐ’ ๋ณ€๊ฒฝ ๋ฐ ์ถ”๊ฐ€ ๊ฐ€๋Šฅ
  • ๋‚ด๋ถ€์ ์œผ๋กœ buffer ๊ณต๊ฐ„์„ ๊ฐ€์ง
    โ€ป buffer: ๋ฐ์ดํ„ฐ๋ฅผ ์ž„์‹œ ์ €์žฅํ•˜๋Š” ๋ฉ”๋ชจ๋ฆฌ
  • ๊ธฐ๋ณธ๊ฐ’: 16๊ฐœ ๋ฌธ์ž (ํฌ๊ธฐ ๋ณ„๋„ ์ง€์ • ๊ฐ€๋Šฅ)

 

  • StringBuffer ๋ฉ”์„œ๋“œ
    • StringBuffer append(VALUE)
    • int capacity()
    • StringBuffer delete(int start, int end)
    • StringBuffer deleteCharAt(int index)
    • StringBuffer insert(int offset, VALUE)
    • StringBuffer reverse()
    • StringBuffer substring(int start, int end)

 


 

2. String๊ณผ์˜ ๋น„๊ต

  • ๋ฌธ์ž์—ด์„ ์ˆ˜์ • ๋˜๋Š” ์ถ”๊ฐ€ํ•œ๋‹ค๊ณ  ํ–ˆ์„ ๋•Œ ๊ฒฐ๊ณผ๋Š” ๋™์ผํ•˜๋”๋ผ๋„ ๋‚ด๋ถ€์ ์œผ๋กœ ๊ฐ์ฒด๊ฐ€ ์ƒ์„ฑ๋˜๊ณ  ๋ฉ”๋ชจ๋ฆฌ๊ฐ€ ์‚ฌ์šฉ๋˜๋Š” ๊ณผ์ •์ด ๋‹ค๋ฅด๋‹ค

 

String str = "hello";
str += " world";

//์ถœ๋ ฅ ์‹œ "hello world"
  • String์˜ ๊ฒฝ์šฐ, "hello"์˜ ๊ฐ’์„ ์ง€๋‹ˆ๋Š” ๋ฉ”๋ชจ๋ฆฌ ์˜์—ญ์„ ํฌ์ธํŒ…ํ•˜๊ณ  ์žˆ๋˜ ์ฐธ์กฐ๋ณ€์ˆ˜ str์ด "hello world"์˜ ๊ฐ’์„ ๊ฐ€์ง€๋Š” ์ƒˆ๋กœ์šด ๋ฉ”๋ชจ๋ฆฌ ์˜์—ญ์„ ํฌ์ธํŒ…ํ•˜๋„๋ก ๋ณ€๊ฒฝ๋จ
  • ์ฆ‰, String์€ ๋ถˆ๋ณ€ํ•˜๊ธฐ ๋•Œ๋ฌธ์— ์ˆ˜์ • ๋˜๋Š” ์ถ”๊ฐ€ํ•˜๋Š” ์‹œ์ ์—์„œ ์ƒˆ๋กœ์šด String ์ธ์Šคํ„ด์Šค๊ฐ€ ์ƒ์„ฑ
  • String์—์„œ concat ๋˜๋Š” "+"๋ฅผ ์ผ์ • ํšŸ์ˆ˜ ์ด์ƒ ์‚ฌ์šฉํ•˜๊ฒŒ๋˜๋ฉด ์†๋„๊ฐ€ ๊ธ‰๊ฒฉํ•˜๊ฒŒ ๋Š๋ ค์ง
  • ๊ธฐ์กด์˜ "hello" ๊ฐ’์„ ์ง€๋‹ˆ๋Š” ๋ฉ”๋ชจ๋ฆฌ ์˜์—ญ์€ ํž™ ๋ฉ”๋ชจ๋ฆฌ(Heap memory)์—์„œ Garbage๋กœ ์ฒ˜๋ฆฌ๋จ (์ดํ›„ Garbage Collector์— ์˜ํ•ด ์‚ฌ๋ผ์ง)
  • String์„ ๋ฌธ์ž์—ด ์ˆ˜์ •, ์ถ”๊ฐ€, ์‚ญ์ œํ•˜๋Š” ์—ฐ์‚ฐ์„ ํ™œ์šฉํ•˜๋Š” ๊ฒฝ์šฐ์—๋Š” ํž™ ๋ฉ”๋ชจ๋ฆฌ ๋ถ€์กฑ์œผ๋กœ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ์„ฑ๋Šฅ์„ ์ €ํ•˜์‹œํ‚ฌ ์ˆ˜ ์žˆ์Œ

 

StringBuffer sb= new StringBuffer("hello");
sb.append(" world");

//์ถœ๋ ฅ ์‹œ "hello world"
  • StringBuffer(๋˜๋Š” StringBuilder)๋Š” ๊ฐ€๋ณ€์„ฑ์„ ๊ฐ€์ง€๋Š” ํด๋ž˜์Šค
  • append API๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ๋™์ผ ๊ฐ์ฒด์—์„œ ๋ฌธ์ž์—ด์„ ๋ณ€๊ฒฝ, ์ˆ˜์ •, ์‚ญ์ œํ•  ์ˆ˜ ์žˆ์Œ
    โ€ป API: ํ”„๋กœ๊ทธ๋žจ๋“ค์ด ์„œ๋กœ ์ƒํ˜ธ์ž‘์šฉํ•˜๋Š” ๊ฒƒ์„ ๋„์™€์ฃผ๋Š” ๋งค๊ฐœ์ฒด

 


 

2. StringBuilder์™€์˜ ๋น„๊ต

  • StringBuffer๋Š” StringBuilder๋ณด๋‹ค ๋ฉ€ํ‹ฐ ์Šค๋ ˆ๋“œ ํ™˜๊ฒฝ์—์„œ ์•ˆ์ „
  • StringBuilder๋Š” StringBuffer๋ณด๋‹ค ์†๋„๊ฐ€ ์šฐ์ˆ˜ํ•˜๋‚˜ ๋ฉ€ํ‹ฐ ์Šค๋ ˆ๋“œ ํ™˜๊ฒฝ์—์„œ ์•ˆ์ „ํ•˜์ง€ ์•Š์Œ (๋™๊ธฐํ™” ๋ฏธ์ง€์›)
  • ๋™๊ธฐํ™”๋ฅผ ๊ณ ๋ คํ•  ํ•„์š”๊ฐ€ ์—†๋Š” ์ƒํ™ฉ์—์„œ๋Š” StringBuffer ๋ณด๋‹ค๋Š” StringBuilder๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์ด ์œ ๋ฆฌ

 


 

 

๊ฐ„๋‹จ ์ •๋ฆฌ

  • String์€ ๋ถˆ๋ณ€ํ•˜๋ฏ€๋กœ ๋ฌธ์ž์—ด์„ ์ฝ๋Š”๋ฐ ์ตœ์ ํ™”
  • StringBuffer๋Š” ๊ฐ€๋ณ€ํ•˜๋ฉฐ ๋ฉ€ํ‹ฐ ์Šค๋ ˆ๋“œ ํ™˜๊ฒฝ์— ์ ํ•ฉ
  • StringBuilder๋Š” ๊ฐ€๋ณ€ํ•˜๋ฉฐ ์‹ฑ๊ธ€ ์Šค๋ ˆ๋“œ ํ™˜๊ฒฝ์— ์ ํ•ฉ

 

 

 

๋Œ“๊ธ€