
내가 생각했을때 문제에서 원하는부분
첫째 줄에 모스 부호로 변환하기 전 문자열의 길이를 나타내는 정수 N(1 ≤ N ≤ 100)이 주어진다.
둘째 줄에 원래의 문자열을 모스 부호로 변환한 메시지가 주어진다.
이 메시지에서 짧은 신호는 '.', 긴 신호는 '-'로 나타내며, 원래의 문자열을 구성하는 각각의 문자를 모스 부호로 변환한 결과는 공백으로 구분되어 있다.
위 표를 이용해 해독할 수 없는 메시지는 주어지지 않는다.
주어진 모스 부호를 해독하여 길이 N인 문자열을 공백 없이 출력한다.
알파벳의 경우, 반드시 대문자로 출력한다.
내가 이 문제를 보고 생각해본 부분
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));: 위에서 설명했듯이, System.in(표준 입력, 보통 키보드를 의미합니다)으로부터 데이터를 읽기 위한 BufferedReader 객체를 생성한다.
int N = Integer.parseInt(br.readLine());: 첫 번째 줄에 주어지는 정수 N (원래 문자열의 길이)을 읽는다.
br.readLine()은 한 줄을 읽어 String 형태로 반환하고, Integer.parseInt()는 이 문자열을 정수형으로 변환한다.
이 문제에서는 N이 직접적으로 반복 횟수에 사용되지는 않지만, 문제 조건에 따라 입력받는 것이 중요하다.
모스 부호-문자 매핑 설정:
Map<String, String> morseToChar = new HashMap<>();: 모스 부호와 문자를 짝지어 저장할 HashMap 객체 morseToChar를 생성한다.
String 타입의 모스 부호가 키가 되고, 그에 해당하는 String 타입의 문자가 값이 된다.
morseToChar.put(".-", "A");: 문제에서 제공된 표에 있는 모든 모스 부호와 그에 해당하는 문자들을 put 메서드를 사용하여 HashMap에 저장한다.
이렇게 미리 매핑 정보를 구성해두면, 나중에 특정 모스 부호에 해당하는 문자를 매우 효율적으로 찾아낼 수 있다.
모스 부호 메시지 읽기 및 분리:
String morseMessage = br.readLine();: 두 번째 줄에 입력되는 전체 모스 부호 메시지(예: .... . .-.. .-.. ---)를 한 줄로 읽어 morseMessage 변수에 저장한다.
String[] morseCodes = morseMessage.split(" ");: 읽어들인 morseMessage 문자열을 공백(" ")을 기준으로 나누어(split()) String 배열 morseCodes에 저장한다.
이렇게 하면 각 배열의 요소가 ...., ., .-.., -.., ---와 같이 개별적인 모스 부호가 된다.
이 배열의 길이는 N과 같다.
모스 부호 해독 및 결과 조합:
StringBuilder sb = new StringBuilder();: 해독된 문자들을 하나씩 모아서 최종 문자열을 효율적으로 만들기 위해 StringBuilder 객체 sb를 생성한다.
자바에서 String 객체는 한 번 생성되면 내용이 변경될 수 없는(immutable) 특성을 가지므로, 문자열을 계속해서 추가하거나 수정할 때는 StringBuilder나 StringBuffer를 사용하는 것이 성능상 훨씬 유리하다.
for(String code : morseCodes): morseCodes 배열에 있는 각각의 모스 부호(code)에 대해 순서대로 반복 작업을 수행한다.
이 향상된 for 문은 배열이나 컬렉션의 모든 요소를 순회할 때 간결하게 사용할 수 있다.
sb.append(morseToChar.get(code));: 현재 반복에서 얻은 code (모스 부호)를 morseToChar HashMap의 키로 사용하여 해당하는 원래 문자(값)를 찾아낸다.
get() 메서드는 해당 키에 매핑된 값을 반환한다.
이렇게 찾아낸 문자를 sb StringBuilder에 덧붙여 나간다.
최종 결과 출력 및 자원 해제:
System.out.println(sb.toString());: 모든 모스 부호가 해독되어 sb StringBuilder에 모이면, sb.toString() 메서드를 호출하여 StringBuilder의 내용을 최종 String 형태로 변환한 후, System.out.println()을 통해 콘솔에 출력한다.
문제의 요구사항에 따라 공백 없이 연결된 원래 문자열이 출력된다.
br.close();: BufferedReader를 통해 사용한 시스템 자원(스트림)을 반환하고 닫는다.
코드로 구현
package baekjoon.baekjoon_31;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.HashMap;
import java.util.Map;
// 백준 29701번 문제
public class Main1215 {
public static void main(String[] args) throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
int N = Integer.parseInt(br.readLine()); // 원래 문자열의 길이를 읽지만, 실제 해독에는 직접 사용하지 않고 반복 횟수를 통해 간접적으로 활용됩니다.
// 모스 부호와 문자를 매핑할 HashMap 생성
Map<String, String> morseToChar = new HashMap<>();
morseToChar.put(".-", "A");
morseToChar.put("-...", "B");
morseToChar.put("-.-.", "C");
morseToChar.put("-..", "D");
morseToChar.put(".", "E");
morseToChar.put("..-.", "F");
morseToChar.put("--.", "G");
morseToChar.put("....", "H");
morseToChar.put("..", "I");
morseToChar.put(".---", "J");
morseToChar.put("-.-", "K");
morseToChar.put(".-..", "L");
morseToChar.put("--", "M");
morseToChar.put("-.", "N");
morseToChar.put("---", "O");
morseToChar.put(".--.", "P");
morseToChar.put("--.-", "Q");
morseToChar.put(".-.", "R");
morseToChar.put("...", "S");
morseToChar.put("-", "T");
morseToChar.put("..-", "U");
morseToChar.put("...-", "V");
morseToChar.put(".--", "W");
morseToChar.put("-..-", "X");
morseToChar.put("-.--", "Y");
morseToChar.put("--..", "Z");
morseToChar.put(".----", "1");
morseToChar.put("..---", "2");
morseToChar.put("...--", "3");
morseToChar.put("....-", "4");
morseToChar.put(".....", "5");
morseToChar.put("-....", "6");
morseToChar.put("--...", "7");
morseToChar.put("---..", "8");
morseToChar.put("----.", "9");
morseToChar.put("-----", "0");
morseToChar.put("--..--", ",");
morseToChar.put(".-.-.-", ".");
morseToChar.put("..--..", "?");
morseToChar.put("---...", ":");
morseToChar.put("-....-", "-");
morseToChar.put(".--.-.", "@");
String morseMessage = br.readLine(); // 모스 부호 메시지를 한 줄로 읽어옵니다.
String[] morseCodes = morseMessage.split(" "); // 공백을 기준으로 각 모스 부호를 분리합니다.
StringBuilder sb = new StringBuilder(); // 해독된 문자열을 효율적으로 만들 StringBuilder를 사용합니다.
for(String code : morseCodes) { // 분리된 각 모스 부호에 대해 반복합니다.
sb.append(morseToChar.get(code)); // HashMap에서 해당 모스 부호에 맞는 문자를 찾아 결과에 추가합니다.
}
System.out.println(sb.toString()); // 최종 해독된 문자열을 출력합니다.
br.close();
}
}
코드와 설명이 부족할수 있습니다. 코드를 보시고 문제가 있거나 코드 개선이 필요한 부분이 있다면 댓글로 말해주시면 감사한 마음으로 참고해 코드를 수정 하겠습니다.