用键盘打英文时,每个字母由哪只手打是固定的。 左手字母是 q w e r t a s d f g z x c v b 这 15 个,右手字母是 y u i o p h j k l n m 这 11 个。 大写字母和对应的小写字母用同一只手打。 不是英文字母的字符(数字、空格、标点)不属于任何一只手。 给出一行字符串。 字符串中由 1 个以上紧挨着、中间不夹其他字符的英文字母组成,且这些字母全都属于同一只手的部分,叫做单手段。 输出三行。 第一行输出最长单手段的长度。 第二行按输入中的原样(大小写也不变)输出这一段。 最长的段有多个时,输出最左边的那个。 如果一个英文字母都没有,第一行输出 0,第二行输出 "-"。 第三行输出紧挨着的两个字符都是英文字母、且属于不同手的位置个数。 两个英文字母之间只要夹着一个其他字符,这两个就不算紧挨着。
LEFT = set("qwertasdfgzxcvb")RIGHT = set("yuiophjklnm")def hand(ch): """영어 글자면 "L"·"R", 아니면 None. 대문자는 소문자로 바꿔 찾는다.""" c = ch.lower() if c in LEFT: return "L" if c in RIGHT: return "R" return Nones = input()best_len, best_start = 0, -1run = 0 # 지금 글자에서 끝나는 한 손 덩이의 길이switches = 0prev = None # 바로 앞 글자의 손(글자가 아니면 None)for i, ch in enumerate(s): h = hand(ch) if h is None: run = 0 elif h == prev: run += 1 else: if prev is not None: switches += 1 # 바로 붙은 두 글자의 손이 다르다 run = 1 # 새 덩이는 이 글자부터 # 글자마다 견주면 줄 끝에서 끝나는 덩이도 놓치지 않는다. >라서 같으면 왼쪽 것이 남는다 if run > best_len: best_len, best_start = run, i - run + 1 prev = hprint(best_len)print(s[best_start:best_start + best_len] if best_len else "-")print(switches)
JavaScriptmain.js · 21 行
const s = require("fs").readFileSync(0, "utf8").split("\n")[0].replace(/\r$/, "");const LEFT = "qwertasdfgzxcvb", RIGHT = "yuiophjklnm";// 영어 글자면 "L"·"R", 아니면 null. 대문자는 소문자로 바꿔 찾는다// (includes는 부분 문자열을 찾으니 빈칸·기호 한 글자도 들어갈 수 없게 글자 하나만 넘긴다)const hand = (ch) => { const c = ch.toLowerCase(); return LEFT.includes(c) ? "L" : RIGHT.includes(c) ? "R" : null;};let bestLen = 0, bestStart = -1, run = 0, switches = 0, prev = null;for (let i = 0; i < s.length; i++) { const h = hand(s[i]); if (h === null) run = 0; else if (h === prev) run++; else { if (prev !== null) switches++; run = 1; } if (run > bestLen) { bestLen = run; bestStart = i - run + 1; } // 같으면 왼쪽 것 prev = h;}console.log(`${bestLen}\n${bestLen ? s.slice(bestStart, bestStart + bestLen) : "-"}\n${switches}`);
TypeScriptmain.ts · 23 行
import { readFileSync } from "node:fs";const s: string = readFileSync(0, "utf8").split("\n")[0].replace(/\r$/, "");const LEFT = "qwertasdfgzxcvb", RIGHT = "yuiophjklnm";type Hand = "L" | "R" | null;// 영어 글자면 "L"·"R", 아니면 null. 대문자는 소문자로 바꿔 찾는다const hand = (ch: string): Hand => { const c = ch.toLowerCase(); return LEFT.includes(c) ? "L" : RIGHT.includes(c) ? "R" : null;};let bestLen = 0, bestStart = -1, run = 0, switches = 0;let prev: Hand = null;for (let i = 0; i < s.length; i++) { const h: Hand = hand(s[i]); if (h === null) run = 0; else if (h === prev) run++; else { if (prev !== null) switches++; run = 1; } if (run > bestLen) { bestLen = run; bestStart = i - run + 1; } // 같으면 왼쪽 것 prev = h;}console.log(`${bestLen}\n${bestLen ? s.slice(bestStart, bestStart + bestLen) : "-"}\n${switches}`);
JavaMain.java · 35 行
import java.io.BufferedReader;import java.io.IOException;import java.io.InputStreamReader;public class Main { static final String LEFT = "qwertasdfgzxcvb", RIGHT = "yuiophjklnm"; // 영어 글자면 'L'·'R', 아니면 0. 대문자는 소문자로 바꿔 찾는다 static char hand(char ch) { char c = Character.toLowerCase(ch); if (LEFT.indexOf(c) >= 0) return 'L'; if (RIGHT.indexOf(c) >= 0) return 'R'; return 0; } public static void main(String[] args) throws IOException { String s = new BufferedReader(new InputStreamReader(System.in)).readLine(); int bestLen = 0, bestStart = -1, run = 0, switches = 0; char prev = 0; for (int i = 0; i < s.length(); i++) { char h = hand(s.charAt(i)); if (h == 0) run = 0; else if (h == prev) run++; else { if (prev != 0) switches++; run = 1; } if (run > bestLen) { bestLen = run; bestStart = i - run + 1; } // 같으면 왼쪽 것 prev = h; } System.out.println(bestLen); System.out.println(bestLen > 0 ? s.substring(bestStart, bestStart + bestLen) : "-"); System.out.println(switches); }}
C#Main.cs · 38 行
using System;class Program{ const string Left = "qwertasdfgzxcvb", Right = "yuiophjklnm"; // 영어 글자면 'L'·'R', 아니면 '\0'. 대문자는 소문자로 바꿔 찾는다 static char Hand(char ch) { char c = char.ToLowerInvariant(ch); if (Left.IndexOf(c) >= 0) return 'L'; if (Right.IndexOf(c) >= 0) return 'R'; return '\0'; } static void Main() { string s = Console.ReadLine(); int bestLen = 0, bestStart = -1, run = 0, switches = 0; char prev = '\0'; for (int i = 0; i < s.Length; i++) { char h = Hand(s[i]); if (h == '\0') run = 0; else if (h == prev) run++; else { if (prev != '\0') switches++; run = 1; } if (run > bestLen) { bestLen = run; bestStart = i - run + 1; } // 같으면 왼쪽 것 prev = h; } Console.WriteLine(bestLen); Console.WriteLine(bestLen > 0 ? s.Substring(bestStart, bestLen) : "-"); Console.WriteLine(switches); }}
C++main.cpp · 33 行
#include <cctype>#include <iostream>#include <string>const std::string LEFT = "qwertasdfgzxcvb", RIGHT = "yuiophjklnm";// 영어 글자면 'L'·'R', 아니면 0. 대문자는 소문자로 바꿔 찾는다char hand(char ch) { char c = (char)std::tolower((unsigned char)ch); if (LEFT.find(c) != std::string::npos) return 'L'; if (RIGHT.find(c) != std::string::npos) return 'R'; return 0;}int main() { std::string s; std::getline(std::cin, s); if (!s.empty() && s.back() == '\r') s.pop_back(); int bestLen = 0, bestStart = -1, run = 0, switches = 0; char prev = 0; for (int i = 0; i < (int)s.size(); i++) { char h = hand(s[i]); if (h == 0) run = 0; else if (h == prev) run++; else { if (prev != 0) switches++; run = 1; } if (run > bestLen) { bestLen = run; bestStart = i - run + 1; } // 같으면 왼쪽 것 prev = h; } std::cout << bestLen << '\n' << (bestLen > 0 ? s.substr(bestStart, bestLen) : "-") << '\n' << switches << '\n';}
Cmain.c · 35 行
#include <ctype.h>#include <stdio.h>#include <string.h>static char line[100005];/* 영어 글자면 'L'·'R', 아니면 0. strchr는 끝의 '\0'도 찾으니 글자인지 먼저 본다 */static char hand(char ch) { if (!isalpha((unsigned char)ch)) return 0; char c = (char)tolower((unsigned char)ch); return strchr("qwertasdfgzxcvb", c) ? 'L' : 'R';}int main(void) { if (!fgets(line, sizeof line, stdin)) return 0; line[strcspn(line, "\r\n")] = '\0'; /* fgets는 줄바꿈까지 담는다 */ int best_len = 0, best_start = -1, run = 0, switches = 0; char prev = 0; for (int i = 0; line[i]; i++) { char h = hand(line[i]); if (h == 0) run = 0; else if (h == prev) run++; else { if (prev != 0) switches++; run = 1; } if (run > best_len) { best_len = run; best_start = i - run + 1; } /* 같으면 왼쪽 것 */ prev = h; } printf("%d\n", best_len); if (best_len > 0) printf("%.*s\n", best_len, line + best_start); else puts("-"); printf("%d\n", switches); return 0;}
Craykonmain.cray · 62 行
LEFT = "qwertasdfgzxcvb";RIGHT = "yuiophjklnm";// 영어 글자면 "L"·"R", 아니면 "". 대문자는 소문자로 바꿔 찾는다// (있나는 부분 문자열을 찾으니 늘 한 글자만 넘긴다)손(ch){ c = ch.小写(); 如果 (LEFT.包含(c)) { 返回 "L"; } 如果 (RIGHT.包含(c)) { 返回 "R"; } 返回 "";}s = 控制台.读行();bestLen = 0;bestStart = -1;run = 0; // 지금 글자에서 끝나는 한 손 덩이의 길이switches = 0;prev = ""; // 바로 앞 글자의 손("": 글자가 아님)循环 (i = 0; i < s.长度; i++){ h = 손(s[i]); 如果 (h == "") { run = 0; } 否则 如果 (h == prev) { run++; } 否则 { 如果 (prev != "") { switches++; } run = 1; } // 글자마다 견주면 줄 끝에서 끝나는 덩이도 놓치지 않는다. >라서 같으면 왼쪽 것 如果 (run > bestLen) { bestLen = run; bestStart = i - run + 1; } prev = h;}控制台.输出(bestLen);如果 (bestLen > 0){ 控制台.输出(s.截取(bestStart, bestLen));}否则{ 控制台.输出("-");}控制台.输出(switches);