본문 바로가기
알고리즘 스터디/백준 알고리즘 기초 1

[백준 9093번 단어 뒤집기 - node.js] [알고리즘 기초 1/2]

by 레일라오리덕 2021. 7. 28.
728x90

https://www.acmicpc.net/problem/9093

 

9093번: 단어 뒤집기

첫째 줄에 테스트 케이스의 개수 T가 주어진다. 각 테스트 케이스는 한 줄로 이루어져 있으며, 문장이 하나 주어진다. 단어의 길이는 최대 20, 문장의 길이는 최대 1000이다. 단어와 단어 사이에는

www.acmicpc.net

 

문제

 

문장이 주어졌을 때, 단어를 모두 뒤집어서 출력하는 프로그램을 작성하시오. 단, 단어의 순서는 바꿀 수 없다. 단어는 영어 알파벳으로만 이루어져 있다.

 

입력

 

첫째 줄에 테스트 케이스의 개수 T가 주어진다. 각 테스트 케이스는 한 줄로 이루어져 있으며, 문장이 하나 주어진다. 단어의 길이는 최대 20, 문장의 길이는 최대 1000이다. 단어와 단어 사이에는 공백이 하나 있다.

 

출력

 

각 테스트 케이스에 대해서, 입력으로 주어진 문장의 단어를 모두 뒤집어 출력한다.

 

예제 입출력

 

입력 출력
2
I am happy today
We want to win the first prize
I ma yppah yadot
eW tnaw ot niw eht tsrif ezirp

풀이[node.js]

 

 

728x90

input[0]은 입력되는 문자열의 길이이므로, 이 길이인 cases만큼 배열을 돌면서, 각 요소를 공백을 기준으로 나누어주어 splited에 대입해주었습니다.

이 splited를 각각 돌면서, splited를 각 단어별로 split해주고, 그 배열을 reverse해 준 후에, 다시 문자열들을 합쳐서 answer에 넣어주고, 이 answer값을 출력해주었습니다.

var fs = require('fs');
var input = fs.readFileSync('/dev/stdin').toString().split('\n');
var cases = input[0];
var answer = '';

for(var i=1; i<= cases; i++){
    var splited = input[i].split(' ');
    for(var j in splited){
        answer = answer + splited[j].split('').reverse().join('')+' ';
    }
    answer += '\n';
}

console.log(answer);

위의 방식은 간단하게 해결한 방식이고, stack을 사용하진 않았습니다.

아래는 각 splited된 값을 체크하여 splited[j]가 공백이 아닌 경우에는 stack에 해당 값을  push해주었습니다.

그리고, splited[j]가 공백인 경우, stack에 모인 값들을 뒤집어서 join으로 합쳐주고 answer에 값을 대입해주었습니다.

여기서, splited를 원래 배열보다 1번 더 돌도록 splited.length까지 j를 돌렸는데, 그 이유는 I am happy today에서 I, am, happy는 단어의 마지막에 공백이 존재해서 공백을 만나면 stack에 있는 값을 제거해줄 수 있습니다.

하지만, today 다음에는 공백이 없기 때문에, stack에 있는 today를 뒤집어서 answer에 넣어줄 방법이 없습니다.

그렇기에, 자바스크립트의 특성을 활용하여, 배열보다 한 길이 더 돌면서 undefined값이 나오게 된다면 stack의 값을 뒤집어서 answer에 대입할 수 있게 하였고, 만약 splited[j]가 공백이었다면, 삼항 연산자를 활용하여 공백을 answer에 추가적으로 대입해주었고, 아니라면(undefined)라면 아무것도 추가하지 않도록 해주었습니다.

그리고, 하나의 splited를 돌고 나오면 개행문자를 넣어주었습니다.

var fs = require('fs');
var input = fs.readFileSync('/dev/stdin').toString().trim().split('\n');
var cases = input[0];
var stack = [];
var answer = '';
for(var i=1; i<=cases; i++){
	var splited = input[i].split('');
	for(var j=0; j<=splited.length; j++){
        if(splited[j] === ' '||splited[j] === undefined){
            answer += stack.reverse().join('').trim() + (splited[j] === ' ' ? ' ' : '');
            stack = [];
        }else{
            stack.push(splited[j]);
        }
    }
    answer += '\n';
}
console.log(answer);
728x90

댓글