
내가 생각했을때 문제에서 원하는부분
입력으로 한 줄에 하나씩 소문자로만 이루어진 단어가 주어진다.
입력의 마지막 줄에는 # 한 글자가 입력으로 주어진다.
단어의 길이는 10을 넘지 않는다.
각 줄마다 거울에 비춰지기 전 모습이 표현가능하다면 그 거울상의 모습을 출력하고 그렇지 않다면 'INVALID'를 출력한다.
내가 이 문제를 보고 생각해본 부분
main 메서드:
BufferedReader br = new BufferedReader(new InputStreamReader(System.in)); : 표준 입력(콘솔)으로부터 데이터를 효율적으로 읽어오기 위한 BufferedReader 객체를 생성한다.
StringBuilder sb = new StringBuilder(); : 여러 단어에 대한 처리 결과를 최종적으로 한 번에 출력하기 위해 StringBuilder를 사용한다.
StringBuilder는 문자열을 반복적으로 추가할 때 String보다 성능이 좋다.
mirrorMap 초기화:
Map<Character, Character> mirrorMap = new HashMap<>(); : char 타입을 키와 값으로 가지는 HashMap을 생성하여 거울상 관계를 정의한다.
mirrorMap.put('b', 'd'); 와 같이 문제에서 주어진 거울상 관계를 모두 추가한다.
이때, b의 거울상은 d이고, d의 거울상은 b이므로 양방향으로 매핑해주는 것이 중요하다.
자기 자신이 거울상인 i, o, v, w, x도 명확히 정의한다.
입력 처리 루프:
while((line = br.readLine()) != null && !line.equals("#")) : 입력의 각 줄을 한 단어씩 읽어와서 처리한다.
null이 아니면서 입력된 줄이 "#"이 아닌 동안 반복합니다. #은 입력의 끝을 나타내는 문자이다.
StringBuilder result = new StringBuilder(); : 현재 처리 중인 단어의 거울상을 저장할 StringBuilder를 초기화한다.
boolean isValid = true; : 현재 단어가 유효한 거울상인지를 판단하는 플래그 변수이다.
기본값은 true로 설정하고, 유효하지 않은 문자가 발견되면 false로 변경한다.
거울상 변환 로직:
for(int i = line.length() - 1; i >= 0; i--) : 거울은 좌우를 반전시키기 때문에, 입력된 단어의 마지막 문자부터 첫 문자까지 역순으로 순회해야 한다.
char originalChar = line.charAt(i); : 현재 처리 중인 원래 단어의 문자를 가져온다.
if(mirrorMap.containsKey(originalChar)) : 현재 문자가 mirrorMap에 키로 존재하는지 확인한다.
즉, 거울상 관계가 정의된 문자인지 확인하는 단계이다.
result.append(mirrorMap.get(originalChar)); : mirrorMap에 존재한다면, 해당 문자의 거울상 값을 result StringBuilder에 추가한다.
StringBuilder는 이미 뒤에서부터 문자를 추가하고 있으므로, 별도의 역순 처리는 필요 없다.
else : mirrorMap에 존재하지 않는다면, 이는 거울상 관계가 아닌 문자이므로, isValid를 false로 설정하고 break를 통해 현재 단어 처리를 중단한다.
결과 출력:
if(isValid) : 단어 처리가 모두 끝났을 때 isValid가 여전히 true라면, 모든 문자가 유효한 거울상으로 변환되었으므로 result.toString() (변환된 거울상 단어)을 sb에 추가하고 줄바꿈(\n)을 추가한다.
else : isValid가 false라면, 유효하지 않은 문자가 있었으므로 "INVALID"를 sb에 추가하고 줄바꿈(\n)을 추가한다.
최종 출력 및 스트림 닫기:
System.out.print(sb.toString()); : 모든 단어에 대한 처리가 끝난 후, sb에 저장된 모든 결과를 한 번에 출력한다.
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;
// 백준 4583번 문제
public class Main1209 {
public static void main(String[] args) throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
StringBuilder sb = new StringBuilder(); // 결과를 저장할 StringBuilder
// 거울상 관계를 저장할 맵
Map<Character, Character> mirrorMap = new HashMap<>();
mirrorMap.put('b', 'd');
mirrorMap.put('d', 'b');
mirrorMap.put('p', 'q');
mirrorMap.put('q', 'p');
mirrorMap.put('i', 'i');
mirrorMap.put('o', 'o');
mirrorMap.put('v', 'v');
mirrorMap.put('w', 'w');
mirrorMap.put('x', 'x');
String line;
while((line = br.readLine()) != null && !line.equals("#")) {
StringBuilder result = new StringBuilder(); // 현재 단어의 거울상을 저장할 StringBuilder
boolean isValid = true; // 유효성 검사 플래그
// 단어를 뒤에서부터 읽으면서 각 문자의 거울상 찾기
for(int i = line.length() - 1; i >= 0; i--) {
char originalChar = line.charAt(i);
if(mirrorMap.containsKey(originalChar)) {
result.append(mirrorMap.get(originalChar));
} else {
isValid = false; // 거울상 관계가 아닌 문자 발견
break;
}
}
if(isValid) {
sb.append(result.toString()).append("\n");
} else {
sb.append("INVALID").append("\n");
}
}
System.out.print(sb.toString()); // 최종 결과 출력
br.close();
}
}
코드와 설명이 부족할수 있습니다. 코드를 보시고 문제가 있거나 코드 개선이 필요한 부분이 있다면 댓글로 말해주시면 감사한 마음으로 참고해 코드를 수정 하겠습니다.