백준 17413번 Node.js(자바스크립트) 풀이
❓ 문제
문자열 S가 주어졌을 때, 이 문자열에서 단어만 뒤집으려고 한다.
먼저, 문자열 S는 아래와과 같은 규칙을 지킨다.
- 알파벳 소문자('a'-'z'), 숫자('0'-'9'), 공백(' '), 특수 문자('<', '>')로만 이루어져 있다.
- 문자열의 시작과 끝은 공백이 아니다.
- '<'와 '>'가 문자열에 있는 경우 번갈아가면서 등장하며, '<'이 먼저 등장한다. 또, 두 문자의 개수는 같다.
태그는 '<'로 시작해서 '>'로 끝나는 길이가 3 이상인 부분 문자열이고, '<'와 '>' 사이에는 알파벳 소문자와 공백만 있다. 단어는 알파벳 소문자와 숫자로 이루어진 부분 문자열이고, 연속하는 두 단어는 공백 하나로 구분한다. 태그는 단어가 아니며, 태그와 단어 사이에는 공백이 없다.
💻 입력
첫째 줄에 문자열 S가 주어진다. S의 길이는 100,000 이하이다.
📈 출력
첫째 줄에 문자열 S의 단어를 뒤집어서 출력한다.
👩🏻 내가 제출한 코드
const input = require('fs').readFileSync("dev/stdin").toString().trim();
let result = '';
let word = '';//임시저장
let tags= false;
for(let i=0;i<input.length;i++){
let char = input[i];
if(char === '<'){
if(word){
result += word.split('').reverse().join("");//만일 < 전에 단어가 있으면 붙여놓는거
word='';
}
result += char;
tags = true;
}
else if(char === '>'){
tags=false;
result += char;
}
else if(tags){
result += char;
}
else if(char === ' '){
if(word){
result += word.split('').reverse().join("");//만일 < 전에 단어가 있으면 붙여놓는거
word='';
}
result += char;//문자열에 공백 추가
}
else{
word += char;
}
}
// 문자열 끝에 남아 있는 단어가 있다면 뒤집어서 결과에 추가
if (word) {
result += word.split('').reverse().join('');
}
console.log(result);
👩🏻💻 풀이
let result = ''; //결과를 저장할 빈 문자열
let word = ''; //현재 단어를 임시로 저장할 문자열
let tags = false; //태그 안에 있는지 여부를 확인하는 플래그
for(let i=0;i<input.length;i++){
let char = input[i];
//1. 태그 시작을 발견했을 때
if(char === '<'){
if(word){// 태그 시작 전에 처리 중이던 단어가 있다면 뒤집어서 결과에 추가
result += word.split('').reverse().join("");
word='';// 처리가 끝난 단어 초기화
}
result += char;// 결과 문자열에 태그 시작 기호('<') 추가
tags = true; // 태그 안에 들어갔음을 표시
}
//2. 태그 끝을 발견했을 때
else if(char === '>'){
tags=false; // 태그에서 나왔음을 표시
result += char;// 결과 문자열에 태그 끝 기호('>') 추가
}
//3. 태그 내부의 문자 처리
else if(tags){
result += char; // 태그 내부의 문자는 그대로 결과에 추가
}
//4. 공백 문자를 만났을 때
else if(char === ' '){
if(word){// 공백 전에 단어가 있었다면 뒤집어서 결과에 추가
result += word.split('').reverse().join("");
word='';// 처리가 끝난 단어 초기화
}
result += char;//문자열에 공백 추가
}
//5. 일반적인 단어의 문자 처리
else{
word += char; // 현재 단어에 문자 추가
}
}
>> split( ) : 문자열을 일정한 구분자로 잘라서 배열로 저장
>> reverse( ) : 문자열을 역순으로 뒤집는 함수
>> join( ) : 배열의 원소를 문자열로 합치기
// 문자열 끝에 남아 있는 단어가 있다면 뒤집어서 결과에 추가
if (word) {
result += word.split('').reverse().join('');
}
console.log(result); // 최종 문자열 반환
🤓문제 풀면서 느꼈던 점이나 고민했던 점
나는 for..in문이나 for..of문을 사용하려고 했었는데 특수문자를 체크해야만 하는 문제였다.
'<'이 문자에서부터 '>' 이 문자까지의 요소들을 다르게 체크하는 방법을 고민했었는데
변수 tags로 true/false를 이용해 처리하면 되었던 것이다!! 생각보다 쉬운 부분이었는데 어렵게 생각한 것 같다.
그리고 word라는 임시 저장소를 만들고 처리가 끝난 단어는 임시저장소에서 초기화 시켜서
< > 태그 안에 있는 단어와 뒤집어야 하는 단어를 구분지었다.
제일 마지막에 한번 더 if문을 넣어줬던 이유가 [예제 입력 4번]처럼 태그 없이 단어만 나열되어있는 경우
[4.공백문자 처리]에서 공백 전에 저장된 단어들만 처리되기 때문에 제일 마지막에 있는 문자는 [5.일반적인 문자처리]에
word에 저장되고 끝나버린다. 그래서 제일 마지막에 word에 문자가 남아있으면 뒤집으라는 if문을 한번 더 써준 것이다.
사실 내 머리 속에서 이걸 술술 다 풀어냈으면 엄청 뿌듯했겠지만 아직 모르는 것 투성이라서 chatGPT랑 많은 개발블로그
선배님들의 힌트를 보면서 했다. 코딩테스트 공부는 처음이라 아직은 생각해내는게 서툴지만 너무 재밌다.
🔗문제 링크
https://www.acmicpc.net/problem/17413
17413번: 단어 뒤집기 2
문자열 S가 주어졌을 때, 이 문자열에서 단어만 뒤집으려고 한다. 먼저, 문자열 S는 아래와과 같은 규칙을 지킨다. 알파벳 소문자('a'-'z'), 숫자('0'-'9'), 공백(' '), 특수 문자('<', '>')로만 이루어져
www.acmicpc.net
'Coding With Jina > Coding Test' 카테고리의 다른 글
[알고리즘] 에라토스테네스의 체 (0) | 2024.04.25 |
---|---|
[코딩테스트] 백준 2609번 Node.js(자바스크립트) 풀이 (0) | 2024.04.24 |
[코딩테스트] 백준 1157번 Node.js(자바스크립트) 풀이 (0) | 2024.04.23 |
[코딩테스트] 백준 11720번 Node.js(자바스크립트) 풀이 (0) | 2024.04.23 |
[코딩테스트] 백준 9046번 Node.js(자바스크립트) 풀이 (0) | 2024.04.22 |