728x90
반응형

 

 

백준 17413번 Node.js(자바스크립트) 풀이 


❓ 문제

문자열 S가 주어졌을 때, 이 문자열에서 단어만 뒤집으려고 한다.

먼저, 문자열 S는 아래와과 같은 규칙을 지킨다.

  1. 알파벳 소문자('a'-'z'), 숫자('0'-'9'), 공백(' '), 특수 문자('<', '>')로만 이루어져 있다.
  2. 문자열의 시작과 끝은 공백이 아니다.
  3. '<'와 '>'가 문자열에 있는 경우 번갈아가면서 등장하며, '<'이 먼저 등장한다. 또, 두 문자의 개수는 같다.

태그는 '<'로 시작해서 '>'로 끝나는 길이가 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

 


 

728x90
반응형