<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0">
  <channel>
    <title>딩코딩 :  Computer Science 블로그</title>
    <link>https://dingcoding.tistory.com/</link>
    <description>컴퓨터공학과 대학생입니다.
코딩, 알고리즘, 머신러닝 등
Computer Science 관련 
공부하는 내용 업로드합니다.</description>
    <language>ko</language>
    <pubDate>Thu, 2 Jul 2026 15:39:07 +0900</pubDate>
    <generator>TISTORY</generator>
    <ttl>100</ttl>
    <managingEditor>DingCoDing</managingEditor>
    <image>
      <title>딩코딩 :  Computer Science 블로그</title>
      <url>https://tistory1.daumcdn.net/tistory/5042740/attach/6ddec645e05e4e62ad9a52dcc7702d7b</url>
      <link>https://dingcoding.tistory.com</link>
    </image>
    <item>
      <title>[TypeOrm] leftjoin and pagination</title>
      <link>https://dingcoding.tistory.com/395</link>
      <description>&lt;pre id=&quot;code_1678344093087&quot; class=&quot;typescript&quot; data-ke-language=&quot;typescript&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;        const [todos, count] = await this.repository.createQueryBuilder('todo')
                .leftJoinAndSelect('todo.subtodos', 'subtodo')
                .where('todo.user = :userId', { userId })
                .orderBy('todo.createdAt', 'DESC')
                .skip(skip)
                .take(limit)
                .getManyAndCount();&lt;/code&gt;&lt;/pre&gt;</description>
      <author>DingCoDing</author>
      <guid isPermaLink="true">https://dingcoding.tistory.com/395</guid>
      <comments>https://dingcoding.tistory.com/395#entry395comment</comments>
      <pubDate>Thu, 9 Mar 2023 15:51:17 +0900</pubDate>
    </item>
    <item>
      <title>[Android] Fragment onCreate vs onCreateView</title>
      <link>https://dingcoding.tistory.com/394</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;onCreate&lt;/b&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;is called on initial creation of the fragment. You do your non graphical initializations here. It finishes even before the layout is inflated and the fragment is visible.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;onCreateView&lt;/b&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;is called to inflate the layout of the fragment i.e graphical initialization usually takes place here. It is always called some time after the&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;b&gt;onCreate&lt;/b&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;method.&lt;/p&gt;</description>
      <category>Android</category>
      <category>Android</category>
      <category>Fragment</category>
      <author>DingCoDing</author>
      <guid isPermaLink="true">https://dingcoding.tistory.com/394</guid>
      <comments>https://dingcoding.tistory.com/394#entry394comment</comments>
      <pubDate>Sun, 5 Mar 2023 16:26:05 +0900</pubDate>
    </item>
    <item>
      <title>[Nest.js] what is Provider?</title>
      <link>https://dingcoding.tistory.com/393</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;In NestJS, providers are a fundamental concept of the Dependency Injection (DI) system.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Providers are classes or values that are defined within the module and can be injected into other classes&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;(components, controllers, other providers) within the same module or in other modules.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;In other words, &lt;b&gt;providers are objects or functions that can be injected&lt;/b&gt; into other objects or functions to provide them with some functionality or data. Providers are used to manage the dependencies of your application and to promote code reuse by allowing you to define and share common services across multiple components or modules.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;To define a provider in NestJS, you need to use the @Injectable() decorator.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;This decorator tells the NestJS DI system that the class can be injected into other classes as a dependency.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Once a provider is defined, it can be injected into other classes using the constructor() function.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Here's an example of a simple provider:&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;pre id=&quot;code_1677641965956&quot; class=&quot;javascript&quot; data-ke-language=&quot;javascript&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;@Injectable()
export class LoggerService {
  log(message: string) {
    console.log(message);
  }
}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;In this example, the LoggerService class is defined as a provider using the @Injectable() decorator.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;This means that it can be injected into other classes that require a logging service.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;The log() method can be called to log a message to the console.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;To use this provider in another class, you can inject it in the constructor like this:&lt;/p&gt;
&lt;pre id=&quot;code_1677641997422&quot; class=&quot;javascript&quot; data-ke-language=&quot;javascript&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;@Injectable()
export class MyService {
  constructor(private readonly logger: LoggerService) {}

  doSomething() {
    this.logger.log('Doing something...');
  }
}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;In this example, the MyService class injects the LoggerService provider in the constructor.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;The doSomething() method can then call the log() method of the logger to log a message.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Providers are a powerful feature of NestJS that allow you to build modular and reusable applications.&lt;/p&gt;</description>
      <category>Nest.js</category>
      <category>Provider</category>
      <author>DingCoDing</author>
      <guid isPermaLink="true">https://dingcoding.tistory.com/393</guid>
      <comments>https://dingcoding.tistory.com/393#entry393comment</comments>
      <pubDate>Wed, 1 Mar 2023 12:42:33 +0900</pubDate>
    </item>
    <item>
      <title>[Nest.js] Property 'user' does not exist on type 'Request'.25         return req.user;</title>
      <link>https://dingcoding.tistory.com/391</link>
      <description>&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1822&quot; data-origin-height=&quot;1244&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bLQBv2/btr0oOeV7si/JsVW5WyA6u0USUl5kRtdk1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bLQBv2/btr0oOeV7si/JsVW5WyA6u0USUl5kRtdk1/img.png&quot; data-alt=&quot;Nest..js req.user 오류&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bLQBv2/btr0oOeV7si/JsVW5WyA6u0USUl5kRtdk1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbLQBv2%2Fbtr0oOeV7si%2FJsVW5WyA6u0USUl5kRtdk1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1822&quot; height=&quot;1244&quot; data-origin-width=&quot;1822&quot; data-origin-height=&quot;1244&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;Nest..js req.user 오류&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Nest js를 활용하여 Jwt 토큰을 발급받고 인증하는 과정을 공부하던 중에&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;req.user에 오류가 발생했다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;타입스크립트 passport 라이브러리를 다시 설치하고 다른 코드에 잘못 쓴게 있는지 한참을 찾아봤는데&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;도통 원인을 발견할 수 없었다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://stackoverflow.com/questions/64234974/ts2339-property-user-does-not-exist-on-type-request&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;https://stackoverflow.com/questions/64234974/ts2339-property-user-does-not-exist-on-type-request&lt;/a&gt;&lt;/p&gt;
&lt;figure id=&quot;og_1677121817318&quot; contenteditable=&quot;false&quot; data-ke-type=&quot;opengraph&quot; data-ke-align=&quot;alignCenter&quot; data-og-type=&quot;website&quot; data-og-title=&quot;TS2339: Property 'user' does not exist on type 'Request'&quot; data-og-description=&quot;I am trying to use JwtAuthGuard to distinguish authenticated requests from the unauthenticated ones. I did follow the official Nestjs documentation on authentification, yet, I can't make it work as...&quot; data-og-host=&quot;stackoverflow.com&quot; data-og-source-url=&quot;https://stackoverflow.com/questions/64234974/ts2339-property-user-does-not-exist-on-type-request&quot; data-og-url=&quot;https://stackoverflow.com/questions/64234974/ts2339-property-user-does-not-exist-on-type-request&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/bNcbON/hyRIA29CJE/UzMmnYnXe29k2PgmKNXYg0/img.png?width=316&amp;amp;height=316&amp;amp;face=0_0_316_316&quot;&gt;&lt;a href=&quot;https://stackoverflow.com/questions/64234974/ts2339-property-user-does-not-exist-on-type-request&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://stackoverflow.com/questions/64234974/ts2339-property-user-does-not-exist-on-type-request&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/bNcbON/hyRIA29CJE/UzMmnYnXe29k2PgmKNXYg0/img.png?width=316&amp;amp;height=316&amp;amp;face=0_0_316_316');&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;div class=&quot;og-text&quot;&gt;
&lt;p class=&quot;og-title&quot; data-ke-size=&quot;size16&quot;&gt;TS2339: Property 'user' does not exist on type 'Request'&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;I am trying to use JwtAuthGuard to distinguish authenticated requests from the unauthenticated ones. I did follow the official Nestjs documentation on authentification, yet, I can't make it work as...&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;stackoverflow.com&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;그러다 위 글을 보고 문제를 해결했다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;req: Request로 타입을 지정해줬는데&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Request를 import 하지 않아 어떤 타입인지 읽지 못해&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;req.user를 읽을 수 없던 것이었다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;pre id=&quot;code_1677121863572&quot; class=&quot;javascript&quot; data-ke-language=&quot;javascript&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;import { Request } from 'express';&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;를 추가해주니 문제가 해결되었다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category>Nest.js</category>
      <category>JWT</category>
      <category>nest.js</category>
      <category>req.user</category>
      <category>request</category>
      <author>DingCoDing</author>
      <guid isPermaLink="true">https://dingcoding.tistory.com/391</guid>
      <comments>https://dingcoding.tistory.com/391#entry391comment</comments>
      <pubDate>Thu, 23 Feb 2023 12:11:45 +0900</pubDate>
    </item>
    <item>
      <title>[Nest.js] class-validator가 동작 안할 때</title>
      <link>https://dingcoding.tistory.com/390</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;If class-validator is not working in your Nest.js application, there are a few things you can try:&lt;/p&gt;
&lt;ol style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;Ensure that you have installed the class-validator package by running npm install class-validator or yarn add class-validator.&lt;/li&gt;
&lt;li&gt;Ensure that you have imported the ValidationPipe from the @nestjs/common package and added it to the main.ts file in your application. The ValidationPipe will automatically use class-validator to validate incoming requests. Here's an example of what the main.ts file might look like:&lt;/li&gt;
&lt;li&gt;
&lt;div&gt;&lt;span&gt;javascript&lt;/span&gt;Copy code&lt;/div&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;pre id=&quot;code_1677029086840&quot; data-ke-language=&quot;javascript&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;import { NestFactory } from '@nestjs/core';
import { AppModule } from './app.module';
import { ValidationPipe } from '@nestjs/common';

async function bootstrap() {
  const app = await NestFactory.create(AppModule);
  app.useGlobalPipes(new ValidationPipe());
  await app.listen(3000);
}
bootstrap();&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;4.&amp;nbsp;Ensure that you have added the @UsePipes decorator to your controller methods that need validation. Here's an example of how you might use the @UsePipes decorator:In this example, the @UsePipes decorator is used to apply the ValidationPipe to the create method of the CatsController. The ValidationPipe will automatically validate the catRequestDto parameter using the validation rules defined in the CatRequestDto class.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;5.&lt;/span&gt;&lt;span&gt;less&lt;/span&gt;Copy code&lt;/p&gt;
&lt;div&gt;
&lt;pre id=&quot;code_1677029158024&quot; class=&quot;javascript&quot; data-ke-language=&quot;javascript&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;import { Controller, Post, UsePipes, Body } from '@nestjs/common';
import { CatRequestDto } from './dto/cat-request.dto';
import { ValidationPipe } from '@nestjs/common';

@Controller('cats')
export class CatsController {
  @Post()
  @UsePipes(new ValidationPipe())
  async create(@Body() catRequestDto: CatRequestDto) {
    // code to create a new cat
  }
}​&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;I hope these tips help resolve your issue with class-validator in your Nest.js application. If you're still having trouble, feel free to provide more details and I'll do my best to assist you further.&lt;/p&gt;</description>
      <category>Nest.js</category>
      <category>class-validator</category>
      <category>nest.js</category>
      <author>DingCoDing</author>
      <guid isPermaLink="true">https://dingcoding.tistory.com/390</guid>
      <comments>https://dingcoding.tistory.com/390#entry390comment</comments>
      <pubDate>Wed, 22 Feb 2023 10:26:24 +0900</pubDate>
    </item>
    <item>
      <title>[Nest.js] eslintrc, prettierrc 들여쓰기 4칸으로 설정하기, 괄호 내부 띄어쓰기 허용하기</title>
      <link>https://dingcoding.tistory.com/389</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;Nest.js 프레임워크를 설치하면 자동으로 eslintrc, prettierrc 파일이 따라온다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;eslint와 prettier은 코드 컨벤션을 유지하기 위해 코드를 포맷팅해주고,&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;설정된 코드 컨벤션에 위반되는 코드가 존재하면 빨간줄을 그어 경고를 한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;1. 들여쓰기 4칸으로 설정&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;나는 평소에 vscode에서 들여쓰기를 할 때 4칸을 띄우는 세팅을 이용하는데&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;eslint와 prettier의 기본 세팅은 2칸을 띄우는 걸 적용하여 4칸을 띄우면 빨간줄을 띄운다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;4칸을 띄우는 걸 기본 세팅으로 바꾸려면 .prettierrc 파일에 &quot;tabWidth&quot; : 4 를 추가하면 된다.&lt;/p&gt;
&lt;pre id=&quot;code_1676949638826&quot; class=&quot;javascript&quot; data-ke-language=&quot;javascript&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;{
    &quot;singleQuote&quot;: true,
    &quot;tabWidth&quot;: 4,
    &quot;trailingComma&quot;: &quot;all&quot;
}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;여기서 탭 정렬을 몇칸으로 설정할 건지는 하단의 링크를 보고 따라하면 된다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://dubaiyu.tistory.com/180&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;https://dubaiyu.tistory.com/180&lt;/a&gt;&lt;/p&gt;
&lt;figure id=&quot;og_1676949708140&quot; contenteditable=&quot;false&quot; data-ke-type=&quot;opengraph&quot; data-ke-align=&quot;alignCenter&quot; data-og-type=&quot;article&quot; data-og-title=&quot;Visual Studio 탭정렬 tab&quot; data-og-description=&quot;코드를 시각적으로 잘보이게하기위해 들여쓰기가 항상필요하다. 간혹 탭버튼을 눌렀으나 스페이스바로 들여쓰기가 되어있는경우가있는데 스페이스바의경우 들여쓰기보다 메모리가 더든다고&quot; data-og-host=&quot;dubaiyu.tistory.com&quot; data-og-source-url=&quot;https://dubaiyu.tistory.com/180&quot; data-og-url=&quot;https://dubaiyu.tistory.com/180&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/dC5EBc/hyRHpUCPLa/nR4UYmUdY6k0fIkXGWWxN1/img.png?width=621&amp;amp;height=53&amp;amp;face=0_0_621_53,https://scrap.kakaocdn.net/dn/pJmRl/hyRHoakqVL/HcSS88ZKKI8ciottaXKluK/img.png?width=621&amp;amp;height=53&amp;amp;face=0_0_621_53,https://scrap.kakaocdn.net/dn/c27APu/hyRHj7Xigg/0ry4UVZ3EW4zZKhvSKRnq1/img.png?width=1141&amp;amp;height=337&amp;amp;face=0_0_1141_337&quot;&gt;&lt;a href=&quot;https://dubaiyu.tistory.com/180&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://dubaiyu.tistory.com/180&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/dC5EBc/hyRHpUCPLa/nR4UYmUdY6k0fIkXGWWxN1/img.png?width=621&amp;amp;height=53&amp;amp;face=0_0_621_53,https://scrap.kakaocdn.net/dn/pJmRl/hyRHoakqVL/HcSS88ZKKI8ciottaXKluK/img.png?width=621&amp;amp;height=53&amp;amp;face=0_0_621_53,https://scrap.kakaocdn.net/dn/c27APu/hyRHj7Xigg/0ry4UVZ3EW4zZKhvSKRnq1/img.png?width=1141&amp;amp;height=337&amp;amp;face=0_0_1141_337');&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;div class=&quot;og-text&quot;&gt;
&lt;p class=&quot;og-title&quot; data-ke-size=&quot;size16&quot;&gt;Visual Studio 탭정렬 tab&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;코드를 시각적으로 잘보이게하기위해 들여쓰기가 항상필요하다. 간혹 탭버튼을 눌렀으나 스페이스바로 들여쓰기가 되어있는경우가있는데 스페이스바의경우 들여쓰기보다 메모리가 더든다고&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;dubaiyu.tistory.com&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;2. 괄호 내부 띄어쓰기&lt;/h2&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2023-02-21 오후 12.13.49.png&quot; data-origin-width=&quot;2348&quot; data-origin-height=&quot;762&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/c23Z9v/btr0aVYGF2I/d2wQVYaBwOrpGAXsFrtki1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/c23Z9v/btr0aVYGF2I/d2wQVYaBwOrpGAXsFrtki1/img.png&quot; data-alt=&quot;eslint, prettier 괄호 내부 띄어쓰기 허용&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/c23Z9v/btr0aVYGF2I/d2wQVYaBwOrpGAXsFrtki1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fc23Z9v%2Fbtr0aVYGF2I%2Fd2wQVYaBwOrpGAXsFrtki1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;2348&quot; height=&quot;762&quot; data-filename=&quot;스크린샷 2023-02-21 오후 12.13.49.png&quot; data-origin-width=&quot;2348&quot; data-origin-height=&quot;762&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;eslint, prettier 괄호 내부 띄어쓰기 허용&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;초기 세팅에서는 괄호 안에 그냥 띄어쓰기를 쓰면 위와 같이 빨간줄을 그어서 신경이 쓰인다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;괄호 내부 띄어쓰기를 허용하려면&lt;/p&gt;
&lt;div&gt;
&lt;div&gt;&lt;span style=&quot;color: #ce9178;&quot;&gt;&quot;prettier/prettier&quot;&lt;/span&gt;&lt;span style=&quot;color: #9cdcfe;&quot;&gt;:&lt;/span&gt;&lt;span style=&quot;color: #d4d4d4;&quot;&gt; [&lt;/span&gt;&lt;span style=&quot;color: #ce9178;&quot;&gt;&quot;error&quot;&lt;/span&gt;&lt;span style=&quot;color: #d4d4d4;&quot;&gt;, { &lt;/span&gt;&lt;span style=&quot;color: #ce9178;&quot;&gt;&quot;endOfLine&quot;&lt;/span&gt;&lt;span style=&quot;color: #9cdcfe;&quot;&gt;:&lt;/span&gt;&lt;span style=&quot;color: #d4d4d4;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #ce9178;&quot;&gt;&quot;off&quot;&lt;/span&gt;&lt;span style=&quot;color: #d4d4d4;&quot;&gt; }]&amp;nbsp;&lt;/span&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;위 코드를 .eslintrc.js에 추가해주면 된다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;.eslintrc.js&lt;/b&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1676949866441&quot; class=&quot;javascript&quot; data-ke-language=&quot;javascript&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;module.exports = {
    parser: &quot;@typescript-eslint/parser&quot;,
    parserOptions: {
        project: &quot;tsconfig.json&quot;,
        tsconfigRootDir: __dirname,
        sourceType: &quot;module&quot;,
    },
    plugins: [&quot;@typescript-eslint/eslint-plugin&quot;],
    extends: [
        &quot;plugin:@typescript-eslint/recommended&quot;,
        &quot;plugin:prettier/recommended&quot;,
    ],
    root: true,
    env: {
        node: true,
        jest: true,
    },
    ignorePatterns: [&quot;.eslintrc.js&quot;],
    rules: {
        &quot;prettier/prettier&quot;: [&quot;error&quot;, { &quot;endOfLine&quot;: &quot;off&quot; }],
        &quot;@typescript-eslint/interface-name-prefix&quot;: &quot;off&quot;,
        &quot;@typescript-eslint/explicit-function-return-type&quot;: &quot;off&quot;,
        &quot;@typescript-eslint/explicit-module-boundary-types&quot;: &quot;off&quot;,
        &quot;@typescript-eslint/no-explicit-any&quot;: &quot;off&quot;,
    },
};&lt;/code&gt;&lt;/pre&gt;</description>
      <category>Nest.js</category>
      <category>ESlint</category>
      <category>nestjs</category>
      <category>Prettier</category>
      <author>DingCoDing</author>
      <guid isPermaLink="true">https://dingcoding.tistory.com/389</guid>
      <comments>https://dingcoding.tistory.com/389#entry389comment</comments>
      <pubDate>Tue, 21 Feb 2023 12:24:52 +0900</pubDate>
    </item>
    <item>
      <title>Oracle Apex Phone number format setting</title>
      <link>https://dingcoding.tistory.com/388</link>
      <description>&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1386&quot; data-origin-height=&quot;1125&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/3INvU/btrVUrVrfmm/riuMkz0I7CzrCKi8RVLJZk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/3INvU/btrVUrVrfmm/riuMkz0I7CzrCKi8RVLJZk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/3INvU/btrVUrVrfmm/riuMkz0I7CzrCKi8RVLJZk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2F3INvU%2FbtrVUrVrfmm%2FriuMkz0I7CzrCKi8RVLJZk%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1386&quot; height=&quot;1125&quot; data-origin-width=&quot;1386&quot; data-origin-height=&quot;1125&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;pre id=&quot;code_1673341575805&quot; class=&quot;javascript&quot; data-ke-language=&quot;javascript&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;document.getElementById('P300_전화번호').addEventListener('input',function(y)
{
var output = y.target.value.replace(/\D/g,'').match(/(\d{0,3})(\d{0,4})(\d{0,4})/);
y.target.value = !output[2]?output[1]:output[1]+'-'+output[2]+(output[3]?'-'+output[3]:'');
});



document.getElementById('P300_사업자번호').addEventListener('input',function(y)
{
var output = y.target.value.replace(/\D/g,'').match(/(\d{0,3})(\d{0,2})(\d{0,5})/);
y.target.value = !output[2]?output[1]:output[1]+'-'+output[2]+(output[3]?'-'+output[3]:'');
});&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category>Oracle Apex</category>
      <author>DingCoDing</author>
      <guid isPermaLink="true">https://dingcoding.tistory.com/388</guid>
      <comments>https://dingcoding.tistory.com/388#entry388comment</comments>
      <pubDate>Tue, 10 Jan 2023 18:06:40 +0900</pubDate>
    </item>
    <item>
      <title>[PlayWright] 웹페이지 크롤링 및 json 데이터 만들기</title>
      <link>https://dingcoding.tistory.com/387</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://blog.apify.com/how-to-scrape-the-web-with-playwright-ece1ced75f73/&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;https://blog.apify.com/how-to-scrape-the-web-with-playwright-ece1ced75f73/&lt;/a&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;pre id=&quot;code_1673096631046&quot; class=&quot;javascript&quot; data-ke-language=&quot;javascript&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;import { chromium } from &quot;playwright&quot;;

const browser = await chromium.launch({
    headless: false
})

const context = await browser.newContext({
    bypassCSP: true
});

const page = await context.newPage();
await page.goto(&quot;https://github.com/topics/javascript&quot;)


for (let i = 1; i &amp;lt; 10; i++) {
    await page.click('text=Load more');
}

const repos = await page.$$eval('article.border', (repoCards) =&amp;gt; {
    return repoCards.map(card =&amp;gt; {

        const [user, repo] = card.querySelectorAll('h3 a');
        const stars = card.querySelector('#repo-stars-counter-star')
            .getAttribute('title');
        const description = card.querySelector('div.px-3 &amp;gt; p');
        const topics = card.querySelectorAll('a.topic-tag')

        const toText = (element) =&amp;gt; element &amp;amp;&amp;amp; element.innerText.trim();
        const parseNumber = (text) =&amp;gt; Number(text.replace(/,/g, ''))

        return {
            user: toText(user),
            repo: toText(repo),
            url: repo.href,
            stars: parseNumber(stars),
            description: toText(description),
            topics: Array.from(topics).map((t) =&amp;gt; toText(t))
        }

    })
})


console.log(`We extracted ${repos.length} repositories.`);
// console.dir(repos);

await page.pause();
await page.waitForTimeout(10000);
await browser.close()&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;crawlee 활용&lt;/h2&gt;
&lt;pre id=&quot;code_1673097661323&quot; class=&quot;javascript&quot; data-ke-language=&quot;javascript&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;import { Configuration, PlaywrightCrawler } from &quot;crawlee&quot;;

Configuration.set('headless', false)

const crawler = new PlaywrightCrawler({
    requestHandler: async ({ page, infiniteScroll }) =&amp;gt; {
        const title = await page.title()
        console.log(title)


        await infiniteScroll({
            buttonSelector: 'text=Load more',

            stopScrollCallback: async () =&amp;gt; {
                const repos = await page.$$('article.border');
                return repos.length &amp;gt;= 100;
            },
        })

        const repos = await page.$$eval('article.border', (repoCards) =&amp;gt; {
            return repoCards.map(card =&amp;gt; {
                const [user, repo] = card.querySelectorAll('h3 a');
                const stars = card.querySelector('#repo-stars-counter-star')
                    .getAttribute('title');
                const description = card.querySelector('div.px-3 &amp;gt; p');
                const topics = card.querySelectorAll('a.topic-tag');

                const toText = (element) =&amp;gt; element &amp;amp;&amp;amp; element.innerText.trim();
                const parseNumber = (text) =&amp;gt; Number(text.replace(/,/g, ''));

                return {
                    user: toText(user),
                    repo: toText(repo),
                    url: repo.href,
                    stars: parseNumber(stars),
                    description: toText(description),
                    topics: Array.from(topics).map((t) =&amp;gt; toText(t)),
                };
            });
        });
        console.log('Repository count:', repos.length);
        console.dir(repos);

        await page.waitForTimeout(10000)
    }
})

await crawler.run(['https://github.com/topics/javascript'])&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;router 활용하여 깔끔하게 코드 작성&lt;/h2&gt;
&lt;pre id=&quot;code_1673168777132&quot; class=&quot;javascript&quot; data-ke-language=&quot;javascript&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;// crawlee.js
import { Dataset, PlaywrightCrawler } from 'crawlee';
import { router } from './router.js';

const crawler = new PlaywrightCrawler({
    requestHandler: router
})

await crawler.run(['https://github.com/topics/javascript'])
await Dataset.exportToCSV('repositories');&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;pre id=&quot;code_1673168784998&quot; class=&quot;javascript&quot; data-ke-language=&quot;javascript&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;// router.js
import { createPlaywrightRouter, Dataset, Request } from 'crawlee';

export const router = createPlaywrightRouter();

const REPO_COUNT = 20;

router.use(async ({ page }) =&amp;gt; {
    const title = await page.title()
    console.log(title);
})

router.addHandler('repository', async ({ page, request }) =&amp;gt; {
    const commitText = await page
        .getByRole('listitem', )
        .filter({ hasText: 'commits'})
        .textContent()
    const numberStrings = commitText.match(/\d+/g);
    const commitCount = Number(numberStrings.join(''));

    await Dataset.pushData({
        ...request.userData,
        commitCount,
    });
});

router.addDefaultHandler(async ({ page, infiniteScroll, crawler }) =&amp;gt; {
    await infiniteScroll({
        buttonSelector: 'text=Load more',
        stopScrollCallback: async () =&amp;gt; {
            const repos = await page.$$('article.border');
            return repos.length &amp;gt;= REPO_COUNT;
        },
    });

    const repos = await page.$$eval('article.border', (repoCards) =&amp;gt; {
        return repoCards.map(card =&amp;gt; {
            const [user, repo] = card.querySelectorAll('h3 a');
            const stars = card.querySelector('#repo-stars-counter-star')
                .getAttribute('title');
            const description = card.querySelector('div.px-3 &amp;gt; p');
            const topics = card.querySelectorAll('a.topic-tag');

            const toText = (element) =&amp;gt; element &amp;amp;&amp;amp; element.innerText.trim();
            const parseNumber = (text) =&amp;gt; Number(text.replace(/,/g, ''));

            return {
                user: toText(user),
                repo: toText(repo),
                url: repo.href,
                stars: parseNumber(stars),
                description: toText(description),
                topics: Array.from(topics)
                    .map((t) =&amp;gt; toText(t)),
            };
        });
    });

    console.log('Repository count:', repos.length);
    const requests = repos.map(repo =&amp;gt; new Request({
        url: repo.url,
        label: 'repository',
        userData: repo,
    }));

    await crawler.addRequests(requests);
})&lt;/code&gt;&lt;/pre&gt;</description>
      <category>PlayWright</category>
      <author>DingCoDing</author>
      <guid isPermaLink="true">https://dingcoding.tistory.com/387</guid>
      <comments>https://dingcoding.tistory.com/387#entry387comment</comments>
      <pubDate>Sat, 7 Jan 2023 22:04:34 +0900</pubDate>
    </item>
    <item>
      <title>백준 14725번 : 개미굴 - Trie , Java</title>
      <link>https://dingcoding.tistory.com/386</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://www.acmicpc.net/problem/14725&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;https://www.acmicpc.net/problem/14725&lt;/a&gt;&lt;/p&gt;
&lt;figure id=&quot;og_1672398893044&quot; contenteditable=&quot;false&quot; data-ke-type=&quot;opengraph&quot; data-ke-align=&quot;alignCenter&quot; data-og-type=&quot;website&quot; data-og-title=&quot;14725번: 개미굴&quot; data-og-description=&quot;첫 번째 줄은 로봇 개미가 각 층을 따라 내려오면서 알게 된 먹이의 정보 개수 N개가 주어진다. &amp;nbsp;(1 &amp;le; N &amp;le; 1000) 두 번째 줄부터 N+1 번째 줄까지, 각 줄의 시작은 로봇 개미 한마리가 보내준 먹이 &quot; data-og-host=&quot;www.acmicpc.net&quot; data-og-source-url=&quot;https://www.acmicpc.net/problem/14725&quot; data-og-url=&quot;https://www.acmicpc.net/problem/14725&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/pAgJz/hyQ6YohUmT/XBuMcWPU4qXa9BZI009kBk/img.png?width=2834&amp;amp;height=1480&amp;amp;face=0_0_2834_1480,https://scrap.kakaocdn.net/dn/I9DbU/hyQ6QcIGIi/aQblIIXBQh8bzZKhHGFKI1/img.png?width=1503&amp;amp;height=785&amp;amp;face=0_0_1503_785&quot;&gt;&lt;a href=&quot;https://www.acmicpc.net/problem/14725&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://www.acmicpc.net/problem/14725&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/pAgJz/hyQ6YohUmT/XBuMcWPU4qXa9BZI009kBk/img.png?width=2834&amp;amp;height=1480&amp;amp;face=0_0_2834_1480,https://scrap.kakaocdn.net/dn/I9DbU/hyQ6QcIGIi/aQblIIXBQh8bzZKhHGFKI1/img.png?width=1503&amp;amp;height=785&amp;amp;face=0_0_1503_785');&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;div class=&quot;og-text&quot;&gt;
&lt;p class=&quot;og-title&quot; data-ke-size=&quot;size16&quot;&gt;14725번: 개미굴&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;첫 번째 줄은 로봇 개미가 각 층을 따라 내려오면서 알게 된 먹이의 정보 개수 N개가 주어진다. &amp;nbsp;(1 &amp;le; N &amp;le; 1000) 두 번째 줄부터 N+1 번째 줄까지, 각 줄의 시작은 로봇 개미 한마리가 보내준 먹이&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;www.acmicpc.net&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;트라이의 성질을 이용하여 트리구조를 구현해야한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이때 출력은 사전순으로 해야하기 때문에&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;자바로 문제를 푸는 경우엔 TreeMap을 활용하면 key값을 기준으로 알아서 정렬이 된다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;출력은 정렬된 TreeMap을 활용해 하위 노드들을 중위순회로 돌면 된다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;pre id=&quot;code_1672398880516&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;//package org.example;

import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.util.*;

public class Main {
    class Trie {
        TreeMap&amp;lt;String, Trie&amp;gt; child = new TreeMap&amp;lt;&amp;gt;();
    }
    //출력용
    private StringBuilder sb = new StringBuilder();
    public void print(Trie root, int depth) {
        Set keys = root.child.keySet();

        for (Object key : keys) {
            for (int i = 0; i &amp;lt; depth; i++) {
                sb.append(&quot;--&quot;);
            }
            sb.append(key).append(&quot;\n&quot;);
            print(root.child.get(key), depth + 1);
        }
    }

    public void solution() throws Exception {
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        Trie root = new Trie();

        int N = Integer.parseInt(br.readLine());
        for (int i = 0; i &amp;lt; N; i++) {
            StringTokenizer st = new StringTokenizer(br.readLine());

            int K = Integer.parseInt(st.nextToken());

            Trie cur = root;
            //Trie 생성
            for (int j = 0; j &amp;lt; K; j++) {
                String str = st.nextToken();
                if (!cur.child.containsKey(str)) {
                    cur.child.put(str, new Trie());
                }
                cur = cur.child.get(str);
            }
        }
        print(root, 0);
        System.out.println(sb);
    }

    public static void main(String[] args) throws Exception {
        new Main().solution();
    }
}&lt;/code&gt;&lt;/pre&gt;</description>
      <category>Algorithm/problem</category>
      <author>DingCoDing</author>
      <guid isPermaLink="true">https://dingcoding.tistory.com/386</guid>
      <comments>https://dingcoding.tistory.com/386#entry386comment</comments>
      <pubDate>Fri, 30 Dec 2022 20:19:00 +0900</pubDate>
    </item>
    <item>
      <title>백준 5052번 : 전화번호 목록 - 트라이, JAVA</title>
      <link>https://dingcoding.tistory.com/385</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://www.acmicpc.net/problem/5052&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;https://www.acmicpc.net/problem/5052&lt;/a&gt;&lt;/p&gt;
&lt;figure id=&quot;og_1672394244226&quot; contenteditable=&quot;false&quot; data-ke-type=&quot;opengraph&quot; data-ke-align=&quot;alignCenter&quot; data-og-type=&quot;website&quot; data-og-title=&quot;5052번: 전화번호 목록&quot; data-og-description=&quot;첫째 줄에 테스트 케이스의 개수 t가 주어진다. (1 &amp;le; t &amp;le; 50) 각 테스트 케이스의 첫째 줄에는 전화번호의 수 n이 주어진다. (1 &amp;le; n &amp;le; 10000) 다음 n개의 줄에는 목록에 포함되어 있는 전화번호가 &quot; data-og-host=&quot;www.acmicpc.net&quot; data-og-source-url=&quot;https://www.acmicpc.net/problem/5052&quot; data-og-url=&quot;https://www.acmicpc.net/problem/5052&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/HoUos/hyQ5rFzaBH/k6MYylV9kYjoil2Qe7vbk0/img.png?width=2834&amp;amp;height=1480&amp;amp;face=0_0_2834_1480&quot;&gt;&lt;a href=&quot;https://www.acmicpc.net/problem/5052&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://www.acmicpc.net/problem/5052&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/HoUos/hyQ5rFzaBH/k6MYylV9kYjoil2Qe7vbk0/img.png?width=2834&amp;amp;height=1480&amp;amp;face=0_0_2834_1480');&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;div class=&quot;og-text&quot;&gt;
&lt;p class=&quot;og-title&quot; data-ke-size=&quot;size16&quot;&gt;5052번: 전화번호 목록&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;첫째 줄에 테스트 케이스의 개수 t가 주어진다. (1 &amp;le; t &amp;le; 50) 각 테스트 케이스의 첫째 줄에는 전화번호의 수 n이 주어진다. (1 &amp;le; n &amp;le; 10000) 다음 n개의 줄에는 목록에 포함되어 있는 전화번호가&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;www.acmicpc.net&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;pre id=&quot;code_1672394235591&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.util.Arrays;
import java.util.StringTokenizer;

public class Main {
    final int GO_MX = 10;

    class Trie {
        Trie[] go;
        boolean output;
        boolean hasChild;

        public Trie() {
            go = new Trie[GO_MX];
            Arrays.fill(go, null);
            output = hasChild = false;
        }

        public void insert(String str, int level) {
            if (level == str.length()) {
                output = true;
                return;
            }
            int next = str.charAt(level) - '0';

            if (go[next] == null) go[next] = new Trie();
            hasChild = true;

            go[next].insert(str, level + 1);
        }

        public boolean consistent() {
            if (this.hasChild &amp;amp;&amp;amp; this.output) return false;

            for (int i = 0; i &amp;lt; GO_MX; i++) {
                if (go[i] != null &amp;amp;&amp;amp; !go[i].consistent()) return false;
            }

            return true;
        }
    }


    public void solution() throws Exception {
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        StringBuilder sb = new StringBuilder();

        int t = Integer.parseInt(br.readLine());

        for (int i = 0; i &amp;lt; t; i++) {
            int n = Integer.parseInt(br.readLine());

            Trie trie = new Trie();
            for (int j = 0; j &amp;lt; n; j++) {
                String str = br.readLine();
                trie.insert(str, 0);
            }


            if (trie.consistent()) {
                sb.append(&quot;YES\n&quot;);
            } else {
                sb.append(&quot;NO\n&quot;);
            }
        }
        System.out.println(sb);
    }

    public static void main(String[] args) throws Exception {
        new Main().solution();
    }
}&lt;/code&gt;&lt;/pre&gt;</description>
      <category>Algorithm/problem</category>
      <author>DingCoDing</author>
      <guid isPermaLink="true">https://dingcoding.tistory.com/385</guid>
      <comments>https://dingcoding.tistory.com/385#entry385comment</comments>
      <pubDate>Fri, 30 Dec 2022 18:57:48 +0900</pubDate>
    </item>
  </channel>
</rss>