Notice
Recent Posts
Recent Comments
Link
| 일 | 월 | 화 | 수 | 목 | 금 | 토 |
|---|---|---|---|---|---|---|
| 1 | 2 | 3 | ||||
| 4 | 5 | 6 | 7 | 8 | 9 | 10 |
| 11 | 12 | 13 | 14 | 15 | 16 | 17 |
| 18 | 19 | 20 | 21 | 22 | 23 | 24 |
| 25 | 26 | 27 | 28 | 29 | 30 | 31 |
Tags
- 자바편
- 자료구조와함께배우는알고리즘입문
- 코드로배우는스프링부트웹프로젝트
- 스프링 시큐리티
- 네트워크 설정
- d
- 데비안
- ㅒ
- /etc/network/interfaces
- 자료구조와 함께 배우는 알고리즘 입문
- 선형대수
- 처음 만나는 AI 수학 with Python
- 알파회계
- iterator
- GIT
- network configuration
- 리눅스
- 페이징
- 처음 만나는 AI수학 with Python
- 티스토리 쿠키 삭제
- resttemplate
- baeldung
- Kernighan의 C언어 프로그래밍
- 목록처리
- 서버설정
- 스프링부트핵심가이드
- 친절한SQL튜닝
- 코드로배우는스프링웹프로젝트
- 구멍가게코딩단
- 이터레이터
Archives
- Today
- Total
bright jazz music
345. Reverse Vowels of a String 본문
function reverseVowels(s:string): string {
// const vowels = ['a','e','i','o','u','A','E','I','O','U'];
const vowels = new Set(['a','e','i','o','u','A','E','I','O','U']);
let arr = s.split('');
let left = 0;
let right = arr.length -1;
while( left < right) {
// while(left < right && !vowels.includes(arr[left])){
while(left < right && !vowels.has(arr[left])){
left++;
}
// while(left < right && !vowels.includes(arr[right])){
while(left < right && !vowels.has(arr[right])){
right--;
}
[arr[left], arr[right]] = [arr[right], arr[left]];
left++;
right--;
}
return arr.join('');
}
// function reverseVowels(s: string): string {
// const vowels = ['a','e','i','o','u','A','E','I','O','U'];
// let map = new Map();
// // 속하면 일단 보관한다
// // 순서와 값을 추가하면 되겠지
// // ㄴㄴ
// for (let i = 0; i < s.length; i++) {
// if(vowels.includes(s[i])) {
// map.set(i, s[i])
// }
// }
// console.log(map)
// return s;
// };
투 포인터로 푸는 게 나은 문제였다. 나는 원래 아래와 같이 풀려고 했다.
function reverseVowels(s: string): string {
const vowels = ['a','e','i','o','u','A','E','I','O','U'];
let map = new Map();
// 모음 위치와 값 저장
for (let i = 0; i < s.length; i++) {
if(vowels.includes(s[i])) {
map.set(i, s[i])
}
}
// Map의 값들을 배열로 추출해서 뒤집기
const reversedVowels = Array.from(map.values()).reverse();
// 문자열을 배열로 변환
const arr = s.split('');
let vowelIndex = 0;
// 모음 위치에 reversed 값 넣기
for (let i = 0; i < arr.length; i++) {
if(vowels.includes(arr[i])) {
arr[i] = reversedVowels[vowelIndex++];
}
}
return arr.join('');
}
AI는 이런 사고를 했다고 한다.
1. 문제 핵심 파악
"reverse vowels" → 모음들끼리만 순서를 뒤집어야 함
자음 위치는 그대로 유지
2. "뒤집는다"는 키워드에서 떠오르는 것
배열 reverse: 양 끝에서 시작해서 중간으로 모이기
"앞에서 첫 번째 모음"과 "뒤에서 첫 번째 모음"을 swap하면 되겠다!
3. Two Pointer 패턴 인식
hello
^ ^ 양쪽에서 출발
e o 모음 찾으면 swap
이 패턴은 "양 끝에서 조건 만족하는 것 찾아서 처리"할 때 자주 씁니다:
Palindrome 체크
Container with most water
정렬된 배열에서 두 수의 합 찾기
4. 왜 Map보다 나은가 깨달음
Map: 전체 순회 → 저장 → 뒤집기 → 다시 순회 (2번 순회)
Two Pointer: 한 번 순회하면서 바로 swap (1번 순회)
경험상 깨달은 팁:
"reverse", "opposite ends", "from both sides" 같은 키워드 보이면 → Two Pointer 의심
공간복잡도 줄이고 싶으면 → in-place 수정 방법 고민
이미 순서/위치 정보가 중요하면 → 포인터로 위치 추적'LeetCode' 카테고리의 다른 글
| 334. Increasing Triplet Subsequence (0) | 2026.01.17 |
|---|---|
| 238. Product of Array Except Self (0) | 2026.01.16 |
| 151. Reverse Words in a String (0) | 2026.01.15 |
| 605. Can place flowers (0) | 2026.01.13 |
Comments
