SOJ ONLINE JUDGE

문제 78

문자열 삽입하기

내 상태
미제출
난이도
78번 문제 난이도 보기
Unranked
출제자
jinu829
시간 제한
1000 ms
메모리 제한
512 MB
78번 문제 태그 보기
구현

알파벳 소문자와 숫자로 이루어진 두 문자열 $A$, $B$와 정수 $P$, $C$가 주어진다.

$C=1$이면 $B$에 포함된 모든 알파벳 소문자를 대문자로 바꾸고, $C=0$이면 $B$를 그대로 둔다.

이렇게 얻은 문자열을 $A$의 앞에서부터 $P$개의 문자 뒤에 삽입한 결과를 출력하는 프로그램을 작성하라.

입력

첫 번째 줄에 문자열 $A$가 주어진다.

두 번째 줄에 문자열 $B$가 주어진다. $(1 \le \lvert A \rvert, \lvert B \rvert \le 20)$

세 번째 줄에 정수 $P$가 주어진다. $(0 \le P \le \lvert A \rvert)$

네 번째 줄에 정수 $C$가 주어진다. $(C \in \{0, 1\})$

출력

조건에 따라 변환한 문자열 $B$를 문자열 $A$의 앞에서부터 $P$개의 문자 뒤에 삽입한 문자열을 출력한다.

예제 입력 1

abcde
123
2
0

예제 출력 1

ab123cde

노트

세종대학교 인터페이스 스터디에서는 $A$, $B$ 이외의 문자열을 선언하지 않고, $A$에 결과를 저장한 뒤 출력한다.

공식 해설 풀이 스포일러 보기 접기

삽입 위치 앞뒤의 순서는 바뀌지 않는다. 먼저 조건에 따라 $B$의 소문자만 대문자로 바꾸고, 결과를 $A$의 처음 $P$글자와 나머지 부분 사이에 넣으면 된다.

완성된 문자열은 정확히 $A$의 접두사, 변환한 $B$, $A$의 접미사 순서이다. 원래 문자들의 상대 순서와 삽입 위치를 모두 지키므로 요구한 결과가 된다. $P=0$이면 맨 앞 삽입이고 $P=\lvert A\rvert$이면 맨 뒤 삽입이다.

두 길이가 각각 $20$ 이하이므로 문자들을 직접 처리해도 충분하다. 시간복잡도와 결과 저장 공간은 $O(\lvert A\rvert+\lvert B\rvert)$이다.

구현 · 언어별 풀이

C++ 구현

$C=1$일 때 $B$의 각 알파벳을 toupper로 바꾸고 A.insert(P, B)를 호출한다. 그러면 별도의 결과 문자열을 선언하지 않고 $A$에 결과가 저장된다. 문자 변환에 전달하는 값은 static_cast<unsigned char>(ch)로 변환하면 안전하다.

C 구현

A 버퍼를 두 문자열의 합과 '\0'까지 담도록 확보한다. C=1이면 B의 소문자만 대문자로 바꾸고, A의 뒤쪽을 뒤에서부터 옮긴 다음 B를 복사한다. 다른 결과 문자열 없이 A에 저장하며 끝 널 문자도 이동한다.

Python 구현

A와 B를 문자 리스트로 읽는다. C=1이면 B의 원소를 직접 대문자로 바꾸고 A[P:P]=B로 삽입한다. 별도 결과 문자열을 보관하지 않고 변경된 A를 join하여 출력한다.

Java 구현

A와 B를 StringBuilder로 읽고 C=1이면 B.setCharAt()으로 소문자를 바꾼다. A.insert(P,B)로 결과를 A에 저장한다. substring 세 개를 이어 붙인 별도 결과 변수는 만들지 않는다.

Rust 구현

A,B를 Vec<u8>로 읽는다. C=1이면 B.make_ascii_uppercase()를 호출하고 A.splice(P..P,B)로 삽입한다. 입력이 ASCII라 P가 바이트 위치와 같고 결과는 A에 남는다.

JavaScript 구현

JS 문자열은 문자 하나를 제자리에서 바꿀 수 없으므로 A와 B를 각각 문자 배열로 읽는다. 이 두 배열만 사용해 $C=1$이면 $B$의 소문자를 toUpperCase()로 바꾸고 숫자는 그대로 둔다.

if (c === 1)
    for (let i = 0; i < b.length; i++) b[i] = b[i].toUpperCase();
a.splice(p, 0, ...b);
console.log(a.join(''));

입력 길이가 $20$ 이하라 인수를 펼치는 위 삽입은 작다. $P$는 앞에 남길 문자 수이므로 그대로 $0$부터 시작하는 삽입 인덱스이다. $P=0$은 맨 앞, $P=A$의 길이는 맨 뒤가 된다. 별도 결과 배열을 만들지 않고 $A$에 삽입한다.

제출

편집기에서 나가려면 Esc를 누른 뒤 Tab 또는 Shift와 Tab을 누르세요.