작성일 :

문제 링크

12174번 - #include <Google I/O.h>

설명

I와 O로 이루어진 8비트 문자열을 아스키 코드로 변환해 원래 메시지를 출력하는 문제입니다.


접근법

I는 1, O는 0으로 보고 8글자씩 끊어 이진수를 만듭니다.
각 8비트 값을 문자로 변환해 이어 붙이면 됩니다.


Code

C#

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
28
using System;
using System.Text;

class Program {
  static void Main() {
    var parts = Console.In.ReadToEnd().Split();
    var idx = 0;
    var t = int.Parse(parts[idx++]);

    var outSb = new StringBuilder();
    for (var caseNo = 1; caseNo <= t; caseNo++) {
      var b = int.Parse(parts[idx++]);
      var s = parts[idx++];
      var sb = new StringBuilder();

      for (var i = 0; i < b; i++) {
        var val = 0;
        for (var j = 0; j < 8; j++)
          val = val * 2 + (s[i * 8 + j] == 'I' ? 1 : 0);
        sb.Append((char)val);
      }

      outSb.AppendLine($"Case #{caseNo}: {sb}");
    }

    Console.Write(outSb);
  }
}

C++

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
#include <bits/stdc++.h>
using namespace std;

int main() {
  ios::sync_with_stdio(false);
  cin.tie(nullptr);

  int t; cin >> t;
  for (int caseNo = 1; caseNo <= t; caseNo++) {
    int b; cin >> b;
    string s; cin >> s;
    string res;
    res.reserve(b);

    for (int i = 0; i < b; i++) {
      int val = 0;
      for (int j = 0; j < 8; j++)
        val = val * 2 + (s[i * 8 + j] == 'I' ? 1 : 0);
      res.push_back(char(val));
    }

    cout << "Case #" << caseNo << ": " << res << "\n";
  }

  return 0;
}