작성일 :

문제 링크

13419번 - 탕수육

설명

주어진 문자열로 게임을 했을 때, 먼저 말하는 사람과 나중에 말하는 사람이 기억해야 할 최소 문자열을 출력하는 문제입니다.


접근법

말하는 순서는 문자열 인덱스를 따라가며 번갈아 진행됩니다.

길이가 짝수면 시작 플레이어는 짝수 인덱스만, 다음 플레이어는 홀수 인덱스만 반복하면 됩니다.

길이가 홀수면 한 바퀴가 끝날 때 순서가 바뀌므로, 짝수 인덱스 뒤에 홀수 인덱스를 이어서 사용해야 합니다.


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

class Program {
  static string Build(string s, int start, bool oddLength) {
    var sb = new StringBuilder();
    for (var i = start; i < s.Length; i += 2)
      sb.Append(s[i]);
    if (oddLength) {
      for (var i = 1 - start; i < s.Length; i += 2)
        sb.Append(s[i]);
    }
    return sb.ToString();
  }

  static void Main() {
    var t = int.Parse(Console.ReadLine()!);
    var outSb = new StringBuilder();
    for (var i = 0; i < t; i++) {
      var s = Console.ReadLine()!;
      var odd = s.Length % 2 == 1;
      outSb.AppendLine(Build(s, 0, odd));
      outSb.AppendLine(Build(s, 1, odd));
    }
    Console.Write(outSb.ToString());
  }
}

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

string build(const string& s, int start, bool oddLen) {
  string res;
  for (int i = start; i < (int)s.size(); i += 2)
    res.push_back(s[i]);
  if (oddLen) {
    for (int i = 1 - start; i < (int)s.size(); i += 2)
      res.push_back(s[i]);
  }
  return res;
}

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

  int t; cin >> t;
  while (t--) {
    string s; cin >> s;
    bool odd = s.size() % 2 == 1;
    cout << build(s, 0, odd) << "\n";
    cout << build(s, 1, odd) << "\n";
  }

  return 0;
}