먼저 String은 immutable 특성을 가지는데 이 말은 한번 할당된 메모리 공간이 변하지 않는다는 것을 뜻한다. +연산자나 concat으로 문자열을 붙이면 실제로는 기존 문자에 새로운 문자를 붙이지 않고 새 String 객체에 붙인 문자열을 저장하고 그 객체를 참조하도록 한다. 그렇기에 성능이 구리다.
반면 StringBuilder와 StringBuffer는 mutable 특성을 가지며 기존 문자열의 공간이 부족한 경우 기존 Buffer의 크기를 늘리며 유연하게 동작한다.
StringBuilder와 StringBuffer의 차이는 동기화 여부이다. StringBuilder는 동기화가 보장되지 않아서 단일 스레드 환경에서 사용하고, StringBuffer는 동기화가 보장되어서 멀티 스레드 환경에서 주로 사용한다.
그래서 결국 성능면에서만 놓고 비교하면..
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으로 바꿔줘야함!
}
}
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 가 된다는 점!
오홍오옿
- 댓글반응 때문에 궁금해져서 가져옴
스트림이 뭔데..!!
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());
}
}
아니근데 클래스안에서 선언했네
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를 콘솔창에 출력할 수 있음.
좀더공부
Arrays.stream(letter.split(" "))
이거는
String[] l = letter.split(" ");
이거랑 같다.
letter를 split해서 배열에 담아 쓰는것과 같은 방법임
단지 배열에 담지않고 stream에 담아 쓰는 것!
가서 공부
Javascript의 map처럼 for문 역할을 한다고 보면 됨.
::기호는 람다식임.
Arrays.stream(letter.split(" "))
.map(dictionary::get)
여기서는 모스암호를 스트림 배열에 담아서 그 배열의 원소를 순회하면서 dictionary라는 hashMap에 키값을 가져오게 한다.
가서 공부
위에서 한 과정을 출력하면 주소값이 나와버리므로 문자열로 합쳐주는 join 매서드 역할을 한다.