음유시인 영재
문제링크: https://www.acmicpc.net/problem/19948
대문자 A와 소문자 a의 아스키 코드값은 각각 65, 97이다.
먼저 문자열을 입력받고, 스페이스 포함 각 문자를 칠 수 있는 횟수를 입력을 받는다.
이를 배열로 만들어준다.
그리고 문자열을 하나씩 떼어 읽으면서 사용된 문자를 구분하여 해당 배열의 수를 줄여나간다.
CharToInt가 그 역할을 해준다.
문자가 들어오면 0~26의 index로 반환해준다.
만일 이 배열 중 하나라도 음수 값이 된다면 이 시의 내용과 제목은 타이핑이 불가능한 것이다.
따라서 flag를 세워 음수값이 되었을 경우 false를 주어 마지막 출력에 구분한다.
CharToInt메소드를 통해
- 정답코드
#include<iostream> #include<string> using namespace std; int CharToInt(char c) { int charN = c; if (charN == 32) return 0; else if (charN < 92) return charN - 64; else return charN - 96; } char CharToIni(char c) { if (c > 92) return c - 32; else return c; } int main() { string str; getline(cin, str); int alpha[27]; for (int i = 0; i < 27; i++) cin >> alpha[i]; char pre = ' '; bool flag = true; string title = ""; for (int i = 0; i < str.size(); i++) { char cur = str.at(i); if (pre != cur) { int idx = CharToInt(cur); alpha[idx]--; if (alpha[idx] < 0) { flag = false; } } if (pre == ' ') if (cur != ' ') title.push_back(CharToIni(cur)); pre = cur; } pre = ' '; for (int i = 0; i < title.size(); i++) { char cur = title.at(i); if (pre != cur) { int idx = CharToInt(cur); alpha[idx]--; if (alpha[idx] < 0) { flag = false; } } pre = cur; } if (flag) cout << title << endl; else cout << -1 << endl; return 0; }
'ProblemSolving' 카테고리의 다른 글
[BOJ] 1106_호텔 (1) | 2021.01.28 |
---|---|
[BOJ] 1149_RGB거리 (0) | 2021.01.27 |
[BOJ] 1931_회의실 배정 (0) | 2021.01.25 |
[BOJ] 1012_유기농 배추 (0) | 2021.01.24 |
[BOJ] 1105_팔 (0) | 2021.01.23 |
최근댓글