문자열을 한 번씩 살펴보면서 현재까지 가장 긴 값을 유지하는 방법을 생각해 보세요. 해설과 정답은 아래 접힌 영역에서 확인할 수 있습니다.
문제
자연수 N과 문자열 N개가 주어질 때 길이가 가장 긴 문자열 하나를 출력하는 문제입니다. N은 3 이상 30 이하이고, 각 문자열의 길이는 100 이하입니다. 원문 자료에는 각 문자열의 길이가 서로 다르다고 적혀 있습니다.
| 구분 | 내용 |
|---|---|
| 입력 | 첫 줄에 N, 다음 N개 줄에 문자열 하나씩 |
| 출력 | 가장 긴 문자열 |
| 예제 입력 | 5 |
| 예제 출력 | beautiful |
제공 예제에서는 teacher와 student가 모두 7자로, “길이는 서로 다르다”는 제한 문구와 맞지 않습니다. 다만 두 문자열 모두 최장 문자열이 아니므로 예제의 정답 beautiful에는 영향이 없습니다. 자료에 없는 동률 선택 규칙은 따로 가정하지 않습니다.
풀이와 정답
풀이와 정답 보기 (클릭)
핵심은 현재까지 확인한 문자열 가운데 가장 긴 값을 한 변수에 저장하는 것입니다. 처음에는 첫 문자열을 정답 후보로 두고, 이후 문자열이 더 길 때만 후보를 교체합니다.
알고리즘 설계

문자열을 왼쪽부터 한 번 순회합니다. 반복문의 각 단계가 끝나면 longest에는 지금까지 본 문자열 중 가장 긴 값이 남습니다. 새 문자열이 더 길면 교체하고, 그렇지 않으면 그대로 두므로 마지막 문자열까지 확인한 뒤에는 전체 최장 문자열이 정답이 됩니다.
제공된 풀이 시도도 별도의 최댓값과 정답 문자열을 함께 갱신하는 올바른 방향입니다. 완성 코드에서는 첫 문자열을 기준값으로 사용해 숫자 센티널을 없애고, Node.js 표준 입력 처리만 더했습니다.
| 현재 문자열 | 길이 | 처리 뒤 longest |
|---|---|---|
teacher |
7 | teacher |
time |
4 | teacher |
student |
7 | teacher |
beautiful |
9 | beautiful |
good |
4 | beautiful |
JavaScript 풀이

fs.readFileSync(0, "utf8")로 입력 전체를 읽고 /r?n/으로 나누면 LF와 CRLF 줄바꿈을 모두 처리할 수 있습니다. 첫 줄은 개수로 변환하고, 이어지는 정확히 N개 줄만 문자열 목록으로 사용합니다. 전체 입력에 trim()을 적용하지 않으므로 앞뒤 공백을 함께 제거하는 부작용도 피합니다.
const fs = require("fs");
const lines = fs.readFileSync(0, "utf8").split(/r?n/);
const count = Number(lines[0]);
const words = lines.slice(1, count + 1);
let longest = words[0];
for (let index = 1; index < count; index += 1) {
if (words[index].length > longest.length) {
longest = words[index];
}
}
console.log(longest);
비교 연산은 >를 사용합니다. 유효한 입력에서는 길이가 서로 다르다는 제한 때문에 최장 길이 동률이 생기지 않습니다. 예제의 7자 동률에서도 두 값이 최장값이 아니어서 최종 출력은 그대로입니다.
복잡도와 검증
최장 문자열을 선택하는 반복은 문자열 수 N에 비례하므로 O(N)입니다. 입력을 줄로 나누는 비용까지 포함하면 전체 문자 수를 M이라고 할 때 O(M)입니다. 입력 문자열 배열은 O(M) 공간을 사용하지만, 선택 로직이 추가로 쓰는 공간은 longest와 반복 인덱스뿐이어서 입력을 제외하면 O(1)입니다.
| 검증 | 입력 특징 | 기대 출력 |
|---|---|---|
| 원문 예제 LF·CRLF | 중간 위치가 최장 | beautiful |
| 첫 값 최장 | abcdef, b, ccc |
abcdef |
| 마지막 값 최장 | a, bb, cccc |
cccc |
| 최대 길이 | 100자 문자열 포함 | 100자 문자열 |
저장된 완성 코드는 원문 예제의 LF와 CRLF 입력, 최장값의 처음·중간·마지막 위치, 길이 100 경계값을 실행해 기대 출력과 일치하는지 확인합니다.
같이 읽으면 좋은 글
풀이 전에 확인할 순서
- 입력값과 출력값을 한 문장으로 다시 적습니다.
- 반복할 대상과 비교·저장할 값을 정합니다.
- 필요한 자료구조와 시간복잡도를 예상합니다.
- 코드를 보기 전에 손으로 작은 예제를 계산합니다.
힌트: 가장 긴 문자열 JavaScript 풀이
정답 코드를 바로 따라 쓰기보다, 본문에서 값이 갱신되는 조건과 반복 범위를 먼저 찾으세요. 반복 한 번마다 반드시 유지되어야 하는 값이 무엇인지 적으면 풀이의 중심 변수를 고르기 쉽습니다.
테스트 확인
- 가능한 가장 작은 입력
- 같은 값이나 문자가 반복되는 입력
- 정답이 처음 또는 마지막 위치에서 결정되는 입력
- 입력 제한에 가까운 경우의 실행 시간
확인 결과: 본문의 예제뿐 아니라 위 경계 사례에서도 예상값과 실제 출력이 같아야 풀이가 완료됩니다.
이 글이 도움이 되었나요?
코딩테스트 JavaScript 학습 순서
필수 49개 · 전체 49개
읽음 기록 관리
전체 과정 목차 (49개)
- 필수 길잡이 · 코딩테스트 JS 자료구조 로드맵: 배열, 해시, 스택, 투 포인터 순서
- 필수 학습 · 세 수 중 최솟값 JavaScript 조건문 풀이 정리
- 필수 학습 · 삼각형 판별하기 JavaScript 풀이
- 필수 학습 · 연필 개수 JavaScript 풀이
- 필수 학습 · 1부터 N까지 합 출력하기 JavaScript 풀이
- 필수 학습 · 최솟값 구하기 JavaScript 풀이|배열 순회와 비교 갱신 원리
- 필수 학습 · 홀수 JavaScript 풀이: 조건 판별과 결과 처리 정리
- 필수 학습 · 10부제 JavaScript 풀이: 끝자리 비교로 위반 차량 수 세기
- 필수 학습 · A를 #으로 JavaScript 풀이: 문자열 순회와 치환
- 필수 학습 · 문자 찾기 JavaScript 풀이: 문자열 순회로 개수 세기
- 필수 학습 · 대문자 찾기 JavaScript 풀이
- 필수 학습 · 대문자로 통일 JavaScript 풀이
- 필수 학습 · 대소문자 변환 JavaScript 풀이
- 필수 학습 · 일곱 난쟁이 JavaScript 풀이: 두 명을 제외하는 완전탐색
- 필수 학습 · 코딩테스트 JS Map 풀이: 학급 회장 득표수 세기
- 필수 학습 · 코딩테스트 JS 스택 풀이: 올바른 괄호 검증하기
- 필수 학습 · 코딩테스트 JS 스택 풀이: 괄호문자 제거하기
- 필수 학습 · 코딩테스트 JS 스택 풀이: 크레인 인형뽑기 처리법
- 필수 학습 · 코딩테스트 JS 스택 풀이: 후위식 연산 계산하기
- 필수 학습 · 코딩테스트 JS 스택 풀이: 쇠막대기 레이저 절단 개수 세기
- 필수 학습 · 코딩테스트 JS 투 포인터 풀이: 두 정렬 배열 합치기
- 필수 학습 · 코딩테스트 JS 투 포인터 풀이: 공통 원소 추출하기
- 필수 학습 · 코딩테스트 JS 슬라이딩 윈도우 풀이: 최대 매출 구간 합 계산하기
- 필수 학습 · JavaScript 투 포인터: 합이 M인 연속 부분수열 개수
- 필수 학습 · 코딩테스트 JS 해시 풀이: 모든 아나그램 찾기
- 필수 학습 · 가장 긴 문자열 JavaScript 풀이 현재 글
- 필수 학습 · 가운데 문자 출력 JavaScript 풀이
- 필수 학습 · 중복문자제거 JavaScript 풀이
- 필수 학습 · 코딩테스트 JS 고급: 최소 힙으로 다익스트라 최단 경로 구하기
- 필수 학습 · 코딩테스트 JS Union-Find: 연결 성분 수와 크기 구하기
- 필수 학습 · 코딩테스트 JS Trie: 접두사에 맞는 단어 수 세기
- 필수 학습 · 코딩테스트 JS Fenwick Tree: 값 갱신과 구간 합 처리
- 필수 학습 · 코딩테스트 JS 세그먼트 트리: 단일 대입과 구간 합
- 필수 학습 · 코딩테스트 JS LRU 캐시: 지도 타일 재사용 기록
- 필수 학습 · 코딩테스트 JS AVL 트리: 기준 이상 최솟값 찾기
- 필수 학습 · 코딩테스트 JS 큐: 상담 창구 대기열 명령 처리
- 필수 학습 · 코딩테스트 JS 연결 리스트: 재생 대기 목록 관리
- 필수 학습 · JavaScript 원형 덱 연습: 최근 기록 창과 되돌리기
- 필수 학습 · JavaScript 해시 테이블 연습: 정규화 문자열 빈도와 등장 순서
- 필수 학습 · JavaScript 트리 순회 연습: 깊이별 노드 묶기
- 필수 학습 · JavaScript BST 연습: 닫힌 구간의 중복 키 보고서
- 필수 학습 · JavaScript 최소 힙 연습: 동률 순서를 지키는 작업 스케줄러
- 필수 학습 · JavaScript 그래프 연습: 연결 구역 크기를 작은 순서로 출력하기
- 필수 학습 · 중복단어제거 JavaScript 풀이
- 필수 학습 · TypeScript 이진 탐색 연습: 숫자 카드 존재 여부 확인
- 필수 학습 · 큰 수 출력하기 JavaScript 풀이
- 필수 학습 · 보이는 학생 JavaScript 풀이
- 필수 학습 · 가위바위보 JavaScript 풀이
- 필수 학습 · 점수계산 JavaScript 풀이
새 글 받아보기
RSS 리더에서 BlogFlow의 새 글을 확인할 수 있습니다.