✏️기록하는 즐거움
article thumbnail

Link

 

10926번: ??!

준하는 사이트에 회원가입을 하다가 joonas라는 아이디가 이미 존재하는 것을 보고 놀랐다. 준하는 놀람을 ??!로 표현한다. 준하가 가입하려고 하는 사이트에 이미 존재하는 아이디가 주어졌을 때

www.acmicpc.net

문제

준하는 사이트에 회원가입을 하다가 joonas라는 아이디가 이미 존재하는 것을 보고 놀랐다. 준하는 놀람을??!로 표현한다. 준하가 가입하려고 하는 사이트에 이미 존재하는 아이디가 주어졌을 때, 놀람을 표현하는 프로그램을 작성하시오.

입력 > 첫째 줄에 준하가 가입하려고 하는 사이트에 이미 존재하는 아이디가 주어진다. 아이디는 알파벳 소문자로만 이루어져 있으며, 길이는 50자를 넘지 않는다.
출력 > 첫째 줄에 준하의 놀람을 출력한다. 놀람은 아이디 뒤에 ??!를 붙여서 나타낸다.

 

제출

const fs = require("fs");

const stdin = (
  process.platform === "linux"
    ? fs.readFileSync("/dev/stdin").toString()
    : `joonas`
).trim();

console.log(`${stdin}??!`);

 

풀이과정

TRY 1. split()을 사용하지 않고 stdin[0]으로 출력했을 때
const fs = require("fs");

const stdin =
  process.platform === "linux"
    ? fs.readFileSync("/dev/stdin").toString()
    : `joonas`;

console.log(typeof stdin); // string
console.log(`${stdin[0]}??!`); // j??!

typeof는 데이터 타입을 확인할 수 있는 연산자이다.

split를 사용하지 않으면 stdin에 'joonas'가 대입되어 데이터 타입이 string이 된다.
따라서 stdin[0]을 쓰게 되면 string을 하나씩 분리하여 출력하게 된다.

 

TRY 2. split()을 사용하지 않고 stdin으로 출력했을 때
const fs = require("fs");

const stdin =
  process.platform === "linux"
    ? fs.readFileSync("/dev/stdin").toString()
    : `joonas`;

console.log(typeof stdin); // string
console.log(`${stdin}??!`); // joonas??!

const pattern = /\s/g; // 공백 체크 정규표현식 - 탭, 스페이스
if (stdin.match(pattern)) {
  console.log("공백이 있습니다.");
} else {
  console.log("공백이 없습니다.");
} // 공백이 없습니다.

데이터 형태도 string이고 joonas??!로 출력이 잘 되는데도 백준에서는 틀렸다는 결과가 나왔다.

혹시나 공백이 존재하나 싶어서 체크해봤지만 공백도 없었다.

아마도 직접 입력한 값에는 공백이 없지만 백준 사이트 내 입력값에는 공백이 있는 듯싶다.

 

[ 공백 체크에 관해 참고한 글 ]

 

TRY 3. split()을 사용했을 때
const fs = require("fs");

const stdin = (
  process.platform === "linux"
    ? fs.readFileSync("/dev/stdin").toString()
    : `joonas`
).split(" ");

console.log(typeof stdin); // object
console.log(`${stdin}??!`); // joonas??!

split()은 string 객체를 지정한 구분자(separator)를 이용해서 문자열을 나눠준다.

문자열에서 구분자가 포함되면 해당 부분은 삭제되고 남은 문자열이 배열로 반환된다.
구분자가 포함되지 않거나 생략되었을 경우 배열은 원본 문자열을 유일한 원소로 갖게 된다.

 

현재 주어진 입력값인 joonas에는 공백이 없으므로 object로 반환되면서

결괏값은 잘 나와도 백준에서는 틀린 값으로 인식되는 것 같다.😂

 

추가로, 입력값의 마지막에 개행 문자가 포함되는 경우 split을 사용하면 공백 문자인 요소 하나를 더 갖는 배열을 반환하기 때문에 이를 방지하기 위해서 trim()을 사용한다고 한다.

const text = '가\n나\n다\n';
console.log(text.split('\n')); // ['가', '나', '다', '']
console.log(text.trim().split('\n')); // ['가', '나', '다']

[ split에 대해 참고한 글 ]

 

TRY 4. trim()을 사용했을 때
const fs = require("fs");

const stdin = (
  process.platform === "linux"
    ? fs.readFileSync("/dev/stdin").toString()
    : `joonas`
).trim();

console.log(typeof stdin); // string
console.log(`${stdin}??!`); // joonas??!

const pattern = /\s/g; // 공백 체크 정규표현식 - 탭, 스페이스
if (stdin.match(pattern)) {
  console.log("공백이 있습니다.");
} else {
  console.log("공백이 없습니다.");
} // 공백이 없습니다.

2번째 시도와 같은 결과가 나왔지만 드디어 백준 사이트에서 맞았다는 결과가 나왔다. 🎊

만약 문자 사이에 공백이 있는 것이 아니라면 split 보다는 trim을 사용하는 것이 원치 않는 결과를 방지하기 위해서 더 좋을 것 같다.

개념

.trim()

  • 문자열 양 끝의 공백을 제거하는 메서드
  • 문자열에 공백이 없어도 예외가 발생하지 않고 새 문자열이 반환된다.

`(baektick, 백틱)

고양이 문제에서 사용했던 백틱을 이용했다.

 

[백준] 10171: 고양이 (javascript)

Link 10171번: 고양이 아래 예제와 같이 고양이를 출력하시오. www.acmicpc.net 문제 제출 console.log(`\\ /\\ ) ( ') ( / ) \\(__)|`); 개념 `(backtick, 백틱) Template literals(템플릿 리터럴) 작은 따옴표(..

codingmyoni.tistory.com

 

 


Comment

코드를 뜯어가며 공부할 수 있는 계기가 된 문제였다!

이전 문제들에서 fs모듈을 사용하면서 어느 정도 이해를 하고 넘어갔다고 생각했는데 안일한 생각이었다.🥲

해당 메소드는 왜 사용하는지 잘 이해하고 넘어가자 :)

profile

✏️기록하는 즐거움

@nor_coding

포스팅이 좋았다면 "좋아요❤️" 또는 "구독👍🏻" 해주세요!