읽기 전에 알아두면 좋아요
아래 개념이 익숙하면 본문을 바로 읽으세요. 낯선 개념만 링크에서 복습하면 됩니다.
- 문자열 알고리즘 기초: 순회·문자 판별·대소문자 변환·숫자 추출문자열의 각 문자를 순서대로 읽고 위치를 확인하는 방법을 복습합니다. 원래 문자의 대소문자에 따라 서로 다른 변환을 적용합니다.
- 기초 구현 패턴: 조건·정수 계산·순회·상태 갱신변수에 값을 담고 조건에 따라 합·개수·최솟값을 갱신하는 기초부터 확인합니다. 순회 중 필요한 상태를 정하고 갱신하는 기본 패턴입니다.
개념과 예제는 실행하지 않아도 읽을 수 있습니다. 내 컴퓨터·터미널에서 직접 실행하는 과정은 선택 실습입니다.
과정 위치와 선택 복습 안내
과정 위치: 문자열 기초 · 문제
과정 위치는 이 글이 속한 묶음입니다. 이 단계의 모든 개념을 먼저 읽을 필요는 없습니다. 위에 연결한 개념 중 낯선 내용만 복습하세요. 문제의 조건·상태·갱신 순서는 익숙한 언어로 설명하면 됩니다.
JavaScript로 문법·실행 복습하기 (선택)
개념 글의 코드는 JavaScript 예시입니다. 문제 화면에서는 JavaScript·Python·Java·C++·C# 중 익숙한 언어의 함수를 작성하세요. 본문의 Node.js 입출력 예시는 로컬 실행을 위한 별도 안내입니다.
대소문자 변환 문제는 영문 문자열의 대문자와 소문자를 어떤 결과로 바꾸어 반환하나요?
주어진 영문 문자열의 대문자와 소문자를 서로 바꿔 반환하는 문제입니다. 문자열·대소문자·조건문의 기본을 준비하고, 아래 입력·반환 계약을 확인해 직접 풀어보세요.
적용 조건·범위: 문자열 길이를 N이라 하면 문자 판별·변환은 N번입니다. 아래 시간 복잡도는 문자열 누적이 효율적으로 처리되는 일반적인 풀이 기준이며, 반복 연결 비용은 JavaScript 엔진 구현에 따라 달라질 수 있습니다. 입력이 100자 이하인 이 문제에서는 충분합니다.
공식 문서 참고: 관련 개념: MDN toLowerCase로 대문자를 소문자로 변환 · 관련 개념: MDN toUpperCase로 소문자를 대문자로 변환
문제
길이가 100 이하인 대문자와 소문자가 섞인 문자열 한 줄이 주어집니다. 각 문자를 확인해 대문자는 소문자로, 소문자는 대문자로 바꾼 문자열을 출력해야 합니다.
입력은 문자열 한 줄이고, 출력은 모든 문자의 대소문자를 반대로 변환한 문자열 한 줄입니다.
예제 입력
StuDY
예제 출력
sTUdy
직접 풀어보기
먼저 선택한 언어의 입력·반환 계약에 맞춰 작성해 보세요. 힌트 받기와 정답과 비교하기는 코드를 실행하지 않는 AI 분석입니다. 해답·해설은 아래에서 필요할 때 펼칠 수 있습니다.
AI 힌트
코드를 실행한 채점 결과가 아닌 AI의 코드 분석입니다.
해답·해설 보기
function solution(text) {
const result = [];
for (const ch of text) result.push(ch >= 'A' && ch <= 'Z' ? ch.toLowerCase() : ch.toUpperCase());
return result.join('');
}
solution(text)에 문자열을 전달하며 결과 문자열을 반환합니다. 입력은 문제의 유효한 범위를 만족합니다. 표준 입력·출력 없이 결과를 반환하세요.
def solution(text):
return ''.join(chr(ord(ch)+32) if 'A' <= ch <= 'Z' else chr(ord(ch)-32) for ch in text)
solution(text)에 문자열을 전달하며 결과 문자열을 반환합니다. 입력은 문제의 유효한 범위를 만족합니다. 표준 입력·출력 없이 결과를 반환하세요.
import java.util.*;
class Solution {
public String solution(String text) {
StringBuilder result = new StringBuilder();
for (char ch : text.toCharArray()) result.append((char)(ch >= 'A' && ch <= 'Z' ? ch + 32 : ch - 32));
return result.toString();
}
}
Solution.solution(String text)에 문자열을 전달하며 결과 문자열을 반환합니다. 입력은 문제의 유효한 범위를 만족합니다. 표준 입력·출력 없이 결과를 반환하세요.
#include <algorithm>
#include <array>
#include <functional>
#include <list>
#include <limits>
#include <memory>
#include <numeric>
#include <queue>
#include <string>
#include <unordered_map>
#include <utility>
#include <vector>
using namespace std;
string solution(const string & text) {
string result = text;
for (char & ch : result) ch = static_cast < char >(ch >= 'A' && ch <= 'Z' ? ch + 32 : ch - 32);
return result;
}
solution(text)에 문자열을 전달하며 결과 문자열을 반환합니다. 입력은 문제의 유효한 범위를 만족합니다. 표준 입력·출력 없이 결과를 반환하세요.
using System;
using System.Collections.Generic;
using System.Text;
public class Solution {
public string Solve(string text) {
var result = new StringBuilder();
foreach(char ch in text) result.Append((char)(ch >= 'A' && ch <= 'Z' ? ch + 32 : ch - 32));
return result.ToString();
}
}
Solution.Solve(string text)에 문자열을 전달하며 결과 문자열을 반환합니다. 입력은 문제의 유효한 범위를 만족합니다. 표준 입력·출력 없이 결과를 반환하세요.
원자료와 확인 범위
2026-10-12에 제공된 학습 자료 섹션 1. 기본문제풀이.pdf의 13쪽 ‘대소문자 변환’와 문제 조건·예제를 대조했습니다. 같은 ZIP의 해당 문제 TXT는 풀이 코드 자료입니다. 이 자료의 최초 출제 원문·저자·공개 배포 주소까지 확인한 것은 아닙니다.
대문자로 통일에서는 문자열 전체에 같은 규칙을 적용했습니다. 이번에는 문자마다 대소문자를 판별해 반대 형태로 바꿉니다.
Node.js 코딩 테스트에서는 표준 입력을 fs.readFileSync(0, "utf8")로 읽을 수 있습니다. 여기서는 한 줄 문자열을 다루므로 입력을 변수에 저장한 뒤 처리하며, trim()은 마지막 개행만 제거하는 함수가 아니라 앞뒤 공백을 모두 제거한다는 점을 알고 사용해야 합니다.
알고리즘 설계
각 위치의 문자를 current라고 두면, current === current.toUpperCase()인지 비교해 대문자인지 판단할 수 있습니다. 대문자라면 결과에는 current.toLowerCase()를 붙이고, 소문자라면 current.toUpperCase()를 붙입니다.
각 문자를 한 번씩 바꾸면 되므로 이전 문자의 변환 결과를 다시 살펴볼 필요는 없습니다.
대문자 찾기에서 익힌 문자 판별에 두 변환 메서드를 연결합니다. 바뀐 문자는 answer에 차례대로 붙입니다.
아래 코드를 solution.js에 저장한 뒤 터미널에서 echo StuDY | node solution.js로 예제 입력을 전달하면 sTUdy가 출력됩니다.
const fs = require("fs");
const input = fs.readFileSync(0, "utf8").trim();
let answer = "";
for (let i = 0; i < input.length; i++) {
const current = input[i];
if (current === current.toUpperCase()) {
answer += current.toLowerCase();
} else {
answer += current.toUpperCase();
}
}
console.log(answer);
입력은 input에 저장하고, 변환 결과는 answer에 누적합니다. 반복이 끝나면 완성된 문자열만 console.log()로 출력합니다.
| 현재 문자 | 추가되는 문자 | 누적 결과 |
|---|---|---|
S |
s |
s |
t |
T |
sT |
u |
U |
sTU |
D |
d |
sTUd |
Y |
y |
sTUdy |
위 표는 제공 학습 자료의 예제 입력 StuDY가 출력 sTUdy로 바뀌는 과정을 보여줍니다. 각 문자가 반대 대소문자로 한 번씩 변환되는지만 확인하면 됩니다.
복잡도와 검증
문자열 길이를 N이라 하면 문자 판별·변환은 N번입니다. 아래 시간 복잡도는 문자열 누적이 효율적으로 처리되는 일반적인 풀이 기준이며, 반복 연결 비용은 JavaScript 엔진 구현에 따라 달라질 수 있습니다. 입력이 100자 이하인 이 문제에서는 충분합니다.
| 항목 | 내용 |
|---|---|
| 시간 복잡도 | O(N), 각 문자를 한 번씩 확인합니다. |
| 입력 저장 공간 | O(N), 입력 문자열 input을 저장합니다. |
| 추가 결과 공간 | O(N), 결과 문자열 answer를 만듭니다. |
trim() 주의 |
앞뒤 공백을 모두 제거하므로, 공백 자체가 의미 있는 문제에서는 사용 여부를 다시 판단해야 합니다. |
2026-10-12에 현재 본문의 전체 코드를 Node.js 24.18.0에서 새로 실행했습니다. 제공 자료 예제의 LF·CRLF 입력 2개와 모두 대문자·모두 소문자·혼합 문자열·길이 100의 자작 입력 4개, 총 6개가 기대값과 일치했습니다. 이 실행은 공식 채점 서비스의 제출 결과를 뜻하지 않습니다.
| 검증 후보 | 확인할 점 |
|---|---|
| 길이가 짧은 문자열 | 반복문이 첫 문자부터 마지막 문자까지 빠짐없이 처리하는지 봅니다. |
| 모두 대문자인 문자열 | 모든 문자가 toLowerCase() 결과로 누적되는지 확인합니다. |
| 모두 소문자인 문자열 | 모든 문자가 toUpperCase() 결과로 누적되는지 확인합니다. |
| 대소문자가 섞인 문자열 | 각 위치의 문자가 독립적으로 반대 대소문자로 바뀌는지 확인합니다. |
인덱스로 한 글자씩 읽는 과정이 낯설다면 문자 찾기: 문자열 순회로 개수 세기에서 반복 흐름을 먼저 복습해 보세요.


이 문제를 푼 뒤 확인하기
대문자·소문자가 번갈아 나오는 입력에서 각 위치의 결과를 적어 보세요.
본문의 예제와 이 반례를 직접 실행해 예상 출력과 비교하고, 결과가 다르면 입력 조건과 반복 범위를 다시 확인하세요.
이 글이 도움이 되었나요?
이어서 공부하기
체크포인트: 해설을 가리고 다시 풀고, 경계 입력을 하나 바꾸어 예상 결과와 실제 결과를 비교하세요. 같은 문자·찾는 문자 없음·홀짝 길이를 확인하고 결과의 등장 순서를 설명하세요.
다음 추천 · 문제: 가장 긴 문자열 풀이
권장 순서는 학습 가이드와 같습니다. 다른 순서는 접힌 참고 목록에서 확인할 수 있습니다. 읽음 표시는 숙달이나 채점 결과가 아닙니다.
원래 과정 목록 순서 (선택)
읽음 기록
읽음 — / 전체 58개 · 필수 58개
새 글 받아보기
RSS 리더에서 BlogFlow의 새 글을 확인할 수 있습니다.