fragment-header
fragment-markdown
홈
로그인
로그아웃
내 블로그
설정
로그인
백준 6503 (C++) 망가진 키보드
최초 업로드: 2025-10-07 16:44:53
최근 수정 시간: 2025-10-07 16:44:53
게시자: rlatjwls3333
카테고리: 백준
조회수: 11
# [Gold V] 망가진 키보드 [문제 링크](https://www.acmicpc.net/problem/6503) ## 문제 설명 <p>상근이의 키보드가 망가졌다. 키보드의 일부 키는 작동을 해서 아직 입력을 할 수 있다. 상근이는 키보드의 레이아웃을 바꿔서 단어를 입력하려고 한다. 지금 키보드에서 작동하는 키의 개수는 m개이다.</p> <p>상근이가 입력하려고 하는 문장이 주어졌을 때, 키보드의 레이아웃을 바꾸지 않고 입력할 수 있는 연속하는 문자의 최댓값을 구하는 프로그램을 작성하시오. 키보드의 한 키는 문자 하나에 매핑되고, 다른 키와 조합을 이용해서 문자를 입력할 수는 없다. 즉, 최대 m개의 서로 다른 문자로 이루어진 가장 긴 부분 문자열을 찾으면 된다.</p> ## 입력 <p>입력은 여러 개의 테스트 케이스로 이루어져 있고, 각 테스트 케이스는 두 줄로 이루어져 있다. 테스트 케이스의 첫째 줄에는 m이 주어진다. (1 ≤ m ≤ 128) 둘째 줄에는 상근이가 입력하려고 하는 문장이 주어진다. 이 문장은 백만글자를 넘지 않으며, 공백을 포함할 수 있다. 공백도 문자로 생각하고 문제를 풀어야 한다.</p> <p>입력의 마지막 줄에는 0이 하나 주어진다.</p> ## 출력 <p>각 테스트 케이스에 대해서 최대 m개의 서로 다른 문자로 이루어진 가장 긴 부분 문자열의 길이를 출력한다.</p> ## 풀이 오른쪽 포인터를 최대한 늘리고, 더 이상 못 늘릴 때, 왼쪽 포인터를 한칸씩 이동하는 기초적인 투 포인터 문제입니다. ``` c++ #include<bits/stdc++.h> using namespace std; int use[128]; int main() { ios::sync_with_stdio(0); cin.tie(0); while(true) { int m; cin >> m; if(!m) break; string s; cin.ignore(); getline(cin, s); memset(use, 0, sizeof use); int l=0, r=0, cnt=0, maxLen=0; while(r<s.length()) { while(r<s.length() && (cnt<m || use[s[r]])) { if(++use[s[r++]]==1) cnt++; } maxLen = max(maxLen, r-l); if(--use[s[l++]]==0) cnt--; } cout << maxLen << '\n'; } } ```