require 'io/console'


dubeolsik = {

  "q" => "ㅂ",

  "Q" => "ㅃ",

  "w" => "ㅈ",

  "W" => "ㅉ",

  "e" => "ㄷ",

  "E" => "ㄸ",

  "r" => "ㄱ",

  "R" => "ㄲ",

  "t" => "ㅅ",

  "T" => "ㅆ",

  "a" => "ㅁ",

  "s" => "ㄴ",

  "d" => "ㅇ",

  "f" => "ㄹ",

  "g" => "ㅎ",

  "z" => "ㅋ",

  "x" => "ㅌ",

  "c" => "ㅊ",

  "v" => "ㅍ",

  "y" => "ㅛ",

  "u" => "ㅕ",

  "i" => "ㅑ",

  "o" => "ㅐ",

  "O" => "ㅒ",

  "p" => "ㅔ",

  "P" => "ㅖ",

  "h" => "ㅗ",

  "j" => "ㅓ",

  "k" => "ㅏ",

  "l" => "ㅣ",

  "b" => "ㅠ",

  "n" => "ㅜ",

  "m" => "ㅡ"

}


@l_index = {

  "ㄱ" =>  0,

  "ㄲ" =>  1,

  "ㄴ" =>  2,

  "ㄷ" =>  3,

  "ㄸ" =>  4,

  "ㄹ" =>  5,

  "ㅁ" =>  6,

  "ㅂ" =>  7,

  "ㅃ" =>  8,

  "ㅅ" =>  9,

  "ㅆ" => 10,

  "ㅇ" => 11,

  "ㅈ" => 12,

  "ㅉ" => 13,

  "ㅊ" => 14,

  "ㅋ" => 15,

  "ㅌ" => 16,

  "ㅍ" => 17,

  "ㅎ" => 18

}


@v_index = {

  "ㅏ" =>  0,

  "ㅐ" =>  1,

  "ㅑ" =>  2,

  "ㅒ" =>  3,

  "ㅓ" =>  4,

  "ㅔ" =>  5,

  "ㅕ" =>  6,

  "ㅖ" =>  7,

  "ㅗ" =>  8,

  "ㅘ" =>  9,

  "ㅙ" => 10,

  "ㅚ" => 11,

  "ㅛ" => 12,

  "ㅜ" => 13,

  "ㅝ" => 14,

  "ㅞ" => 15,

  "ㅟ" => 16,

  "ㅠ" => 17,

  "ㅡ" => 18,

  "ㅢ" => 19,

  "ㅣ" => 20

}


@t_index = {

  nil  =>  0,

  "ㄱ" =>  1,

  "ㄲ" =>  2,

  "ㄳ" =>  3,

  "ㄴ" =>  4,

  "ㄵ" =>  5,

  "ㄶ" =>  6,

  "ㄷ" =>  7,

  "ㄹ" =>  8,

  "ㄺ" =>  9,

  "ㄻ" => 10,

  "ㄼ" => 11,

  "ㄽ" => 12,

  "ㄾ" => 13,

  "ㄿ" => 14,

  "ㅀ" => 15,

  "ㅁ" => 16,

  "ㅂ" => 17,

  "ㅄ" => 18,

  "ㅅ" => 19,

  "ㅆ" => 20,

  "ㅇ" => 21,

  "ㅈ" => 22,

  "ㅊ" => 23,

  "ㅋ" => 24,

  "ㅌ" => 25,

  "ㅍ" => 26,

  "ㅎ" => 27

}


cc_rules = {

  "ㄱㅅ" => "ㄳ",

  "ㄴㅈ" => "ㄵ",

  "ㄴㅎ" => "ㄶ",

  "ㄹㄱ" => "ㄺ",

  "ㄹㅁ" => "ㄻ",

  "ㄹㅂ" => "ㄼ",

  "ㄹㅅ" => "ㄽ",

  "ㄹㅌ" => "ㄾ",

  "ㄹㅍ" => "ㄿ",

  "ㄹㅎ" => "ㅀ",

  "ㅂㅅ" => "ㅄ",

}


vv_rules = {

  "ㅗㅏ" => "ㅘ",

  "ㅗㅐ" => "ㅙ",

  "ㅗㅣ" => "ㅚ",

  "ㅜㅓ" => "ㅝ",

  "ㅜㅔ" => "ㅞ",

  "ㅜㅣ" => "ㅟ",

  "ㅡㅣ" => "ㅢ"

}


@state = :none

@seq = []


def reset

  puts @c

  @seq = []

  @state = :none

end


def compose_hangul (l, v, t)

  (@l_index[l] * 588 + @v_index[v] * 28 + @t_index[t] + 0xac00).chr("utf-8")

end


loop do

  @c = STDIN.getch

  @c.chomp!


  if @c.empty?

    puts

    exit

  end


  unless dubeolsik[@c]

    reset

    next

  end


  case @state

  when :none

    puts "preedit: " + dubeolsik[@c]

    @seq << @c

    @state = :c if @l_index.include? dubeolsik[@c]

    @state = :v if @v_index.include? dubeolsik[@c]

  when :c

    if @l_index.include? dubeolsik[@c]

      cc = cc_rules[dubeolsik[@seq[0]] + dubeolsik[@c]]

      if cc

        puts "preedit: " + cc

        @seq << @c

        @state = :cc

      else

        puts "commit: " + dubeolsik[@seq[0]]

        puts "preedit: " + dubeolsik[@c]

        @seq = []

        @seq << @c

        @state = :c

      end

    elsif @v_index.include? dubeolsik[@c]

      puts "preedit: " + compose_hangul(dubeolsik[@seq[0]], dubeolsik[@c], nil)

      @seq << @c

      @state = :lv

    end

  when :v

    if @l_index.include? dubeolsik[@c]

      puts "commit: " + dubeolsik[@seq[0]]

      puts "preedit: " + dubeolsik[@c]

      @seq = []

      @seq << @c

      @state = :c

    elsif @v_index.include? dubeolsik[@c]

      vv = vv_rules[dubeolsik[@seq[0]] + dubeolsik[@c]]

      if vv

        puts "preedit: " + vv

        @seq << @c

        @state = :vv

      else

        puts "commit: " + dubeolsik[@seq[0]]

        puts "preedit: " + dubeolsik[@c]

        @seq = []

        @seq << @c

        @state = :v

      end

    end

  when :lv

    if @t_index.include? dubeolsik[@c]

      puts "preedit: " + compose_hangul(dubeolsik[@seq[0]], dubeolsik[@seq[1]], dubeolsik[@c])

      @seq << @c

      @state = :lvt

    elsif @l_index.include? dubeolsik[@c]

      puts "commit: " +  compose_hangul(dubeolsik[@seq[0]], dubeolsik[@seq[1]], nil)

      puts "preedit: " + dubeolsik[@c]

      @seq = []

      @seq << @c

      @state = :c

    elsif @v_index.include? dubeolsik[@c]

      vv = vv_rules[dubeolsik[@seq[1]] + dubeolsik[@c]]

      if vv

        puts "preedit: " + compose_hangul(dubeolsik[@seq[0]], vv, nil)

        @seq << @c

        @state = :lvv

      else

        puts "commit: " + compose_hangul(dubeolsik[@seq[0]], dubeolsik[@seq[1]], nil)

        puts "preedit: " + dubeolsik[@c]

        @seq = []

        @seq << @c

        @state = :v

      end

    end

  when :cc

    if @l_index.include? dubeolsik[@c]

      puts "commit: " + cc_rules[dubeolsik[@seq[0]] + dubeolsik[@seq[1]]]

      puts "preedit: " + dubeolsik[@c]

      @seq = []

      @seq << @c

      @state = :c

    elsif @v_index.include? dubeolsik[@c]

      puts "commit: " + dubeolsik[@seq[0]]

      puts "preedit: " + compose_hangul(dubeolsik[@seq[1]], dubeolsik[@c], nil)

      @seq.shift 1

      @seq << @c

      @state = :lv

    end

  when :vv

    puts "commit: " + vv_rules[dubeolsik[@seq[0]] + dubeolsik[@seq[1]]]

    puts "preedit: " + dubeolsik[@c]

    @seq = []

    @seq << @c

    if @l_index.include? dubeolsik[@c]

      @state = :c

    elsif @v_index.include? dubeolsik[@c]

      @state = :v

    end

  when :lvv

    vv = vv_rules[dubeolsik[@seq[1]] + dubeolsik[@seq[2]]]

    if @t_index.include? dubeolsik[@c]

      puts "preedit: " + compose_hangul(dubeolsik[@seq[0]], vv, dubeolsik[@c])

      @seq << @c

      @state = :lvvt

    elsif @l_index.include? dubeolsik[@c]

      puts "commit: " +  compose_hangul(dubeolsik[@seq[0]], vv, nil)

      puts "preedit: " + dubeolsik[@c]

      @seq = []

      @seq << @c

      @state = :c

    elsif @v_index.include? dubeolsik[@c]

      puts "commit: " + compose_hangul(dubeolsik[@seq[0]], vv, nil)

      puts "preedit: " + dubeolsik[@c]

      @seq = []

      @seq << @c

      @state = :v

    end

  when :lvt

    if @l_index.include? dubeolsik[@c]

      cc = cc_rules[dubeolsik[@seq[2]] + dubeolsik[@c]]

      if cc

        puts "preedit: " + compose_hangul(dubeolsik[@seq[0]], dubeolsik[@seq[1]], cc)

        @seq << @c

        @state = :lvtt

      else

        puts "commit: " + compose_hangul(dubeolsik[@seq[0]], dubeolsik[@seq[1]], dubeolsik[@seq[2]])

        puts "preedit: " + dubeolsik[@c]

        @seq = []

        @seq << @c

        @state = :c

      end

    elsif @v_index.include? dubeolsik[@c]

      puts "commit: " + compose_hangul(dubeolsik[@seq[0]], dubeolsik[@seq[1]], nil)

      puts "preedit: " + compose_hangul(dubeolsik[@seq[2]], dubeolsik[@c], nil)

      @seq.shift 2

      @seq << @c

      @state = :lv

    end

  when :lvvt

    if @l_index.include? dubeolsik[@c]

      vv = vv_rules[dubeolsik[@seq[1]] + dubeolsik[@seq[2]]]

      cc = cc_rules[dubeolsik[@seq[3]] + dubeolsik[@c]]

      if cc

        puts "preedit: " + compose_hangul(dubeolsik[@seq[0]], vv, cc)

        @seq << @c

        @state = :lvvtt

      else

        puts "commit: " + compose_hangul(dubeolsik[@seq[0]], vv, dubeolsik[@seq[3]])

        puts "preedit: " + dubeolsik[@c]

        @seq = []

        @seq << @c

        @state = :c

      end

    elsif @v_index.include? dubeolsik[@c]

      vv = vv_rules[dubeolsik[@seq[1]] + dubeolsik[@seq[2]]]

      puts "commit: " + compose_hangul(dubeolsik[@seq[0]], vv, nil)

      puts "preedit: " + compose_hangul(dubeolsik[@seq[3]], dubeolsik[@c], nil)

      @seq.shift 3

      @seq << @c

      @state = :lv

    end

  when :lvtt

    if @l_index.include? dubeolsik[@c]

      cc = cc_rules[dubeolsik[@seq[2]] + dubeolsik[@seq[3]]]

      puts "commit: " +  compose_hangul(dubeolsik[@seq[0]], dubeolsik[@seq[1]], cc)

      puts "preedit: " + dubeolsik[@c]

      @seq = []

      @seq << @c

      @state = :c

    elsif @v_index.include? dubeolsik[@c]

      puts "commit: " + compose_hangul(dubeolsik[@seq[0]], dubeolsik[@seq[1]], dubeolsik[@seq[2]])

      puts "preedit: " + compose_hangul(dubeolsik[@seq[3]], dubeolsik[@c], nil)

      @seq.shift 3

      @seq << @c

      @state = :lv

    end

  when :lvvtt

    cc = cc_rules[dubeolsik[@seq[3]] + dubeolsik[@seq[4]]]

    vv = vv_rules[dubeolsik[@seq[1]] + dubeolsik[@seq[2]]]

    if @l_index.include? dubeolsik[@c]

      puts "commit: " + compose_hangul(dubeolsik[@seq[0]], vv, cc)

      puts "preedit: " + dubeolsik[@c]

      @seq = []

      @seq << @c

      @state = :c

    elsif @v_index.include? dubeolsik[@c]

      puts "commit: " + compose_hangul(dubeolsik[@seq[0]], vv, dubeolsik[@seq[3]])

      puts "preedit: " + compose_hangul(dubeolsik[@seq[4]], dubeolsik[@c], nil)

      @seq.shift 4

      @seq << @c

      @state = :lv

    end

  else

    raise "Unknown state #{@state.to_s}"

  end

end