이 페이지는 코딩도장 데이터의 읽기 전용 정적 보관본입니다.

점자 해석 프로그램

참고사이트: https://www.pharmabraille.com/pharmaceutical-braille/the-braille-alphabet/

출처: 순천향대학교 청소년 정보보호 페스티벌 http://yisf.sch.ac.kr/

올해 순천향대학교 예선 대회 문제로 나온 문제를 복원 및 수정한 문제입니다.

a

다음을 만족하는 점자 변환 프로그램을 작성하시오(단, 숫자는 입력하지 않습니다).

  • 1을 입력하면 문자 한 줄을 입력 받고 점자(XO로 이루어진)로 바꿔서 출력합니다.
  • 2를 입력하면 점자(XO로 이루어진) 세 줄을 입력 받고 문자로 바꿔서 출력합니다.
  • 다음 테스트 입력을 통과하도록 구현합니다.

테스트 입력1

input: 
1
WHATISTHEKEY
output: 
OX XO XO OX OX OX OX XO XO XO XO XX 
XX XX OO XX XO XO XX XX OX OO OX OX
OX OO OO XO OO XO XO OO OO XO OO XX

테스트 입력2

input:
2
OO OO OO OO OO OO OO OO OO OO OO OX XO OO OX OX OO OO OO OX OX OO OX XO OO OO OO OO OX OO OO OO XO OO OX XO OO OX OO OX OO OX XO OX XO OO OO OX OO OO OX OX XO OO XO OO OO OX OO OO OO OX OX 
XO XX XO XX OO XX OO XO XO OO XO OX OO XO OX OO XO OO XX OX OO XO OX OO XO XX XX OX OX XX XO OX XO XO OX OO OX OX OX OX XO OX OO OX OO XO OX OX XX OX OX OX OO OX XO XX OX OX OO XX XX OX OO 
XO OX XX XO XO XX XO XX XO XO XX OX OX XX OX XO XX XO XX OX XO XX OX OX XX OO XO OO XO OX XX OO OX XX OX OX OO XO OO XO OO OX OX OX OX XO OO XO OX OO XO OX OX OO OX OX OO XO XO XX XO OX XO
output:
;.?!"';'\?/?"/?\?:!).?(?\)),\\;).)\(.)"!/
점자

2018/08/19 22:07

재즐보프

+1 특수문자에서 3(‘), 236(?), 3 236(‘) 이 있는데, 그럼 "3 236"은 3, 236(‘?)과 3 236(‘) 으로 둘 다 해석 가능한 거 아닌가요.뭔가 이해하기 어려운 체계네요. - Noname, 2018/08/24 05:39
점자가 앞에서부터 읽기 때문에 3이 먼저 나오는 경우에는 뒤에 따라오는 점자에 따라 따옴표 또는 쌍따옴표로 인식을 합니다. 만약 3과 관련된 점자가 없으면 3이라는 한 점자로 '가 만들어진 예외로 보아야 하는 듯 합니다. 감사합니다~ - 재즐보프, 2018/08/24 09:03
2칸(?) 코드가 우선인 거네요. 감사합니다. - Noname, 2018/08/24 23:22

6개의 풀이가 있습니다.

class braille:
  '''
  self.string: 문자열
  self.bcode : 첨자
  self.ncode : 첨자숫자코드
  '''
  char = ',;:.?!"\'()/\\- '
  code = ('1', '12', '14', '145', '15', '124', '1245', '125', '24', '245', '13', '123', '134',
  '1345', '135', '1234', '12345', '1235', '234', '2345', '136', '1236', '2456', '1346', '13456', '1356',
  '2', '23', '25', '256', '236', '235', '3 2356', '3 236', '5 126', '5 345', '456 34', '456 16', '36', '0',
  '56', '3456')

  def __init__(self, inp):      # 한줄 문자열만 변환
    if '\n' not in inp:         # 여러줄은 첨자로 인식
      self.string = inp
      self.__char_to_braille()
    elif '\n' in inp:
      self.bcode = inp
      self.__braille_to_char()

  def __char_to_braille(self):
    self.ncode = []
    for i in range(len(self.string)):
      if self.string[i] in self.char:
        self.ncode.append(self.code[self.char.index(self.string[i])+26])
      elif self.string[i].isdigit():
        if not(i > 0 and self.string[i-1].isdigit()) and\
        not(i > 1 and self.string[i-1] == '.' and self.string[i-2].isdigit()): self.ncode.append(self.code[-1])
        self.ncode.append(self.code[int(self.string[i])-1] if self.string[i] != '0' else self.code[9])
      elif self.string[i].isalpha():
        if i > 0 and self.string[i-1].isdigit(): self.ncode.append(self.code[-2])
        self.ncode.append(self.code[int(self.string[i], 36)-10])
      else: raise
    self.ncode = ' '.join(self.ncode)
    self.bcode = '\n'.join(' '.join(i) for i in zip(*(self.__code_to_braille(i) for i in self.ncode.split())))

  def __code_to_braille(self, v):
    if v == '0': return [' ', ' ', ' ']
    ret = [['O' for j in range(2)] for i in range(3)]
    for i in v:
      ret[(int(i)-1)%3][(int(i)-1)//3] = 'X'
    return [''.join(i) for i in ret]

  def __braille_to_char(self):
    self.ncode = ' '.join(self.__braille_to_code(i) for i in zip(*(i.split(' ') for i in self.bcode.splitlines())))
    self.ncode = self.ncode.replace('0 0','0')

    tmp, flag_num, self.string = '', False, []
    for i in self.ncode.split():
      if i == '3456'          : flag_num = True; continue
      elif i == '56'          : flag_num = False; continue
      elif i == '256'         : self.string.append('.'); continue
      elif i in self.code[10:]: flag_num = False

      if tmp: i = f'{tmp} {i}'

      if i in ('3', '5', '456'): tmp = i; continue
      else                     : tmp = ''

      idx = self.code.index(i)
      if flag_num: self.string.append(str(idx+1)[-1])
      else:
        if idx > 25: self.string.append(self.char[idx-26])
        else: self.string.append(chr(idx+97))
    self.string = ''.join(self.string)

  def __braille_to_code(self, v):
    if '' in v: return '0'
    return ''.join(str(j*3+i+1) for j in range(2)
                                for i in range(3) if v[i][j] == 'X')

if __name__ == '__main__':
  test = ['100 cm', '25.4cm', 'The Braille Alphabet',
'''\
OX XO XX OO XX OO XX XX
OX OO OX XX OX OX OO OO
XX OO OO OX OO OX OO XO''', '''\
XO XO XO XO XO OO   OX XO XO XO XX OO
XX OX XO XO OX XO   XX OX XX XO OX XX
OO OO XO XO XO OO   OX XO XO XO OO XO''', '''\
XO OX OX XX OO OX OX OX OX XX XO XX OX XX XX XX XO OX XO XX XX OO XX XO XX OX OX
XX XX XX XO XX OX OO OX OO OO OX OX XO OX XX OX OX XX OO OX XX XX OO OX OO OX OO
OO XO XO XO OO OX XO OX XO OO XO OO OO XO OO OO XO OO OO XO OO OX OO XO XO OX XO''']

  for j in (braille(i) for i in test):
    print(j.string, j.ncode, j.bcode, sep='\n')
    print()

결과

100 cm
3456 1 245 245 0 14 134
OX XO OX OX   XX XX
OX OO XX XX   OO OO
XX OO OO OO   OO XO

25.4cm
3456 12 15 256 145 56 14 134
OX XO XO OO XX OO XX XX
OX XO OX XX OX OX OO OO
XX OO OO OX OO OX OO XO

The Braille Alphabet
2345 125 15 0 12 1235 1 24 123 123 15 0 1 123 1234 125 1 12 15 2345
OX XO XO   XO XO XO OX XO XO XO   XO XO XX XO XO XO XO OX
XX XX OX   XO XX OO XO XO XO OX   OO XO XO XX OO XO OX XX
XO OO OO   OO XO OO OO XO XO OO   OO XO XO OO OO OO OO XO

14.4cm
3456 1 145 256 145 56 14 134
OX XO XX OO XX OO XX XX
OX OO OX XX OX OX OO OO
XX OO OO OX OO OX OO XO

hello, world!
125 15 123 123 135 2 0 2456 135 1235 123 145 235
XO XO XO XO XO OO   OX XO XO XO XX OO
XX OX XO XO OX XO   XX OX XX XO OX XX
OO OO XO XO XO OO   OX XO XO XO OO XO

http://codingdojang.com/
125 2345 2345 1234 25 456 34 456 34 14 135 145 24 1345 1245 145 135 245 1 1345 1245 256 14 135 134 456 34
XO OX OX XX OO OX OX OX OX XX XO XX OX XX XX XX XO OX XO XX XX OO XX XO XX OX OX
XX XX XX XO XX OX OO OX OO OO OX OX XO OX XX OX OX XX OO OX XX XX OO OX OO OX OO
OO XO XO XO OO OX XO OX XO OO XO OO OO XO OO OO XO OO OO XO OO OX OO XO XO OX XO

최대한 참고 사이트의 규칙대로 변환하였습니다

2018/08/20 22:14

Creator

굿 좋네요. 하지만 이 문제의 묘미는 '를 처리하는 과정에 있습니다! 점자를 '로 처리하는 예외가 몇 개가 있습니다.그것도 고민해보시면 좋겠습니다. - 재즐보프, 2018/08/21 00:11
import java.util.ArrayList;
import java.util.Scanner;

public class Main {
    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);

        try {
            System.out.println("1번 : 알파벳을 점자로\r\n2번 : 점자를 알파벳으로");
            byte select = sc.nextByte();

            if (select == 1) {
                char[][] result_char;
                ArrayList<char[][]> result = new ArrayList<>();
                System.out.println("알파벳을 입력하세요.");
                String st = new Scanner(System.in).nextLine();

                for (int i = 0; i < st.length(); i++) {
                    result.add(Braille(st.charAt(i)));
                }

                for (int i = 0; i < 3; i++) {
                    for (int j = 0; j < result.size(); j++) {
                        result_char = result.get(j);
                        System.out.print(result_char[i][0]);
                        System.out.print(result_char[i][1] + " ");
                    }
                    System.out.println("");
                }
            } else if (select == 2) {
                String[] st = {"", "" ,""};
                System.out.println("점자를 입력해 주세요.");
                st[0] = new Scanner(System.in).nextLine();
                st[1] = new Scanner(System.in).nextLine();
                st[2] = new Scanner(System.in).nextLine();

                if (st[0].length() != st[1].length() || st[1].length() != st[2].length()
                        || st[0].length() != st[2].length()) {
                    System.out.println("점자를 제대로 입력해 주세요.");
                }else{
                    System.out.println(Louis(st[0], st[1], st[2]));
                }
            } else {
                System.out.println("종료합니다.");
            }
        } catch (Exception e) {
            // TODO: handle exception
            e.printStackTrace();
        }
    }

    public static String Louis(String Line_One, String Line_Two, String Line_Three) {
        String result = "";
        ArrayList<char[][]> Arr_Char = new ArrayList<>();

        for (int i = 0; i < Line_One.length(); i += 3) {
            char[][] char_at = { { 'X', 'X' }, { 'X', 'X' }, { 'X', 'X' } };
            for (int j = 0; j < 3; j++) {
                if (j == 0) {
                    char_at[j][0] = Line_One.charAt(i);
                    char_at[j][1] = Line_One.charAt(i + 1);
                } else if (j == 1) {
                    char_at[j][0] = Line_Two.charAt(i);
                    char_at[j][1] = Line_Two.charAt(i + 1);
                } else if (j == 2){
                    char_at[j][0] = Line_Three.charAt(i);
                    char_at[j][1] = Line_Three.charAt(i + 1);
                }
            }
            Arr_Char.add(char_at);
        }

        for (int i = 0; i < Arr_Char.size(); i++) {
            char[][] char_at = Arr_Char.get(i);
            if (char_at[0][1] == 'O' && char_at[1][1] == 'O' && char_at[2][0] == 'O' && char_at[2][1] == 'O') {
                result += 'Z';
            } else if (char_at[0][0] == 'O' && char_at[0][1] == 'O' && char_at[1][1] == 'O' && char_at[2][0] == 'O'
                    && char_at[2][1] == 'O') {
                result += 'Y';
            } else if (char_at[0][0] == 'O' && char_at[1][1] == 'O' && char_at[2][0] == 'O' && char_at[2][1] == 'O') {
                result += 'X';
            } else if (char_at[0][1] == 'O' && char_at[1][0] == 'O' && char_at[1][1] == 'O' && char_at[2][1] == 'O') {
                result += 'W';
            } else if (char_at[0][1] == 'O' && char_at[1][0] == 'O' && char_at[1][1] == 'O' && char_at[2][1] == 'O') {
                result += 'V';
            } else if (char_at[0][0] == 'O' && char_at[2][0] == 'O' && char_at[2][1] == 'O') {
                result += 'U';
            } else if (char_at[0][1] == 'O' && char_at[1][0] == 'O' && char_at[1][1] == 'O' && char_at[2][0] == 'O') {
                result += 'T';
            } else if (char_at[0][1] == 'O' && char_at[1][0] == 'O' && char_at[2][0] == 'O') {
                result += 'S';
            } else if (char_at[0][0] == 'O' && char_at[1][0] == 'O' && char_at[1][1] == 'O' && char_at[2][0] == 'O') {
                result += 'R';
            } else if (char_at[0][0] == 'O' && char_at[0][1] == 'O' && char_at[1][0] == 'O' && char_at[1][1] == 'O'
                    && char_at[2][0] == 'O') {
                result += 'Q';
            } else if (char_at[0][0] == 'O' && char_at[0][1] == 'O' && char_at[1][0] == 'O' && char_at[2][0] == 'O') {
                result += 'P';
            } else if (char_at[0][0] == 'O' && char_at[1][1] == 'O' && char_at[2][0] == 'O') {
                result += 'O';
            } else if (char_at[0][0] == 'O' && char_at[0][1] == 'O' && char_at[1][1] == 'O' && char_at[2][0] == 'O') {
                result += 'N';
            } else if (char_at[0][0] == 'O' && char_at[0][1] == 'O' && char_at[2][0] == 'O') {
                result += 'M';
            } else if (char_at[0][0] == 'O' && char_at[1][0] == 'O' && char_at[2][0] == 'O') {
                result += 'L';
            } else if (char_at[0][0] == 'O' && char_at[2][0] == 'O') {
                result += 'K';
            } else if (char_at[0][1] == 'O' && char_at[1][0] == 'O' && char_at[1][1] == 'O') {
                result += 'J';
            } else if (char_at[0][1] == 'O' && char_at[1][0] == 'O') {
                result += 'I';
            } else if (char_at[0][0] == 'O' && char_at[1][0] == 'O' && char_at[1][1] == 'O') {
                result += 'H';
            } else if (char_at[0][0] == 'O' && char_at[0][1] == 'O' && char_at[1][0] == 'O' && char_at[1][1] == 'O') {
                result += 'G';
            } else if (char_at[0][0] == 'O' && char_at[0][1] == 'O' && char_at[1][0] == 'O') {
                result += 'F';
            } else if (char_at[0][0] == 'O' && char_at[1][1] == 'O') {
                result += 'E';
            } else if (char_at[0][1] == 'O' && char_at[1][0] == 'O' && char_at[1][1] == 'O') {
                result += 'D';
            } else if (char_at[0][0] == 'O' && char_at[0][1] == 'O') {
                result += 'C';
            } else if (char_at[0][0] == 'O' && char_at[1][0] == 'O') {
                result += 'B';
            } else if(char_at[0][0] == 'O'){
                result += 'A';
            } else {
                result += " ";
            }
        }

        return result;
    }

    public static char[][] Braille(char C) {
        char[][] result = { { 'X', 'X' }, { 'X', 'X' }, { 'X', 'X' } };

        if (C == 'A' || C == 'a') {
            result[0][0] = 'O';
        } else if (C == 'B' || C == 'b') {
            result[0][0] = 'O';
            result[1][0] = 'O';
        } else if (C == 'C' || C == 'c') {
            result[0][0] = 'O';
            result[0][1] = 'O';
        } else if (C == 'D' || C == 'd') {
            result[0][1] = 'O';
            result[1][0] = 'O';
            result[1][1] = 'O';
        } else if (C == 'E' || C == 'e') {
            result[0][0] = 'O';
            result[1][1] = 'O';
        } else if (C == 'F' || C == 'f') {
            result[0][0] = 'O';
            result[0][1] = 'O';
            result[1][0] = 'O';
        } else if (C == 'G' || C == 'g') {
            result[0][0] = 'O';
            result[0][1] = 'O';
            result[1][0] = 'O';
            result[1][1] = 'O';
        } else if (C == 'H' || C == 'h') {
            result[0][0] = 'O';
            result[1][0] = 'O';
            result[1][1] = 'O';
        } else if (C == 'I' || C == 'i') {
            result[0][1] = 'O';
            result[1][0] = 'O';
        } else if (C == 'J' || C == 'j') {
            result[0][1] = 'O';
            result[1][0] = 'O';
            result[1][1] = 'O';
        } else if (C == 'K' || C == 'k') {
            result[0][0] = 'O';
            result[2][0] = 'O';
        } else if (C == 'L' || C == 'l') {
            result[0][0] = 'O';
            result[1][0] = 'O';
            result[2][0] = 'O';
        } else if (C == 'M' || C == 'm') {
            result[0][0] = 'O';
            result[0][1] = 'O';
            result[2][0] = 'O';
        } else if (C == 'N' || C == 'n') {
            result[0][0] = 'O';
            result[0][1] = 'O';
            result[1][1] = 'O';
            result[2][0] = 'O';
        } else if (C == 'O' || C == 'o') {
            result[0][0] = 'O';
            result[1][1] = 'O';
            result[2][0] = 'O';
        } else if (C == 'P' || C == 'p') {
            result[0][0] = 'O';
            result[0][1] = 'O';
            result[1][0] = 'O';
            result[2][0] = 'O';
        } else if (C == 'Q' || C == 'q') {
            result[0][0] = 'O';
            result[0][1] = 'O';
            result[1][0] = 'O';
            result[1][1] = 'O';
            result[2][0] = 'O';
        } else if (C == 'R' || C == 'r') {
            result[0][0] = 'O';
            result[1][0] = 'O';
            result[1][1] = 'O';
            result[2][0] = 'O';
        } else if (C == 'S' || C == 's') {
            result[0][1] = 'O';
            result[1][0] = 'O';
            result[2][0] = 'O';
        } else if (C == 'T' || C == 't') {
            result[0][1] = 'O';
            result[1][0] = 'O';
            result[1][1] = 'O';
            result[2][0] = 'O';
        } else if (C == 'U' || C == 'u') {
            result[0][0] = 'O';
            result[2][0] = 'O';
            result[2][1] = 'O';
        } else if (C == 'V' || C == 'v') {
            result[0][0] = 'O';
            result[1][0] = 'O';
            result[2][0] = 'O';
            result[2][1] = 'O';
        } else if (C == 'W' || C == 'w') {
            result[0][1] = 'O';
            result[1][0] = 'O';
            result[1][1] = 'O';
            result[2][1] = 'O';
        } else if (C == 'X' || C == 'x') {
            result[0][0] = 'O';
            result[0][1] = 'O';
            result[2][0] = 'O';
            result[2][1] = 'O';
        } else if (C == 'Y' || C == 'y') {
            result[0][0] = 'O';
            result[0][1] = 'O';
            result[1][1] = 'O';
            result[2][0] = 'O';
            result[2][1] = 'O';
        } else if (C == 'Z' || C == 'z') {
            result[0][0] = 'O';
            result[1][1] = 'O';
            result[2][0] = 'O';
            result[2][1] = 'O';
        } else if (C == '#') {
            result[0][1] = 'O';
            result[1][1] = 'O';
            result[2][0] = 'O';
            result[2][1] = 'O';
        }

        return result;
    }
}

어렵다기 보다는 귀찮은 작업이네요.
알파벳을 점자로 변환할때는 #까지 가능하게 했지만,
점자에서 알파벳으로 변환할때는 귀찮아서 #을 생략했습니다.

2018/08/20 15:50

PuTa

코드에서 한땀 한땀 노력이보인다 - leak, 2018/08/20 16:58
jum_dict={'A':['XO','OO','OO'],
'B':['XO','XO','OO'],
'C':['XX','OO','OO'],
'D':['XX','OX','OO'],
'E':['XO','OX','OO'],
'F':['XX','XO','OO'],
'G':['XX','XX','OO'],
'H':['XO','XX','OO'],
'I':['OX','XO','OO'],
'J':['OX','XX','OO'],
}

def char2jum(string):
    print('ouput:')
    #소문자 대문자 구분이 없길래 다 대문자로 바꿔줬습니다.
    string=string.upper()
    for i  in  range(3):
        jums=''
        try:
            for a in string:
                jums+=jum_dict[a][i]+' '
        except:
            print('string is not in dict')
            break
        print(jums)

def jum2char(jums):
    print('ouput:')
    result=''
    keylist=list(jum_dict.keys())
    vallist=list(jum_dict.values())
    for i in range(len(jums[0])):
        char=[jums[0][i],jums[1][i],jums[2][i]]
        result+=keylist[vallist.index(char)]
    print(result)

while (1):
    mode=int(input("input : \n"))
    if mode ==1:
        string=input()
        char2jum(string)
    elif mode==2:
        jums=[]
        for _ in range(3):
            temp=input()
            jums.append(temp.split())
        jum2char(jums)
    else:
        print("choice mode 1 or 2")

딕셔너리는 다 완성하지 못했습니다. ㅜㅜ 너무도 귀찮은 작업이네요

2018/08/23 11:19

hyun soo kim



# statement => code list
def e_map(stm):
    a_code = ['1', '12', '14', '145', '15', '124', '1245', '125', '24', '245', '13', '123', '134',
             '1345', '135', '1234', '12345', '1235', '234', '2345', '136', '1236', '2456', '1346', '13456', '1356']
    dic = {alp:code for (alp, code) in zip('ABCDEFGHIJKLMNOPQRSTUVWXYZ', a_code)}

    return [dic[alp] for alp in stm]


# emap(statement) => code_lst => braille
def encode(stm):
    code_lst = e_map(stm)

    # ['124', '346', ... ] 모양의 코드 리스트로 문자열 br에 점자를 찍어낸다.
    br = [[], [], []]
    for code in code_lst:
        for i in range(3):
            br[i].append(
                ('X' if str(i + 1) in code else 'O') + \
                ('X' if str(i + 4) in code else 'O')
            )
    return '\n'.join([' '.join(row) for row in br])


# code list => chars
def d_map(code_lst):
    c_code = ['2', '23', '25', '256', '236', '235', '3', '3 2356', '45 236', '45 356', '3 236', '3 356', '5 126', '5 345',
             '456 34', '456 16', '36', '6 36']
    dic = {code:ch for (code, ch) in zip(c_code, ''',;:.?!‘““”‘’()/\\––''')}

    #  코드 리스트를 출력할 특수문자들로 바꾼다. 
    # 크기 2인 코드를 고려하며, 크기 2인 코드를 크기 1인 코드보다 우선한다.
    chars = ''
    i = 0
    while i < len(code_lst):
        long_code = code_lst[i] + ' ' + code_lst[i + 1]
        if long_code in c_code:
            chars += dic[long_code]
            i += 1
        else:
            chars += dic[code_lst[i]]
        i += 1

    return chars


# braille => raw_code_lst => d_map(raw_code_lst) => chars
def decode(br):
    # 입력받은 점자 br로 코드 리스트를 만든다. 단, 크기 2인 코드는 고려하지 않는다.
    br = [row.split() for row in br.split('\n')]
    raw_code_lst = ['' for b in br[0]]
    for j in range(len(br[0])):
        for i in range(3):
            if br[i][j][0] is 'X':
                raw_code_lst[j] += (str(i + 1))
        for i in range(3):
            if br[i][j][1] is 'X':
                raw_code_lst[j] += (str(i + 4))

    return d_map(raw_code_lst)


input_data1 = ['1', 'WHATISTHEKEY']
input_data2 = ['2', '''\
OO OO OO OO OO OO OO OO OO OO OO OX XO OO OX OX OO OO OO OX OX OO OX XO OO OO OO OO OX OO OO OO XO OO OX XO OO OX OO OX OO OX XO OX XO OO OO OX OO OO OX OX XO OO XO OO OO OX OO OO OO OX OX 
XO XX XO XX OO XX OO XO XO OO XO OX OO XO OX OO XO OO XX OX OO XO OX OO XO XX XX OX OX XX XO OX XO XO OX OO OX OX OX OX XO OX OO OX OO XO OX OX XX OX OX OX OO OX XO XX OX OX OO XX XX OX OO 
XO OX XX XO XO XX XO XX XO XO XX OX OX XX OX XO XX XO XX OX XO XX OX OX XX OO XO OO XO OX XX OO OX XX OX OX OO XO OO XO OO OX OX OX OX XO OO XO OX OO XO OX OX OO OX OX OO XO XO XX XO OX XO''']

for (m, s) in [input_data1, input_data2]:
    func = encode if m is '1' else decode
    print(func(s))

2018/08/24 23:23

Noname

bra = ['100','110','300','320','120','310','330','130','210','230','101','111','301',
       '321','121','311','331','131','211','231','103','113','232','303','323','123','223']

def c(i):
     return '1' if i == 'XO' else '2' if i == 'OX' else '3' if i == 'XX' else '0'

def braille(i):
       if i == 1:
            i = list(input())
            for x in range(3):
                 for a in i:
                      a = int(bra[ord(a)-65][x])
                      print('XO' if a == 1 else 'OX' if a == 2 else 'XX' if a == 3 else 'OO', end = ' ')
                 print('\n')
       else:
            i = [input().split(),input().split(),input().split()]
            for x in range(len(i[0])):
                 print(chr(bra.index(c(i[0][x])+c(i[1][x])+c(i[2][x]))+65),end = '')

아직 문제를 제대로 이해를 하지 못해 최대한 나름대로 풀어봤습니다.

수정해주시면 즉시 고치겠으며 대문자로만 고려를 했습니다.

2018/09/04 23:41

김영성

using System;
using System.Collections.Generic;
using System.Text;

namespace solution2
{
    class Program
    {
        public static Dictionary<char, int> dic = new Dictionary<char, int>()
            {
                {'A',1 },{'B',5},{'C',3},{'D',11},{'E',9},{'F',7},{'G',15},{'H',13},{'I',6},{'J',14},{'K',17},
                {'L',21},{'M',19},{'N',27},{'O',25},{'P',23},{'Q',31},{'R',29},{'S',22},{'T',30},{'U',49},
                {'V',53},{'W',46},{'X',51},{'Y',59},{'Z',57}
            };

        static void Main(string[] args)
        {
            Console.WriteLine("점자 변환 프로그램:");
            Console.WriteLine("\t1을 입력하면 문자 한 줄을 입력 받고 점자(XO로 이루어진)로 바꿔서 출력합니다");
            Console.WriteLine("\t2를 입력하면 점자(XO로 이루어진) 세 줄을 입력 받고 문자로 바꿔서 출력합니다.");
            string n = Console.ReadLine();
            if (n == "1")
            {
                //string input = "WHATISTHEKEY";
                Console.Write("문자 한 줄을 입력하세요: ");
                string input = Console.ReadLine();
                convertToBraille(input);
            }
            else if (n == "2")
            {
                // 특수 문자는 하지 않았어요....
                //string[] input = { "OX XO XO OX OX OX OX XO XO XO XO XX",
                //                "XX XX OO XX XO XO XX XX OX OO OX OX",
                //                "OX OO OO XO OO XO XO OO OO XO OO XX" };
                Console.WriteLine("점자(XO로 이루어진) 세 줄을 입력하세요: ");
                string[] input = new string[3];
                for (int i = 0; i < 3; i++)
                {
                    Console.Write("{0}번 줄 입력: ",i+1);
                    input[i] = Console.ReadLine();
                }
                convertToText(input);
            }
        }        

        private static void convertToBraille(string word)
        {
            Console.Clear();
            int len = word.Length;
            char[,] tmp = new char[3, 2];
            int su = 0;
            for (int i = 0; i < len; i++)
            {
                su = dic[word[i]];
                for (int r = 0; r < 3; r++)
                {
                    for (int c = 0; c < 2; c++)
                    {
                        if (su % 2 == 1)
                            tmp[r, c] = 'X';
                        else
                            tmp[r, c] = 'O';
                        su /= 2;
                    }
                }
                print(i, tmp);
            }
        }

        private static void print(int v, char[,] munja)
        {
            for (int x = 0; x < 3; x++)
            {
                Console.SetCursorPosition(v * 5, x);
                for (int y = 0; y < 2; y++)
                {
                    Console.Write(" {0}", munja[x, y]);
                }
                Console.WriteLine();
            }
        }

        private static void convertToText(string[] input)
        {
            int su = input[0].Length + 1;
            string word = "";
            string[] wordSu = new string[su / 3];
            for (int i = 0; i < 3; i++)
            {
                for (int n = 0; n < su-1; n++)
                {
                    if (input[i][n] == ' ')
                        continue;
                    else if (input[i][n] == 'O')
                        wordSu[n / 3] = '0' + wordSu[n / 3];
                    else if (input[i][n] == 'X')
                        wordSu[n / 3] = '1' + wordSu[n / 3];
                }
            }
            for (int i = 0; i < su/3; i++)
            {
                int val = Convert.ToInt32(wordSu[i], 2);
                foreach (var k in dic.Keys)
                {
                    if (dic[k] == val)
                        word += k;
                }
            }
            Console.WriteLine("\n\n  {0}", word);
        }
    }
}
// 아파벳 대문자만 해 보았습니다.

2023/09/05 21:48

insperChoi

목록으로