각 단어가 처음 등장한 위치와 현재 위치를 비교하면 별도의 정렬 없이 입력 순서를 유지할 수 있습니다. 해설과 정답은 아래 접힌 영역에서 확인해 보세요.
문제
자연수 N과 문자열 N개가 한 줄에 하나씩 주어집니다. 같은 문자열이 여러 번 나오면 처음 등장한 한 개만 남기고, 남은 문자열을 원래 입력 순서대로 한 줄씩 출력해야 합니다.
| 구분 | 내용 |
|---|---|
| 입력 | 첫 줄에 N, 다음 N줄에 문자열 |
| 제한 | 3 ≤ N ≤ 30, 각 문자열 길이 100 이하 |
| 출력 | 중복을 제거한 문자열을 최초 등장 순서대로 한 줄씩 출력 |
| 예제 | good, time, good, time, student → good, time, student |
풀이와 정답
풀이와 정답 보기 (클릭)
제공된 풀이의 주요 조건은 배열을 앞에서부터 순회하면서 현재 단어의 위치와 그 단어가 처음 나타난 위치를 비교하는 것입니다. 두 위치가 같을 때만 남기면 중복 단어는 제거되고 최초 등장 순서는 자연스럽게 유지됩니다.
알고리즘 설계

filter의 콜백은 현재 단어와 인덱스를 받습니다. words.indexOf(word)는 같은 단어가 배열에서 처음 등장한 인덱스를 반환합니다. 이 값이 현재 index와 같으면 첫 등장이므로 true를 반환하고, 다르면 앞에서 이미 나온 단어이므로 false를 반환합니다.
| 현재 단어 | 현재 위치 | 최초 위치 | 처리 |
|---|---|---|---|
good |
0 | 0 | 남김 |
time |
1 | 1 | 남김 |
good |
2 | 0 | 제거 |
time |
3 | 1 | 제거 |
student |
4 | 4 | 남김 |
JavaScript 풀이

표준 입력 전체를 줄 단위로 나누고 첫 줄의 개수만큼만 단어 배열로 사용합니다. /r?n/ 정규식은 LF와 CRLF 줄바꿈을 모두 처리합니다. 전체 입력에 trim()을 사용하지 않아 문자열 앞뒤의 실제 공백을 함께 지우지 않으며, 마지막의 빈 줄은 slice(1, wordCount + 1) 범위 밖이므로 결과에 영향을 주지 않습니다.
const fs = require("fs");
const lines = fs.readFileSync(0, "utf8").split(/r?n/);
const wordCount = Number(lines[0]);
const words = lines.slice(1, wordCount + 1);
const uniqueWords = words.filter((word, index) => {
return words.indexOf(word) === index;
});
console.log(uniqueWords.join("n"));
복잡도와 검증
filter가 N번 실행되고 각 단계의 indexOf가 앞에서부터 최대 N개 단어를 비교하므로 시간 복잡도는 O(N²)입니다. 문자열 비교 비용까지 나타내면 최대 문자열 길이를 L이라고 할 때 O(N²L)입니다. 입력 배열과 결과 배열은 합쳐서 O(NL) 공간을 사용하며, 중복 제거 로직의 결과 배열을 제외한 추가 변수는 O(1)입니다.
| 검증 | 입력 특징 | 기대 출력 |
|---|---|---|
| 원문 예제 | 일부 단어 반복 | good, time, student |
| 중복 없음 | red, blue, green |
세 단어 모두 유지 |
| 모두 같음 | same, same, same |
same |
| 첫·끝 중복 | a, b, c, a |
a, b, c |
같은 원리를 문자 단위로 확인하려면 중복문자제거 JavaScript 풀이도 함께 살펴볼 수 있습니다.
풀이 전에 확인할 순서
- 입력값과 출력값을 한 문장으로 다시 적습니다.
- 반복할 대상과 비교·저장할 값을 정합니다.
- 필요한 자료구조와 시간복잡도를 예상합니다.
- 코드를 보기 전에 손으로 작은 예제를 계산합니다.
힌트: 중복단어제거 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의 새 글을 확인할 수 있습니다.