코테입문 - 모스부호 (1) & StringBuilder/Buffer 개념

konut ko·2023년 5월 27일
1

자바코테 Lv0~1

목록 보기
12/12
post-thumbnail

StringBuilder, StringBuffer, String

StringBuilder, StringBuffer 와 String의 차이는 mutable여부이다.

  • 먼저 String은 immutable 특성을 가지는데 이 말은 한번 할당된 메모리 공간이 변하지 않는다는 것을 뜻한다. +연산자나 concat으로 문자열을 붙이면 실제로는 기존 문자에 새로운 문자를 붙이지 않고 새 String 객체에 붙인 문자열을 저장하고 그 객체를 참조하도록 한다. 그렇기에 성능이 구리다.

  • 반면 StringBuilder와 StringBuffer는 mutable 특성을 가지며 기존 문자열의 공간이 부족한 경우 기존 Buffer의 크기를 늘리며 유연하게 동작한다.

  • StringBuilder와 StringBuffer의 차이는 동기화 여부이다. StringBuilder는 동기화가 보장되지 않아서 단일 스레드 환경에서 사용하고, StringBuffer는 동기화가 보장되어서 멀티 스레드 환경에서 주로 사용한다.

  • 그래서 결국 성능면에서만 놓고 비교하면..

StringBuilder > StringBuffer >>> String 순으로 성능이 좋다.


출처링크







문제



내 풀이

import java.util.HashMap;
class Solution {
    public String solution(String letter) {
        String answer = "";

        HashMap<String, String> morse2 = new HashMap<>();

        String morse = "'.-':'a','-...':'b','-.-.':'c','-..':'d','.':'e','..-.':'f',"
                + "'--.':'g','....':'h','..':'i','.---':'j','-.-':'k','.-..':'l',"
                + "'--':'m','-.':'n','---':'o','.--.':'p','--.-':'q','.-.':'r',"
                + "'...':'s','-':'t','..-':'u','...-':'v','.--':'w','-..-':'x',"
                + "'-.--':'y','--..':'z'";

        String[] mArr1 = morse.split(",");

        for(String m1 : mArr1) {
            String[] m2 = m1.split(":",2);
            morse2.put(m2[0].substring(1, m2[0].length()-1), m2[1].substring(1,2));
            System.out.println("k : " + m2[0].substring(1, m2[0].length()-1) + " v : " + m2[1].substring(1,2));
        }

        String[] l = letter.split(" ");

        for(String ll : l) {
            answer += morse2.get(ll);
        }

        return answer;
    }
}



남의풀이 공부

  • 나랑 같은 풀이인데 코드 작성이 더 깔끔하다.
import java.util.HashMap;

class Solution {
    public String solution(String letter) {
        String morseStr = "'.-':'a','-...':'b','-.-.':'c','-..':'d','.':'e','..-.':'f',"
                + "'--.':'g','....':'h','..':'i','.---':'j','-.-':'k','.-..':'l',"
                + "'--':'m','-.':'n','---':'o','.--.':'p','--.-':'q','.-.':'r',"
                + "'...':'s','-':'t','..-':'u','...-':'v','.--':'w','-..-':'x',"
                + "'-.--':'y','--..':'z'";
        // morseArr: 모스부호 담음 '.-':'a'
        String[] morseArr = morseStr.split(","); 
        // letterArr: 모스암호 담음 ....
        String[] letterArr = letter.split(" ");

		// morse: 모스부호가 key, 값이되는 알파벳이 value인 
        HashMap<String, String> morse = new HashMap<String, String>();

        for (int i = 0; i < morseArr.length; i++) {
            morseArr[i] = morseArr[i].replace("'", ""); // '(s/q)제거'
            int idx = morseArr[i].indexOf(":"); // '(:)를 기준 인덱스로 잡아서
            // 0부터 인덱스:전까지 key, 인덱스:+1부터 끝까지 value로 담음. 깔꼼하다~
            morse.put(morseArr[i].substring(0, idx), morseArr[i].substring(idx+1));
        }
			
        // String 문자열 += 연산 대신 효율이 좋은 StringBuilder 사용    
        StringBuilder sb = new StringBuilder();
        for (int i = 0; i < letterArr.length; i++) {
            sb.append(morse.get(letterArr[i])); // 결합연산자가 .append()
        }

        return sb.toString(); // 하지만 리턴값을 String으로 바꿔줘야함!
    }
}



남의풀이 공부2

  • 배열에 담고 인덱스를 활용하여 unicode로 풀었다.
class Solution {
    public String solution(String letter) {
        String answer = "";
        String[] morse = {".-","-...","-.-.","-..",".","..-.","--.","....","..",".---","-.-",".-..","--","-.","---",".--.","--.-",".-.","...","-","..-","...-",".--","-..-","-.--","--.."};
        String[] word = letter.split(" ");

        for(int i=0;i<word.length;i++){
            for(int j=0;j<morse.length;j++){
                if(word[i].equals(morse[j])) answer+=(char)(j+97);
            }
        }

        return answer;
    }
}
  • 신기한건 String에 += (char) int 가 된다는 점!

    오홍오옿



남의풀이 공부3

  • 댓글반응 때문에 궁금해져서 가져옴

스트림이 뭔데..!!

import java.util.Arrays;
import java.util.HashMap;
import java.util.Map;
import java.util.stream.Collectors;

class Solution { 
    Map<String, String> dictionary = new HashMap<>() {{
        put(".-", "a");
        put("-...", "b");
        	//중략 : 너무 길어
        put("-..-", "x");
        put("-.--", "y");
        put("--..", "z");
    }};

    public String solution(String letter) {
        return Arrays.stream(letter.split(" "))
            .map(dictionary::get)
            .collect(Collectors.joining());
    }
}

주제1_ HashMap 선언...

아니근데 클래스안에서 선언했네

Map<String, String> dictionary = new HashMap<>() {{
        put(".-", "a");
        put("--..", "z");
    }};

이런 선언이 있었나.. 싶은 김에 복습을 해보았다.

HashMap의 향상된 for문 쓰는 법
HashMap에 .getKeySet()을 해서 키로 index를 돌림.

for(String key : hashmap5.keySet()) {
    		System.out.println("value : " + hashmap5.get(key));
    	}

이러면 key를 돌며 해당 key의 value를 콘솔창에 출력할 수 있음.
좀더공부

주제2_ Arrays.stream이 뭔지

Arrays.stream(letter.split(" "))

이거는

 String[] l = letter.split(" ");

이거랑 같다.
letter를 split해서 배열에 담아 쓰는것과 같은 방법임
단지 배열에 담지않고 stream에 담아 쓰는 것!
가서 공부

주제3_ .map()의 쓰임과 ::기호의 의미

Javascript의 map처럼 for문 역할을 한다고 보면 됨.
::기호는 람다식임.

Arrays.stream(letter.split(" "))
            .map(dictionary::get)

여기서는 모스암호를 스트림 배열에 담아서 그 배열의 원소를 순회하면서 dictionary라는 hashMap에 키값을 가져오게 한다.
가서 공부

주제4_ .collect(Collectors.joining())이 메서드 전부

위에서 한 과정을 출력하면 주소값이 나와버리므로 문자열로 합쳐주는 join 매서드 역할을 한다.

profile
보초딩코라 틀린 내용 있을 수도 있습니다. 댓글 지적 환영

0개의 댓글