{
    "componentChunkName": "component---src-templates-blog-template-js",
    "path": "/jpa-specification/",
    "result": {"data":{"cur":{"id":"4781c460-b723-5b0d-b646-008d16dd41bf","html":"<p>Spring Boot에서는 기본적인 CRUD가 가능하도록 <strong>JpaRepository</strong> 인터페이스를 제공하는데 여기서 <strong>findByName</strong> 같은 형식으로 쿼리 메서드를 만들어서 조건에 맞게 검색할 수 있다.<br>\n하지만 조건이 다양해지면 그만큼 쿼리 메서드도 많이 필요하고, 코드도 복잡해지는 문제점이 생긴다.</p>\n<div class=\"gatsby-highlight\" data-language=\"java\"><pre class=\"language-java\"><code class=\"language-java\"><span class=\"token keyword\">public</span> <span class=\"token class-name\">List</span><span class=\"token generics\"><span class=\"token punctuation\">&lt;</span><span class=\"token class-name\">Seat</span><span class=\"token punctuation\">></span></span> <span class=\"token function\">seatFilterList</span><span class=\"token punctuation\">(</span><span class=\"token class-name\">String</span> levelName<span class=\"token punctuation\">,</span> <span class=\"token class-name\">SeatFilterRequest</span> seatFilterRequest<span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span>\n    <span class=\"token class-name\">Level</span> level <span class=\"token operator\">=</span> levelRepository<span class=\"token punctuation\">.</span><span class=\"token function\">findByLevelName</span><span class=\"token punctuation\">(</span>levelName<span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n    <span class=\"token class-name\">String</span> section <span class=\"token operator\">=</span> seatFilterRequest<span class=\"token punctuation\">.</span><span class=\"token function\">getSection</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n    <span class=\"token class-name\">String</span> row <span class=\"token operator\">=</span> seatFilterRequest<span class=\"token punctuation\">.</span><span class=\"token function\">getRow</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n    <span class=\"token class-name\">String</span> num <span class=\"token operator\">=</span> seatFilterRequest<span class=\"token punctuation\">.</span><span class=\"token function\">getNum</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n\n    <span class=\"token keyword\">if</span><span class=\"token punctuation\">(</span>section<span class=\"token punctuation\">.</span><span class=\"token function\">equals</span><span class=\"token punctuation\">(</span><span class=\"token string\">\"All\"</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span>\n        <span class=\"token keyword\">if</span><span class=\"token punctuation\">(</span><span class=\"token operator\">!</span>col<span class=\"token punctuation\">.</span><span class=\"token function\">equals</span><span class=\"token punctuation\">(</span><span class=\"token string\">\"\"</span><span class=\"token punctuation\">)</span> <span class=\"token operator\">&amp;&amp;</span> <span class=\"token operator\">!</span>num<span class=\"token punctuation\">.</span><span class=\"token function\">equals</span><span class=\"token punctuation\">(</span><span class=\"token string\">\"\"</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span>\n            <span class=\"token keyword\">return</span> seatRepository<span class=\"token punctuation\">.</span><span class=\"token function\">findByLevelIdAndRowAndNum</span><span class=\"token punctuation\">(</span>level<span class=\"token punctuation\">.</span><span class=\"token function\">getLevelId</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">,</span> col<span class=\"token punctuation\">,</span> num<span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n        <span class=\"token punctuation\">}</span> <span class=\"token keyword\">else</span> <span class=\"token keyword\">if</span><span class=\"token punctuation\">(</span><span class=\"token operator\">!</span>col<span class=\"token punctuation\">.</span><span class=\"token function\">equals</span><span class=\"token punctuation\">(</span><span class=\"token string\">\"\"</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span>\n            <span class=\"token keyword\">return</span> seatRepository<span class=\"token punctuation\">.</span><span class=\"token function\">findByLevelIdAndRow</span><span class=\"token punctuation\">(</span>level<span class=\"token punctuation\">.</span><span class=\"token function\">getLevelId</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">,</span> col<span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n        <span class=\"token punctuation\">}</span> <span class=\"token keyword\">else</span> <span class=\"token keyword\">if</span><span class=\"token punctuation\">(</span><span class=\"token operator\">!</span>num<span class=\"token punctuation\">.</span><span class=\"token function\">equals</span><span class=\"token punctuation\">(</span><span class=\"token string\">\"\"</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span>\n            <span class=\"token keyword\">return</span> seatRepository<span class=\"token punctuation\">.</span><span class=\"token function\">findByLevelIdAndNum</span><span class=\"token punctuation\">(</span>level<span class=\"token punctuation\">.</span><span class=\"token function\">getLevelId</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">,</span> num<span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n        <span class=\"token punctuation\">}</span> <span class=\"token keyword\">else</span> <span class=\"token punctuation\">{</span>\n            <span class=\"token keyword\">return</span> seatRepository<span class=\"token punctuation\">.</span><span class=\"token function\">findByLevelId</span><span class=\"token punctuation\">(</span>level<span class=\"token punctuation\">.</span><span class=\"token function\">getLevelId</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n        <span class=\"token punctuation\">}</span>\n    <span class=\"token punctuation\">}</span> <span class=\"token keyword\">else</span> <span class=\"token punctuation\">{</span>\n        <span class=\"token keyword\">if</span><span class=\"token punctuation\">(</span><span class=\"token operator\">!</span>col<span class=\"token punctuation\">.</span><span class=\"token function\">equals</span><span class=\"token punctuation\">(</span><span class=\"token string\">\"\"</span><span class=\"token punctuation\">)</span> <span class=\"token operator\">&amp;&amp;</span> <span class=\"token operator\">!</span>num<span class=\"token punctuation\">.</span><span class=\"token function\">equals</span><span class=\"token punctuation\">(</span><span class=\"token string\">\"\"</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span>\n            <span class=\"token keyword\">return</span> seatRepository<span class=\"token punctuation\">.</span><span class=\"token function\">findByLevelIdAndSectionAndRowAndNum</span><span class=\"token punctuation\">(</span>level<span class=\"token punctuation\">.</span><span class=\"token function\">getLevelId</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">,</span> section<span class=\"token punctuation\">,</span> col<span class=\"token punctuation\">,</span> num<span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n        <span class=\"token punctuation\">}</span> <span class=\"token keyword\">else</span> <span class=\"token keyword\">if</span><span class=\"token punctuation\">(</span><span class=\"token operator\">!</span>col<span class=\"token punctuation\">.</span><span class=\"token function\">equals</span><span class=\"token punctuation\">(</span><span class=\"token string\">\"\"</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span>\n            <span class=\"token keyword\">return</span> seatRepository<span class=\"token punctuation\">.</span><span class=\"token function\">findByLevelIdAndSectionAndRow</span><span class=\"token punctuation\">(</span>level<span class=\"token punctuation\">.</span><span class=\"token function\">getLevelId</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">,</span> section<span class=\"token punctuation\">,</span> col<span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n        <span class=\"token punctuation\">}</span> <span class=\"token keyword\">else</span> <span class=\"token keyword\">if</span><span class=\"token punctuation\">(</span><span class=\"token operator\">!</span>num<span class=\"token punctuation\">.</span><span class=\"token function\">equals</span><span class=\"token punctuation\">(</span><span class=\"token string\">\"\"</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span>\n            <span class=\"token keyword\">return</span> seatRepository<span class=\"token punctuation\">.</span><span class=\"token function\">findByLevelIdAndSectionAndNum</span><span class=\"token punctuation\">(</span>level<span class=\"token punctuation\">.</span><span class=\"token function\">getLevelId</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">,</span> section<span class=\"token punctuation\">,</span> num<span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n        <span class=\"token punctuation\">}</span> <span class=\"token keyword\">else</span> <span class=\"token punctuation\">{</span>\n            <span class=\"token keyword\">return</span> seatRepository<span class=\"token punctuation\">.</span><span class=\"token function\">findByLevelIdAndSection</span><span class=\"token punctuation\">(</span>level<span class=\"token punctuation\">.</span><span class=\"token function\">getLevelId</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">,</span> section<span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n        <span class=\"token punctuation\">}</span>\n    <span class=\"token punctuation\">}</span>\n<span class=\"token punctuation\">}</span></code></pre></div>\n<p>다음은 실제 스프링을 이용한 프로젝트에서 쿼리 메서드가 많아지면서 복잡해진 수정 전 코드다.<br>\n스프링으로 하는 첫 프로젝트여서 기본적인 쿼리 메서드 사용 방법만 알고 있는 상태로 조건 처리를 하려고 했는데, 조건이 복잡해지면서 코드도 복잡해졌고 실행에는 문제가 없지만 그냥 봐도 리팩토링이 필요한 코드라는 생각이 들었다.<br>\n그래서 더 간단하게 코드를 짜는 방법이 있을 거라고 생각하면서 구글링을 한 결과, <strong>JPA Specification</strong>을 활용하면 보다 간단하게 구현할 수 있다는 것을 알게 되었다.</p>\n<h2 id=\"jpaspecificationexecutor-상속\" style=\"position:relative;\"><a href=\"#jpaspecificationexecutor-%EC%83%81%EC%86%8D\" aria-label=\"jpaspecificationexecutor 상속 permalink\" class=\"anchor before\"><svg aria-hidden=\"true\" focusable=\"false\" height=\"16\" version=\"1.1\" viewBox=\"0 0 16 16\" width=\"16\"><path fill-rule=\"evenodd\" d=\"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z\"></path></svg></a>JpaSpecificationExecutor 상속</h2>\n<div class=\"gatsby-highlight\" data-language=\"java\"><pre class=\"language-java\"><code class=\"language-java\"><span class=\"token keyword\">import</span> <span class=\"token namespace\">org<span class=\"token punctuation\">.</span>springframework<span class=\"token punctuation\">.</span>data<span class=\"token punctuation\">.</span>jpa<span class=\"token punctuation\">.</span>repository<span class=\"token punctuation\">.</span></span><span class=\"token class-name\">JpaRepository</span><span class=\"token punctuation\">;</span>\n<span class=\"token keyword\">import</span> <span class=\"token namespace\">org<span class=\"token punctuation\">.</span>springframework<span class=\"token punctuation\">.</span>data<span class=\"token punctuation\">.</span>jpa<span class=\"token punctuation\">.</span>repository<span class=\"token punctuation\">.</span></span><span class=\"token class-name\">JpaSpecificationExecutor</span><span class=\"token punctuation\">;</span>\n\n<span class=\"token keyword\">import</span> <span class=\"token namespace\">java<span class=\"token punctuation\">.</span>util<span class=\"token punctuation\">.</span></span><span class=\"token class-name\">List</span><span class=\"token punctuation\">;</span>\n\n<span class=\"token keyword\">public</span> <span class=\"token keyword\">interface</span> <span class=\"token class-name\">SeatRepository</span> <span class=\"token keyword\">extends</span> <span class=\"token class-name\">JpaRepository</span><span class=\"token generics\"><span class=\"token punctuation\">&lt;</span><span class=\"token class-name\">Seat</span><span class=\"token punctuation\">,</span> <span class=\"token class-name\">Long</span><span class=\"token punctuation\">></span></span><span class=\"token punctuation\">,</span> <span class=\"token class-name\">JpaSpecificationExecutor</span><span class=\"token generics\"><span class=\"token punctuation\">&lt;</span><span class=\"token class-name\">Seat</span><span class=\"token punctuation\">></span></span> <span class=\"token punctuation\">{</span>\n    <span class=\"token class-name\">List</span><span class=\"token generics\"><span class=\"token punctuation\">&lt;</span><span class=\"token class-name\">Seat</span><span class=\"token punctuation\">></span></span> <span class=\"token function\">findByLevelId</span><span class=\"token punctuation\">(</span><span class=\"token class-name\">Long</span> levelId<span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n<span class=\"token punctuation\">}</span></code></pre></div>\n<p>우선 <strong>JPA Specification</strong>을 사용하기 위해 원하는 <strong>Repository</strong> 인터페이스에 <code class=\"language-text\">JpaRepository</code> 뿐만 아니라 <code class=\"language-text\">JpaSpecificationExecutor</code>도 상속받는다.</p>\n<h2 id=\"\" style=\"position:relative;\"><a href=\"#\" aria-label=\" permalink\" class=\"anchor before\"><svg aria-hidden=\"true\" focusable=\"false\" height=\"16\" version=\"1.1\" viewBox=\"0 0 16 16\" width=\"16\"><path fill-rule=\"evenodd\" d=\"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z\"></path></svg></a></h2>\n<div class=\"gatsby-highlight\" data-language=\"java\"><pre class=\"language-java\"><code class=\"language-java\"><span class=\"token keyword\">import</span> <span class=\"token namespace\">org<span class=\"token punctuation\">.</span>springframework<span class=\"token punctuation\">.</span>data<span class=\"token punctuation\">.</span>jpa<span class=\"token punctuation\">.</span>domain<span class=\"token punctuation\">.</span></span><span class=\"token class-name\">Specification</span><span class=\"token punctuation\">;</span>\n\n<span class=\"token keyword\">import</span> <span class=\"token namespace\">javax<span class=\"token punctuation\">.</span>persistence<span class=\"token punctuation\">.</span>criteria<span class=\"token punctuation\">.</span></span><span class=\"token class-name\">CriteriaBuilder</span><span class=\"token punctuation\">;</span>\n<span class=\"token keyword\">import</span> <span class=\"token namespace\">javax<span class=\"token punctuation\">.</span>persistence<span class=\"token punctuation\">.</span>criteria<span class=\"token punctuation\">.</span></span><span class=\"token class-name\">CriteriaQuery</span><span class=\"token punctuation\">;</span>\n<span class=\"token keyword\">import</span> <span class=\"token namespace\">javax<span class=\"token punctuation\">.</span>persistence<span class=\"token punctuation\">.</span>criteria<span class=\"token punctuation\">.</span></span><span class=\"token class-name\">Predicate</span><span class=\"token punctuation\">;</span>\n<span class=\"token keyword\">import</span> <span class=\"token namespace\">javax<span class=\"token punctuation\">.</span>persistence<span class=\"token punctuation\">.</span>criteria<span class=\"token punctuation\">.</span></span><span class=\"token class-name\">Root</span><span class=\"token punctuation\">;</span>\n\n<span class=\"token keyword\">public</span> <span class=\"token keyword\">class</span> <span class=\"token class-name\">SeatFilterSpecification</span> <span class=\"token punctuation\">{</span>\n    <span class=\"token keyword\">public</span> <span class=\"token keyword\">static</span> <span class=\"token class-name\">Specification</span><span class=\"token generics\"><span class=\"token punctuation\">&lt;</span><span class=\"token class-name\">Seat</span><span class=\"token punctuation\">></span></span> <span class=\"token function\">equalLevelId</span><span class=\"token punctuation\">(</span><span class=\"token class-name\">Long</span> levelId<span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span>\n        <span class=\"token keyword\">return</span> <span class=\"token keyword\">new</span> <span class=\"token class-name\">Specification</span><span class=\"token generics\"><span class=\"token punctuation\">&lt;</span><span class=\"token class-name\">Seat</span><span class=\"token punctuation\">></span></span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span>\n            <span class=\"token annotation punctuation\">@Override</span>\n            <span class=\"token keyword\">public</span> <span class=\"token class-name\">Predicate</span> <span class=\"token function\">toPredicate</span><span class=\"token punctuation\">(</span><span class=\"token class-name\">Root</span><span class=\"token generics\"><span class=\"token punctuation\">&lt;</span><span class=\"token class-name\">Seat</span><span class=\"token punctuation\">></span></span> root<span class=\"token punctuation\">,</span> <span class=\"token class-name\">CriteriaQuery</span><span class=\"token generics\"><span class=\"token punctuation\">&lt;</span><span class=\"token operator\">?</span><span class=\"token punctuation\">></span></span> query<span class=\"token punctuation\">,</span> <span class=\"token class-name\">CriteriaBuilder</span> criteriaBuilder<span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span>\n                <span class=\"token keyword\">return</span> criteriaBuilder<span class=\"token punctuation\">.</span><span class=\"token function\">equal</span><span class=\"token punctuation\">(</span>root<span class=\"token punctuation\">.</span><span class=\"token function\">get</span><span class=\"token punctuation\">(</span><span class=\"token string\">\"levelId\"</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">,</span> levelId<span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n            <span class=\"token punctuation\">}</span>\n        <span class=\"token punctuation\">}</span><span class=\"token punctuation\">;</span>\n    <span class=\"token punctuation\">}</span>\n\n    <span class=\"token keyword\">public</span> <span class=\"token keyword\">static</span> <span class=\"token class-name\">Specification</span><span class=\"token generics\"><span class=\"token punctuation\">&lt;</span><span class=\"token class-name\">Seat</span><span class=\"token punctuation\">></span></span> <span class=\"token function\">equalSection</span><span class=\"token punctuation\">(</span><span class=\"token class-name\">String</span> section<span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span>\n        <span class=\"token keyword\">return</span> <span class=\"token keyword\">new</span> <span class=\"token class-name\">Specification</span><span class=\"token generics\"><span class=\"token punctuation\">&lt;</span><span class=\"token class-name\">Seat</span><span class=\"token punctuation\">></span></span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span>\n            <span class=\"token annotation punctuation\">@Override</span>\n            <span class=\"token keyword\">public</span> <span class=\"token class-name\">Predicate</span> <span class=\"token function\">toPredicate</span><span class=\"token punctuation\">(</span><span class=\"token class-name\">Root</span><span class=\"token generics\"><span class=\"token punctuation\">&lt;</span><span class=\"token class-name\">Seat</span><span class=\"token punctuation\">></span></span> root<span class=\"token punctuation\">,</span> <span class=\"token class-name\">CriteriaQuery</span><span class=\"token generics\"><span class=\"token punctuation\">&lt;</span><span class=\"token operator\">?</span><span class=\"token punctuation\">></span></span> query<span class=\"token punctuation\">,</span> <span class=\"token class-name\">CriteriaBuilder</span> criteriaBuilder<span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span>\n                <span class=\"token keyword\">return</span> criteriaBuilder<span class=\"token punctuation\">.</span><span class=\"token function\">equal</span><span class=\"token punctuation\">(</span>root<span class=\"token punctuation\">.</span><span class=\"token function\">get</span><span class=\"token punctuation\">(</span><span class=\"token string\">\"section\"</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">,</span> section<span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n            <span class=\"token punctuation\">}</span>\n        <span class=\"token punctuation\">}</span><span class=\"token punctuation\">;</span>\n    <span class=\"token punctuation\">}</span>\n\n    <span class=\"token keyword\">public</span> <span class=\"token keyword\">static</span> <span class=\"token class-name\">Specification</span><span class=\"token generics\"><span class=\"token punctuation\">&lt;</span><span class=\"token class-name\">Seat</span><span class=\"token punctuation\">></span></span> <span class=\"token function\">equalRow</span><span class=\"token punctuation\">(</span><span class=\"token class-name\">String</span> row<span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span>\n        <span class=\"token keyword\">return</span> <span class=\"token keyword\">new</span> <span class=\"token class-name\">Specification</span><span class=\"token generics\"><span class=\"token punctuation\">&lt;</span><span class=\"token class-name\">Seat</span><span class=\"token punctuation\">></span></span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span>\n            <span class=\"token annotation punctuation\">@Override</span>\n            <span class=\"token keyword\">public</span> <span class=\"token class-name\">Predicate</span> <span class=\"token function\">toPredicate</span><span class=\"token punctuation\">(</span><span class=\"token class-name\">Root</span><span class=\"token generics\"><span class=\"token punctuation\">&lt;</span><span class=\"token class-name\">Seat</span><span class=\"token punctuation\">></span></span> root<span class=\"token punctuation\">,</span> <span class=\"token class-name\">CriteriaQuery</span><span class=\"token generics\"><span class=\"token punctuation\">&lt;</span><span class=\"token operator\">?</span><span class=\"token punctuation\">></span></span> query<span class=\"token punctuation\">,</span> <span class=\"token class-name\">CriteriaBuilder</span> criteriaBuilder<span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span>\n                <span class=\"token keyword\">return</span> criteriaBuilder<span class=\"token punctuation\">.</span><span class=\"token function\">equal</span><span class=\"token punctuation\">(</span>root<span class=\"token punctuation\">.</span><span class=\"token function\">get</span><span class=\"token punctuation\">(</span><span class=\"token string\">\"row\"</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">,</span> row<span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n            <span class=\"token punctuation\">}</span>\n        <span class=\"token punctuation\">}</span><span class=\"token punctuation\">;</span>\n    <span class=\"token punctuation\">}</span>\n\n    <span class=\"token keyword\">public</span> <span class=\"token keyword\">static</span> <span class=\"token class-name\">Specification</span><span class=\"token generics\"><span class=\"token punctuation\">&lt;</span><span class=\"token class-name\">Seat</span><span class=\"token punctuation\">></span></span> <span class=\"token function\">equalNum</span><span class=\"token punctuation\">(</span><span class=\"token class-name\">String</span> num<span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span>\n        <span class=\"token keyword\">return</span> <span class=\"token keyword\">new</span> <span class=\"token class-name\">Specification</span><span class=\"token generics\"><span class=\"token punctuation\">&lt;</span><span class=\"token class-name\">Seat</span><span class=\"token punctuation\">></span></span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span>\n            <span class=\"token annotation punctuation\">@Override</span>\n            <span class=\"token keyword\">public</span> <span class=\"token class-name\">Predicate</span> <span class=\"token function\">toPredicate</span><span class=\"token punctuation\">(</span><span class=\"token class-name\">Root</span><span class=\"token generics\"><span class=\"token punctuation\">&lt;</span><span class=\"token class-name\">Seat</span><span class=\"token punctuation\">></span></span> root<span class=\"token punctuation\">,</span> <span class=\"token class-name\">CriteriaQuery</span><span class=\"token generics\"><span class=\"token punctuation\">&lt;</span><span class=\"token operator\">?</span><span class=\"token punctuation\">></span></span> query<span class=\"token punctuation\">,</span> <span class=\"token class-name\">CriteriaBuilder</span> criteriaBuilder<span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span>\n                <span class=\"token keyword\">return</span> criteriaBuilder<span class=\"token punctuation\">.</span><span class=\"token function\">equal</span><span class=\"token punctuation\">(</span>root<span class=\"token punctuation\">.</span><span class=\"token function\">get</span><span class=\"token punctuation\">(</span><span class=\"token string\">\"num\"</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">,</span> num<span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n            <span class=\"token punctuation\">}</span>\n        <span class=\"token punctuation\">}</span><span class=\"token punctuation\">;</span>\n    <span class=\"token punctuation\">}</span>\n<span class=\"token punctuation\">}</span></code></pre></div>\n<p>그 다음, <code class=\"language-text\">Specification</code> 클래스를 추가해주고 비교를 원하는 쿼리 조건들을 메서드로 추가해준다.<br>\n각 메서드에서는 <code class=\"language-text\">criteriaBuilder.equal(root.get(\"원하는 컬럼\"), 원하는 컬럼)</code>을 통해 서로 같은지 비교하는 쿼리문이 추가된다. <code class=\"language-text\">criteriaBuilder</code>는 <strong>equal</strong> 말고도 <strong>like</strong>, <strong>between</strong> 등 다양한 메서드를 지원한다.</p>\n<h2 id=\"원하는-조건에-맞게-쿼리-조건-추가\" style=\"position:relative;\"><a href=\"#%EC%9B%90%ED%95%98%EB%8A%94-%EC%A1%B0%EA%B1%B4%EC%97%90-%EB%A7%9E%EA%B2%8C-%EC%BF%BC%EB%A6%AC-%EC%A1%B0%EA%B1%B4-%EC%B6%94%EA%B0%80\" aria-label=\"원하는 조건에 맞게 쿼리 조건 추가 permalink\" class=\"anchor before\"><svg aria-hidden=\"true\" focusable=\"false\" height=\"16\" version=\"1.1\" viewBox=\"0 0 16 16\" width=\"16\"><path fill-rule=\"evenodd\" d=\"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z\"></path></svg></a>원하는 조건에 맞게 쿼리 조건 추가</h2>\n<div class=\"gatsby-highlight\" data-language=\"java\"><pre class=\"language-java\"><code class=\"language-java\"><span class=\"token keyword\">public</span> <span class=\"token class-name\">List</span><span class=\"token generics\"><span class=\"token punctuation\">&lt;</span><span class=\"token class-name\">Seat</span><span class=\"token punctuation\">></span></span> <span class=\"token function\">seatFilterList</span><span class=\"token punctuation\">(</span><span class=\"token class-name\">String</span> levelName<span class=\"token punctuation\">,</span> <span class=\"token class-name\">SeatFilterRequest</span> seatFilterRequest<span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span>\n    <span class=\"token class-name\">Level</span> level <span class=\"token operator\">=</span> levelRepository<span class=\"token punctuation\">.</span><span class=\"token function\">findByLevelName</span><span class=\"token punctuation\">(</span>levelName<span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n    <span class=\"token class-name\">String</span> section <span class=\"token operator\">=</span> seatFilterRequest<span class=\"token punctuation\">.</span><span class=\"token function\">getSection</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n    <span class=\"token class-name\">String</span> row <span class=\"token operator\">=</span> seatFilterRequest<span class=\"token punctuation\">.</span><span class=\"token function\">getRow</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n    <span class=\"token class-name\">String</span> num <span class=\"token operator\">=</span> seatFilterRequest<span class=\"token punctuation\">.</span><span class=\"token function\">getNum</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n\n    <span class=\"token class-name\">Specification</span><span class=\"token generics\"><span class=\"token punctuation\">&lt;</span><span class=\"token class-name\">Seat</span><span class=\"token punctuation\">></span></span> spec <span class=\"token operator\">=</span> <span class=\"token class-name\">Specification</span><span class=\"token punctuation\">.</span><span class=\"token function\">where</span><span class=\"token punctuation\">(</span><span class=\"token class-name\">SeatFilterSpecification</span><span class=\"token punctuation\">.</span><span class=\"token function\">equalLevelId</span><span class=\"token punctuation\">(</span>level<span class=\"token punctuation\">.</span><span class=\"token function\">getLevelId</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n    <span class=\"token keyword\">if</span><span class=\"token punctuation\">(</span><span class=\"token operator\">!</span>section<span class=\"token punctuation\">.</span><span class=\"token function\">equals</span><span class=\"token punctuation\">(</span><span class=\"token string\">\"All\"</span><span class=\"token punctuation\">)</span> <span class=\"token operator\">&amp;&amp;</span> <span class=\"token operator\">!</span>section<span class=\"token punctuation\">.</span><span class=\"token function\">equals</span><span class=\"token punctuation\">(</span><span class=\"token string\">\"\"</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span>\n        spec <span class=\"token operator\">=</span> spec<span class=\"token punctuation\">.</span><span class=\"token function\">and</span><span class=\"token punctuation\">(</span><span class=\"token class-name\">SeatFilterSpecification</span><span class=\"token punctuation\">.</span><span class=\"token function\">equalSection</span><span class=\"token punctuation\">(</span>section<span class=\"token punctuation\">)</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n    <span class=\"token punctuation\">}</span>\n    <span class=\"token keyword\">if</span><span class=\"token punctuation\">(</span><span class=\"token operator\">!</span>row<span class=\"token punctuation\">.</span><span class=\"token function\">equals</span><span class=\"token punctuation\">(</span><span class=\"token string\">\"\"</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span>\n        spec <span class=\"token operator\">=</span> spec<span class=\"token punctuation\">.</span><span class=\"token function\">and</span><span class=\"token punctuation\">(</span><span class=\"token class-name\">SeatFilterSpecification</span><span class=\"token punctuation\">.</span><span class=\"token function\">equalRow</span><span class=\"token punctuation\">(</span>row<span class=\"token punctuation\">)</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n    <span class=\"token punctuation\">}</span>\n    <span class=\"token keyword\">if</span><span class=\"token punctuation\">(</span><span class=\"token operator\">!</span>num<span class=\"token punctuation\">.</span><span class=\"token function\">equals</span><span class=\"token punctuation\">(</span><span class=\"token string\">\"\"</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span>\n        spec <span class=\"token operator\">=</span> spec<span class=\"token punctuation\">.</span><span class=\"token function\">and</span><span class=\"token punctuation\">(</span><span class=\"token class-name\">SeatFilterSpecification</span><span class=\"token punctuation\">.</span><span class=\"token function\">equalNum</span><span class=\"token punctuation\">(</span>num<span class=\"token punctuation\">)</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n    <span class=\"token punctuation\">}</span>\n\n    <span class=\"token keyword\">return</span> seatRepository<span class=\"token punctuation\">.</span><span class=\"token function\">findAll</span><span class=\"token punctuation\">(</span>spec<span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n<span class=\"token punctuation\">}</span></code></pre></div>\n<p>앞에서 만들었던 <code class=\"language-text\">Specification</code> 클래스에 <code class=\"language-text\">where()</code> 메서드와 <code class=\"language-text\">and()</code> 메서드를 활용해서 원하는 조건에 맞게 쿼리 조건을 처리할 수 있다.</p>\n<hr>\n<h2 id=\"reference\" style=\"position:relative;\"><a href=\"#reference\" aria-label=\"reference permalink\" class=\"anchor before\"><svg aria-hidden=\"true\" focusable=\"false\" height=\"16\" version=\"1.1\" viewBox=\"0 0 16 16\" width=\"16\"><path fill-rule=\"evenodd\" d=\"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z\"></path></svg></a>Reference</h2>\n<p><a href=\"https://groti.tistory.com/49\">[Spring Boot ] JPA Specification 이용하여 쿼리 조건 다루기</a><br>\n<a href=\"https://velog.io/@hellozin/JPA-Specification%EC%9C%BC%EB%A1%9C-%EC%BF%BC%EB%A6%AC-%EC%A1%B0%EA%B1%B4-%EC%B2%98%EB%A6%AC%ED%95%98%EA%B8%B0\">JPA Specification으로 쿼리 조건 처리하기</a></p>\n<div class=\"table-of-contents\">\n<ul>\n<li><a href=\"#jpaspecificationexecutor-%EC%83%81%EC%86%8D\">JpaSpecificationExecutor 상속</a></li>\n<li><a href=\"#%EC%9B%90%ED%95%98%EB%8A%94-%EC%A1%B0%EA%B1%B4%EC%97%90-%EB%A7%9E%EA%B2%8C-%EC%BF%BC%EB%A6%AC-%EC%A1%B0%EA%B1%B4-%EC%B6%94%EA%B0%80\">원하는 조건에 맞게 쿼리 조건 추가</a></li>\n<li><a href=\"#reference\">Reference</a></li>\n</ul>\n</div>","excerpt":"Spring Boot에서는 기본적인 CRUD가 가능하도록 JpaRepository 인터페이스를 제공하는데 여기서 findByName 같은 형식으로 쿼리 메서드를 만들어서 조건에 맞게 검색할 수 있다. 하지만 조건이 다양해지면 그만큼 쿼리 메서드도 많이 필요하고, 코드도 복잡해지는 문제점이 생긴다. 다음은 실제 스프링을 이용한 프로젝트에서 쿼리 메서드가 많아지면서 복잡해진 수정 전 코드다. 스프링으로 하는 첫 프로젝트여서 기본적인 쿼리 메서드 사용 방법만 알고 있는 상태로 조건 처리를 하려고 했는데, 조건이 복잡해지면서 코드도 복잡해졌고 실행에는 문제가 없지만 그냥 봐도 리팩토링이 필요한 코드라는 생각이 들었다. 그래서 더 간단하게 코드를 짜는 방법이 있을 거라고 생각하면서 구글링을 한 결과, JPA Specification을 활용하면 보다 간단하게 구현할 수 있다는 것을 알게 되었다. JpaSpecificationExecutor 상속 우선 JPA Specification을 사용하기…","frontmatter":{"date":"April 24, 2022","title":"[Spring Boot] JPA Specification을 이용한 쿼리 조건 처리","categories":"Spring","author":"JFe","emoji":"📝"},"fields":{"slug":"/jpa-specification/"}},"next":{"id":"d7b22037-513a-5cc1-87e7-ca978abda6b5","html":"<h2 id=\"2019-카카오-개발자-겨울-인턴십\" style=\"position:relative;\"><a href=\"#2019-%EC%B9%B4%EC%B9%B4%EC%98%A4-%EA%B0%9C%EB%B0%9C%EC%9E%90-%EA%B2%A8%EC%9A%B8-%EC%9D%B8%ED%84%B4%EC%8B%AD\" aria-label=\"2019 카카오 개발자 겨울 인턴십 permalink\" class=\"anchor before\"><svg aria-hidden=\"true\" focusable=\"false\" height=\"16\" version=\"1.1\" viewBox=\"0 0 16 16\" width=\"16\"><path fill-rule=\"evenodd\" d=\"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z\"></path></svg></a>[2019 카카오 개발자 겨울 인턴십]</h2>\n<h2 id=\"문제\" style=\"position:relative;\"><a href=\"#%EB%AC%B8%EC%A0%9C\" aria-label=\"문제 permalink\" class=\"anchor before\"><svg aria-hidden=\"true\" focusable=\"false\" height=\"16\" version=\"1.1\" viewBox=\"0 0 16 16\" width=\"16\"><path fill-rule=\"evenodd\" d=\"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z\"></path></svg></a>문제</h2>\n<p><a href=\"https://programmers.co.kr/learn/courses/30/lessons/64065\">https://programmers.co.kr/learn/courses/30/lessons/64065</a></p>\n<p>셀수있는 수량의 순서있는 열거 또는 어떤 순서를 따르는 요소들의 모음을 튜플(tuple)이라고 합니다. n개의 요소를 가진 튜플을 n-튜플(n-tuple)이라고 하며, 다음과 같이 표현할 수 있습니다.</p>\n<ul>\n<li>(a1, a2, a3, …, an)</li>\n</ul>\n<p>튜플은 다음과 같은 성질을 가지고 있습니다.</p>\n<ol>\n<li>중복된 원소가 있을 수 있습니다. ex : (2, 3, 1, 2)</li>\n<li>원소에 정해진 순서가 있으며, 원소의 순서가 다르면 서로 다른 튜플입니다. ex : (1, 2, 3) ≠ (1, 3, 2)</li>\n<li>튜플의 원소 개수는 유한합니다.</li>\n</ol>\n<p>원소의 개수가 n개이고, 중복되는 원소가 없는 튜플 (a1, a2, a3, …, an)이 주어질 때(단, a1, a2, …, an은 자연수), 이는 다음과 같이 집합 기호 ’{’, ’}‘를 이용해 표현할 수 있습니다.</p>\n<ul>\n<li>{{a1}, {a1, a2}, {a1, a2, a3}, {a1, a2, a3, a4}, … {a1, a2, a3, a4, …, an}}</li>\n</ul>\n<p>예를 들어 튜플이 (2, 1, 3, 4)인 경우 이는</p>\n<ul>\n<li>{{2}, {2, 1}, {2, 1, 3}, {2, 1, 3, 4}}</li>\n</ul>\n<p>와 같이 표현할 수 있습니다. 이때, 집합은 원소의 순서가 바뀌어도 상관없으므로</p>\n<ul>\n<li>{{2}, {2, 1}, {2, 1, 3}, {2, 1, 3, 4}}</li>\n<li>{{2, 1, 3, 4}, {2}, {2, 1, 3}, {2, 1}}</li>\n<li>{{1, 2, 3}, {2, 1}, {1, 2, 4, 3}, {2}}</li>\n</ul>\n<p>는 모두 같은 튜플 (2, 1, 3, 4)를 나타냅니다.</p>\n<h2 id=\"특정-튜플을-표현하는-집합이-담긴-문자열-s가-매개변수로-주어질-때-s가-표현하는-튜플을-배열에-담아-return-하도록-solution-함수를-완성해주세요\" style=\"position:relative;\"><a href=\"#%ED%8A%B9%EC%A0%95-%ED%8A%9C%ED%94%8C%EC%9D%84-%ED%91%9C%ED%98%84%ED%95%98%EB%8A%94-%EC%A7%91%ED%95%A9%EC%9D%B4-%EB%8B%B4%EA%B8%B4-%EB%AC%B8%EC%9E%90%EC%97%B4-s%EA%B0%80-%EB%A7%A4%EA%B0%9C%EB%B3%80%EC%88%98%EB%A1%9C-%EC%A3%BC%EC%96%B4%EC%A7%88-%EB%95%8C-s%EA%B0%80-%ED%91%9C%ED%98%84%ED%95%98%EB%8A%94-%ED%8A%9C%ED%94%8C%EC%9D%84-%EB%B0%B0%EC%97%B4%EC%97%90-%EB%8B%B4%EC%95%84-return-%ED%95%98%EB%8F%84%EB%A1%9D-solution-%ED%95%A8%EC%88%98%EB%A5%BC-%EC%99%84%EC%84%B1%ED%95%B4%EC%A3%BC%EC%84%B8%EC%9A%94\" aria-label=\"특정 튜플을 표현하는 집합이 담긴 문자열 s가 매개변수로 주어질 때 s가 표현하는 튜플을 배열에 담아 return 하도록 solution 함수를 완성해주세요 permalink\" class=\"anchor before\"><svg aria-hidden=\"true\" focusable=\"false\" height=\"16\" version=\"1.1\" viewBox=\"0 0 16 16\" width=\"16\"><path fill-rule=\"evenodd\" d=\"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z\"></path></svg></a>특정 튜플을 표현하는 집합이 담긴 문자열 s가 매개변수로 주어질 때, s가 표현하는 튜플을 배열에 담아 return 하도록 solution 함수를 완성해주세요.</h2>\n<h2 id=\"제한사항\" style=\"position:relative;\"><a href=\"#%EC%A0%9C%ED%95%9C%EC%82%AC%ED%95%AD\" aria-label=\"제한사항 permalink\" class=\"anchor before\"><svg aria-hidden=\"true\" focusable=\"false\" height=\"16\" version=\"1.1\" viewBox=\"0 0 16 16\" width=\"16\"><path fill-rule=\"evenodd\" d=\"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z\"></path></svg></a>제한사항</h2>\n<ul>\n<li>s의 길이는 5 이상 1,000,000 이하입니다.</li>\n<li>s는 숫자와 ’{’, ’}’, ’,’ 로만 이루어져 있습니다.</li>\n<li>숫자가 0으로 시작하는 경우는 없습니다.</li>\n<li>s는 항상 중복되는 원소가 없는 튜플을 올바르게 표현하고 있습니다.</li>\n<li>s가 표현하는 튜플의 원소는 1 이상 100,000 이하인 자연수입니다.</li>\n<li>return 하는 배열의 길이가 1 이상 500 이하인 경우만 입력으로 주어집니다.</li>\n</ul>\n<hr>\n<h2 id=\"입출력-예\" style=\"position:relative;\"><a href=\"#%EC%9E%85%EC%B6%9C%EB%A0%A5-%EC%98%88\" aria-label=\"입출력 예 permalink\" class=\"anchor before\"><svg aria-hidden=\"true\" focusable=\"false\" height=\"16\" version=\"1.1\" viewBox=\"0 0 16 16\" width=\"16\"><path fill-rule=\"evenodd\" d=\"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z\"></path></svg></a>입출력 예</h2>\n<table>\n<thead>\n<tr>\n<th>s</th>\n<th>return</th>\n</tr>\n</thead>\n<tbody>\n<tr>\n<td>“{{2},{2,1},{2,1,3},{2,1,3,4}}”</td>\n<td>[2, 1, 3, 4]</td>\n</tr>\n<tr>\n<td>“{{1,2,3},{2,1},{1,2,4,3},{2}}”</td>\n<td>[2, 1, 3, 4]</td>\n</tr>\n<tr>\n<td>“{{20,111},{111}}”</td>\n<td>[111, 20]</td>\n</tr>\n<tr>\n<td>“{{123}}”</td>\n<td>[123]</td>\n</tr>\n<tr>\n<td>“{{4,2,3},{3},{2,3,4,1},{2,3}}”</td>\n<td>[3, 2, 4, 1]</td>\n</tr>\n</tbody>\n</table>\n<hr>\n<h2 id=\"-algorithm\" style=\"position:relative;\"><a href=\"#-algorithm\" aria-label=\" algorithm permalink\" class=\"anchor before\"><svg aria-hidden=\"true\" focusable=\"false\" height=\"16\" version=\"1.1\" viewBox=\"0 0 16 16\" width=\"16\"><path fill-rule=\"evenodd\" d=\"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z\"></path></svg></a>🔍 Algorithm</h2>\n<p><strong>문자열</strong></p>\n<h2 id=\"-logic\" style=\"position:relative;\"><a href=\"#-logic\" aria-label=\" logic permalink\" class=\"anchor before\"><svg aria-hidden=\"true\" focusable=\"false\" height=\"16\" version=\"1.1\" viewBox=\"0 0 16 16\" width=\"16\"><path fill-rule=\"evenodd\" d=\"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z\"></path></svg></a>💻 Logic</h2>\n<div class=\"gatsby-highlight\" data-language=\"python\"><pre class=\"language-python\"><code class=\"language-python\">s_list <span class=\"token operator\">=</span> s<span class=\"token punctuation\">.</span>split<span class=\"token punctuation\">(</span><span class=\"token string\">'},{'</span><span class=\"token punctuation\">)</span>     <span class=\"token comment\"># '},{' 기준으로 문자열 나눔</span>\n<span class=\"token keyword\">for</span> i <span class=\"token keyword\">in</span> <span class=\"token builtin\">range</span><span class=\"token punctuation\">(</span><span class=\"token builtin\">len</span><span class=\"token punctuation\">(</span>s_list<span class=\"token punctuation\">)</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">:</span>\n    s_list<span class=\"token punctuation\">[</span>i<span class=\"token punctuation\">]</span> <span class=\"token operator\">=</span> s_list<span class=\"token punctuation\">[</span>i<span class=\"token punctuation\">]</span><span class=\"token punctuation\">.</span>strip<span class=\"token punctuation\">(</span><span class=\"token string\">'{'</span><span class=\"token string\">'}'</span><span class=\"token punctuation\">)</span> <span class=\"token comment\"># 문자열 양 끝마다 필요없는 괄호 제거</span>\n    s_list<span class=\"token punctuation\">[</span>i<span class=\"token punctuation\">]</span> <span class=\"token operator\">=</span> <span class=\"token builtin\">list</span><span class=\"token punctuation\">(</span><span class=\"token builtin\">map</span><span class=\"token punctuation\">(</span><span class=\"token builtin\">int</span><span class=\"token punctuation\">,</span> s_list<span class=\"token punctuation\">[</span>i<span class=\"token punctuation\">]</span><span class=\"token punctuation\">.</span>split<span class=\"token punctuation\">(</span><span class=\"token string\">','</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">)</span>    <span class=\"token comment\"># ','를 기준으로 나누고 int로 변환해서 리스트 저장</span>\ns_list<span class=\"token punctuation\">.</span>sort<span class=\"token punctuation\">(</span>key<span class=\"token operator\">=</span><span class=\"token builtin\">len</span><span class=\"token punctuation\">)</span>    <span class=\"token comment\"># 길이 순서로 오름차순 정렬</span></code></pre></div>\n<ul>\n<li><strong><code class=\"language-text\">'},{'</code> 기준으로 문자열 나눔</strong><br>\n<code class=\"language-text\">','</code>를 기준으로 <strong>split</strong>하면 괄호 안의 <code class=\"language-text\">','</code> 기준으로도 같이 나뉘기 때문에<br>\n닫는 괄호와 여는 괄호를 포함한 <code class=\"language-text\">'},{'</code>를 기준으로 문자열을 나눠준다.</li>\n<li><strong>split한 리스트마다 문자열 파싱</strong><br>\n먼저, 필요없는 괄호를 제거하기 위해 <code class=\"language-text\">strip</code> 함수를 이용해 문자열 양 끝에 있는 괄호들을 없애준다.<br>\n다음으로 <code class=\"language-text\">','</code>를 기준으로 나눠주고 <strong>int형</strong>으로 값을 저장하기 위해 <code class=\"language-text\">map</code>을 이용해 <strong>int형</strong>으로 변환해주고 리스트로 다시 저장한다.</li>\n<li><strong>길이 순서로 오름차순 정렬</strong><br>\n길이 순서로 정렬해야지 제대로 된 튜플 답을 편하게 구할 수 있기 때문에 <code class=\"language-text\">key=len</code>을 이용해서 정렬해준다.</li>\n</ul>\n<div class=\"gatsby-highlight\" data-language=\"python\"><pre class=\"language-python\"><code class=\"language-python\"><span class=\"token comment\"># 리스트 반복문 돌면서 answer에 없는 값이면 answer에 추가 </span>\n<span class=\"token keyword\">for</span> l <span class=\"token keyword\">in</span> s_list<span class=\"token punctuation\">:</span>\n    <span class=\"token keyword\">for</span> n <span class=\"token keyword\">in</span> l<span class=\"token punctuation\">:</span>\n        <span class=\"token keyword\">if</span> n <span class=\"token keyword\">not</span> <span class=\"token keyword\">in</span> answer<span class=\"token punctuation\">:</span> answer<span class=\"token punctuation\">.</span>append<span class=\"token punctuation\">(</span>n<span class=\"token punctuation\">)</span>\n<span class=\"token keyword\">return</span> answer</code></pre></div>\n<ul>\n<li><strong>리스트 반복문 돌면서 answer에 없는 값이면 answer에 추가</strong><br>\n튜플에 값이 중복되지 않게 넣어야 되기 때문에 조건문을 통해 확인하고 <code class=\"language-text\">answer</code>에 <strong>append</strong> 해준다.</li>\n</ul>\n<hr>\n<h2 id=\"-code\" style=\"position:relative;\"><a href=\"#-code\" aria-label=\" code permalink\" class=\"anchor before\"><svg aria-hidden=\"true\" focusable=\"false\" height=\"16\" version=\"1.1\" viewBox=\"0 0 16 16\" width=\"16\"><path fill-rule=\"evenodd\" d=\"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z\"></path></svg></a>🧩 Code</h2>\n<details><summary>전체 코드 확인</summary>\n<div class=\"gatsby-highlight\" data-language=\"python\"><pre class=\"language-python\"><code class=\"language-python\"><span class=\"token keyword\">def</span> <span class=\"token function\">solution</span><span class=\"token punctuation\">(</span>s<span class=\"token punctuation\">)</span><span class=\"token punctuation\">:</span>\n    answer <span class=\"token operator\">=</span> <span class=\"token punctuation\">[</span><span class=\"token punctuation\">]</span>\n    s_list <span class=\"token operator\">=</span> s<span class=\"token punctuation\">.</span>split<span class=\"token punctuation\">(</span><span class=\"token string\">'},{'</span><span class=\"token punctuation\">)</span>     <span class=\"token comment\"># '},{' 기준으로 문자열 나눔</span>\n    <span class=\"token keyword\">for</span> i <span class=\"token keyword\">in</span> <span class=\"token builtin\">range</span><span class=\"token punctuation\">(</span><span class=\"token builtin\">len</span><span class=\"token punctuation\">(</span>s_list<span class=\"token punctuation\">)</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">:</span>\n        s_list<span class=\"token punctuation\">[</span>i<span class=\"token punctuation\">]</span> <span class=\"token operator\">=</span> s_list<span class=\"token punctuation\">[</span>i<span class=\"token punctuation\">]</span><span class=\"token punctuation\">.</span>strip<span class=\"token punctuation\">(</span><span class=\"token string\">'{'</span><span class=\"token string\">'}'</span><span class=\"token punctuation\">)</span> <span class=\"token comment\"># 문자열 양 끝마다 필요없는 괄호 제거</span>\n        s_list<span class=\"token punctuation\">[</span>i<span class=\"token punctuation\">]</span> <span class=\"token operator\">=</span> <span class=\"token builtin\">list</span><span class=\"token punctuation\">(</span><span class=\"token builtin\">map</span><span class=\"token punctuation\">(</span><span class=\"token builtin\">int</span><span class=\"token punctuation\">,</span> s_list<span class=\"token punctuation\">[</span>i<span class=\"token punctuation\">]</span><span class=\"token punctuation\">.</span>split<span class=\"token punctuation\">(</span><span class=\"token string\">','</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">)</span>    <span class=\"token comment\"># ','를 기준으로 나누고 int로 변환해서 리스트 저장</span>\n    s_list<span class=\"token punctuation\">.</span>sort<span class=\"token punctuation\">(</span>key<span class=\"token operator\">=</span><span class=\"token builtin\">len</span><span class=\"token punctuation\">)</span>    <span class=\"token comment\"># 길이 순서로 오름차순 정렬</span>\n    <span class=\"token comment\"># 리스트 반복문 돌면서 answer에 없는 값이면 answer에 추가 </span>\n    <span class=\"token keyword\">for</span> l <span class=\"token keyword\">in</span> s_list<span class=\"token punctuation\">:</span>\n        <span class=\"token keyword\">for</span> n <span class=\"token keyword\">in</span> l<span class=\"token punctuation\">:</span>\n            <span class=\"token keyword\">if</span> n <span class=\"token keyword\">not</span> <span class=\"token keyword\">in</span> answer<span class=\"token punctuation\">:</span> answer<span class=\"token punctuation\">.</span>append<span class=\"token punctuation\">(</span>n<span class=\"token punctuation\">)</span>\n    <span class=\"token keyword\">return</span> answer</code></pre></div>\n</details>\n<hr>\n<h2 id=\"-review\" style=\"position:relative;\"><a href=\"#-review\" aria-label=\" review permalink\" class=\"anchor before\"><svg aria-hidden=\"true\" focusable=\"false\" height=\"16\" version=\"1.1\" viewBox=\"0 0 16 16\" width=\"16\"><path fill-rule=\"evenodd\" d=\"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z\"></path></svg></a>📝 Review</h2>\n<p>튜플 원소 순서가 부분집합 크기 작은 것부터 중복되는 값을 포함 안 하면서 순서대로인 것을 찾고, 이에 맞게 문자열을 파싱하면서 구현했다.<br>\n앞부분 테스트케이스들은 빠르게 처리되는데 뒷부분 테스트케이스들은 실행 시간이 급격히 늘어나는 걸 보니 더 효율적인 방법이 있을 것 같다,,</p>\n<div class=\"table-of-contents\">\n<ul>\n<li><a href=\"#2019-%EC%B9%B4%EC%B9%B4%EC%98%A4-%EA%B0%9C%EB%B0%9C%EC%9E%90-%EA%B2%A8%EC%9A%B8-%EC%9D%B8%ED%84%B4%EC%8B%AD\">[2019 카카오 개발자 겨울 인턴십]</a></li>\n<li><a href=\"#%EB%AC%B8%EC%A0%9C\">문제</a></li>\n<li><a href=\"#%ED%8A%B9%EC%A0%95-%ED%8A%9C%ED%94%8C%EC%9D%84-%ED%91%9C%ED%98%84%ED%95%98%EB%8A%94-%EC%A7%91%ED%95%A9%EC%9D%B4-%EB%8B%B4%EA%B8%B4-%EB%AC%B8%EC%9E%90%EC%97%B4-s%EA%B0%80-%EB%A7%A4%EA%B0%9C%EB%B3%80%EC%88%98%EB%A1%9C-%EC%A3%BC%EC%96%B4%EC%A7%88-%EB%95%8C-s%EA%B0%80-%ED%91%9C%ED%98%84%ED%95%98%EB%8A%94-%ED%8A%9C%ED%94%8C%EC%9D%84-%EB%B0%B0%EC%97%B4%EC%97%90-%EB%8B%B4%EC%95%84-return-%ED%95%98%EB%8F%84%EB%A1%9D-solution-%ED%95%A8%EC%88%98%EB%A5%BC-%EC%99%84%EC%84%B1%ED%95%B4%EC%A3%BC%EC%84%B8%EC%9A%94\">특정 튜플을 표현하는 집합이 담긴 문자열 s가 매개변수로 주어질 때, s가 표현하는 튜플을 배열에 담아 return 하도록 solution 함수를 완성해주세요.</a></li>\n<li><a href=\"#%EC%A0%9C%ED%95%9C%EC%82%AC%ED%95%AD\">제한사항</a></li>\n<li><a href=\"#%EC%9E%85%EC%B6%9C%EB%A0%A5-%EC%98%88\">입출력 예</a></li>\n<li><a href=\"#-algorithm\">🔍 Algorithm</a></li>\n<li><a href=\"#-logic\">💻 Logic</a></li>\n<li><a href=\"#-code\">🧩 Code</a></li>\n<li><a href=\"#-review\">📝 Review</a></li>\n</ul>\n</div>","frontmatter":{"date":"April 16, 2022","title":"[Programmers] 64065번: 튜플 (Python)","categories":"Algorithm","author":"JFe","emoji":"💻"},"fields":{"slug":"/pg-64065/"}},"prev":{"id":"3f765108-04e4-5f13-99c9-89236ea9e214","html":"<h2 id=\"2020-카카오-인턴십\" style=\"position:relative;\"><a href=\"#2020-%EC%B9%B4%EC%B9%B4%EC%98%A4-%EC%9D%B8%ED%84%B4%EC%8B%AD\" aria-label=\"2020 카카오 인턴십 permalink\" class=\"anchor before\"><svg aria-hidden=\"true\" focusable=\"false\" height=\"16\" version=\"1.1\" viewBox=\"0 0 16 16\" width=\"16\"><path fill-rule=\"evenodd\" d=\"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z\"></path></svg></a>[2020 카카오 인턴십]</h2>\n<h2 id=\"문제\" style=\"position:relative;\"><a href=\"#%EB%AC%B8%EC%A0%9C\" aria-label=\"문제 permalink\" class=\"anchor before\"><svg aria-hidden=\"true\" focusable=\"false\" height=\"16\" version=\"1.1\" viewBox=\"0 0 16 16\" width=\"16\"><path fill-rule=\"evenodd\" d=\"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z\"></path></svg></a>문제</h2>\n<p><a href=\"https://programmers.co.kr/learn/courses/30/lessons/67256\">https://programmers.co.kr/learn/courses/30/lessons/67256</a></p>\n<p>스마트폰 전화 키패드의 각 칸에 다음과 같이 숫자들이 적혀 있습니다.</p>\n<p><span\n      class=\"gatsby-resp-image-wrapper\"\n      style=\"position: relative; display: block; margin-left: auto; margin-right: auto; max-width: 720px; \"\n    >\n      <span\n    class=\"gatsby-resp-image-background-image\"\n    style=\"padding-bottom: 100%; position: relative; bottom: 0; left: 0; background-image: url('data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAAUCAYAAACNiR0NAAAACXBIWXMAAAsSAAALEgHS3X78AAADHUlEQVQ4y52US1NTZxjH/SCduqijOEhUgmAlgQAnF3JygdhFbZlxSjvTfonO9DO4dOW01dpwTTsiNATkXJIQICEkJAEMtNpFlzQZLlrDr3PeSCoEOoOL/5znvTy/eW7vOReKaBxqfFqt2cOTswSfzggNPZ0Vqq0nZ2t33/UxdO44zPgaiqfzpAqbJPNFFlc3hAw7VSgynynU+dQBa5FNPSO9VkTRNH786THBkTG+f/hIKDgyysPHQabC0yRz64xMzXHcvw44GlZY33qBXfbywUeXuNBoOqIPL17mRruVxXSWUEQ/PeVDjYVV8s+3cPcFuNr6MTfaO2i5ZcV8y0pLewfXb1qwdNuJJ9OEZs4A9AQ+ocvpptsl4/D4cXr92GWfsK09jrMD5b4A7V0Slh47Nqcbm6OXDslJp6MXS7fE/PsAe3o9OLx+EVU1yj6xfm+gVXLS5XLXZERqlOHMwJwA3hbpGTU8jOywhgYwnlz5H+C7Qx1W2NjcQu6/LYrfaXchyV4kt5culyzKYHR5MZXmlyNDrf4HHH9LH/pNYTm9QrmYFtEYACNVSfYJaI/bI/ZbLZ38uaSQTGcYejvc48dTHptWmZjVKBUWKOUTwtGIRsguI9llHHK1OQIYm6K0luTXiFr/9IzQh8IqqbhOJadSerGBwxegsbkFk7kN23d3aP02gKm5jaaWNm7aJF6uJKCgk4hqDIdVwTgZmNfY3sohefu5Ym6lydyG68E3OB98LWzj9ZitNv5Y0jhYi7FwGtDYTMY03uSjlHNxPH4/5xsauWxq5kLTVS42XaPB1Mz5hit4fT620wr/FKLM61XfurEZCavEdI29VQ2eL/Dz/Xv0fTrAwOBXfH53kM/uDjLwxZf03xngyQ/3YXOJnayGqlZ9Qyc1ZdJoSjYqoK9/z1CpVKgcHBzRQaXCq2JK3NnORHkyU/U94QdbPfhrWedVTmc3F2N/fZHdrMZeLsbeWoL9jST7xWV2VnVe56O8TOmMnvZSjIM5RWMnq7KbUdhJRSjPT1BShvn7WZCSOko5GqKcmBBnexmFckYlMqcdgf4LlTqANFKXLFgAAAAASUVORK5CYII='); background-size: cover; display: block;\"\n  ></span>\n  <img\n        class=\"gatsby-resp-image-image\"\n        alt=\"kakao_phone1.png\"\n        title=\"kakao_phone1.png\"\n        src=\"/static/95c419a520a2d198bc5013a353beba5c/37523/kakao_phone1.png\"\n        srcset=\"/static/95c419a520a2d198bc5013a353beba5c/e9ff0/kakao_phone1.png 180w,\n/static/95c419a520a2d198bc5013a353beba5c/f21e7/kakao_phone1.png 360w,\n/static/95c419a520a2d198bc5013a353beba5c/37523/kakao_phone1.png 720w,\n/static/95c419a520a2d198bc5013a353beba5c/00d43/kakao_phone1.png 1000w\"\n        sizes=\"(max-width: 720px) 100vw, 720px\"\n        style=\"width:100%;height:100%;margin:0;vertical-align:middle;position:absolute;top:0;left:0;\"\n        loading=\"lazy\"\n        decoding=\"async\"\n      />\n    </span></p>\n<p>이 전화 키패드에서 왼손과 오른손의 엄지손가락만을 이용해서 숫자만을 입력하려고 합니다.<br>\n맨 처음 왼손 엄지손가락은 <code class=\"language-text\">*</code> 키패드에 오른손 엄지손가락은 <code class=\"language-text\">#</code> 키패드 위치에서 시작하며, 엄지손가락을 사용하는 규칙은 다음과 같습니다.</p>\n<ol>\n<li>엄지손가락은 상하좌우 4가지 방향으로만 이동할 수 있으며 키패드 이동 한 칸은 거리로 1에 해당합니다.</li>\n<li>왼쪽 열의 3개의 숫자 <code class=\"language-text\">1</code>, <code class=\"language-text\">4</code>, <code class=\"language-text\">7</code>을 입력할 때는 왼손 엄지손가락을 사용합니다.</li>\n<li>오른쪽 열의 3개의 숫자 <code class=\"language-text\">3</code>, <code class=\"language-text\">6</code>, <code class=\"language-text\">9</code>를 입력할 때는 오른손 엄지손가락을 사용합니다.</li>\n<li>가운데 열의 4개의 숫자 <code class=\"language-text\">2</code>, <code class=\"language-text\">5</code>, <code class=\"language-text\">8</code>, <code class=\"language-text\">0</code>을 입력할 때는 두 엄지손가락의 현재 키패드의 위치에서 더 가까운 엄지손가락을 사용합니다.<br>\n4-1. 만약 두 엄지손가락의 거리가 같다면, 오른손잡이는 오른손 엄지손가락, 왼손잡이는 왼손 엄지손가락을 사용합니다.</li>\n</ol>\n<p>순서대로 누를 번호가 담긴 배열 numbers, 왼손잡이인지 오른손잡이인 지를 나타내는 문자열 hand가 매개변수로 주어질 때, 각 번호를 누른 엄지손가락이 왼손인 지 오른손인 지를 나타내는 연속된 문자열 형태로 return 하도록 solution 함수를 완성해주세요.</p>\n<hr>\n<h2 id=\"제한사항\" style=\"position:relative;\"><a href=\"#%EC%A0%9C%ED%95%9C%EC%82%AC%ED%95%AD\" aria-label=\"제한사항 permalink\" class=\"anchor before\"><svg aria-hidden=\"true\" focusable=\"false\" height=\"16\" version=\"1.1\" viewBox=\"0 0 16 16\" width=\"16\"><path fill-rule=\"evenodd\" d=\"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z\"></path></svg></a>제한사항</h2>\n<ul>\n<li>numbers 배열의 크기는 1 이상 1,000 이하입니다.</li>\n<li>numbers 배열 원소의 값은 0 이상 9 이하인 정수입니다.</li>\n<li>hand는 <code class=\"language-text\">\"left\"</code> 또는 <code class=\"language-text\">\"right\"</code> 입니다.\n<ul>\n<li><code class=\"language-text\">\"left\"</code>는 왼손잡이, <code class=\"language-text\">\"right\"</code>는 오른손잡이를 의미합니다.</li>\n</ul>\n</li>\n<li>왼손 엄지손가락을 사용한 경우는 <code class=\"language-text\">L</code>, 오른손 엄지손가락을 사용한 경우는 <code class=\"language-text\">R</code>을 순서대로 이어붙여 문자열 형태로 return 해주세요.</li>\n</ul>\n<hr>\n<h2 id=\"입출력-예\" style=\"position:relative;\"><a href=\"#%EC%9E%85%EC%B6%9C%EB%A0%A5-%EC%98%88\" aria-label=\"입출력 예 permalink\" class=\"anchor before\"><svg aria-hidden=\"true\" focusable=\"false\" height=\"16\" version=\"1.1\" viewBox=\"0 0 16 16\" width=\"16\"><path fill-rule=\"evenodd\" d=\"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z\"></path></svg></a>입출력 예</h2>\n<table>\n<thead>\n<tr>\n<th>numbers</th>\n<th>hand</th>\n<th>return</th>\n</tr>\n</thead>\n<tbody>\n<tr>\n<td>[1, 3, 4, 5, 8, 2, 1, 4, 5, 9, 5]</td>\n<td>“right”</td>\n<td>“LRLLLRLLRRL”</td>\n</tr>\n<tr>\n<td>[7, 0, 8, 2, 8, 3, 1, 5, 7, 6, 2]</td>\n<td>“left”</td>\n<td>“LRLLRRLLLRR”</td>\n</tr>\n<tr>\n<td>[1, 2, 3, 4, 5, 6, 7, 8, 9, 0]</td>\n<td>“right”</td>\n<td>“LLRLLRLLRL”</td>\n</tr>\n</tbody>\n</table>\n<hr>\n<h2 id=\"-algorithm\" style=\"position:relative;\"><a href=\"#-algorithm\" aria-label=\" algorithm permalink\" class=\"anchor before\"><svg aria-hidden=\"true\" focusable=\"false\" height=\"16\" version=\"1.1\" viewBox=\"0 0 16 16\" width=\"16\"><path fill-rule=\"evenodd\" d=\"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z\"></path></svg></a>🔍 Algorithm</h2>\n<p><strong>구현</strong></p>\n<h2 id=\"-logic\" style=\"position:relative;\"><a href=\"#-logic\" aria-label=\" logic permalink\" class=\"anchor before\"><svg aria-hidden=\"true\" focusable=\"false\" height=\"16\" version=\"1.1\" viewBox=\"0 0 16 16\" width=\"16\"><path fill-rule=\"evenodd\" d=\"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z\"></path></svg></a>💻 Logic</h2>\n<div class=\"gatsby-highlight\" data-language=\"python\"><pre class=\"language-python\"><code class=\"language-python\">left<span class=\"token punctuation\">,</span> right <span class=\"token operator\">=</span> <span class=\"token punctuation\">[</span><span class=\"token number\">0</span><span class=\"token punctuation\">,</span> <span class=\"token number\">3</span><span class=\"token punctuation\">]</span><span class=\"token punctuation\">,</span> <span class=\"token punctuation\">[</span><span class=\"token number\">2</span><span class=\"token punctuation\">,</span> <span class=\"token number\">3</span><span class=\"token punctuation\">]</span>    <span class=\"token comment\"># '*', '#' 좌표[x, y] 저장</span>\n<span class=\"token keyword\">for</span> n <span class=\"token keyword\">in</span> numbers<span class=\"token punctuation\">:</span>\n    <span class=\"token keyword\">if</span> n <span class=\"token operator\">==</span> <span class=\"token number\">0</span><span class=\"token punctuation\">:</span> n <span class=\"token operator\">=</span> <span class=\"token number\">11</span>   <span class=\"token comment\"># 0은 계산 편하게 11로 저장</span>\n    x<span class=\"token punctuation\">,</span> y <span class=\"token operator\">=</span> <span class=\"token punctuation\">(</span>n<span class=\"token operator\">-</span><span class=\"token number\">1</span><span class=\"token punctuation\">)</span><span class=\"token operator\">%</span><span class=\"token number\">3</span><span class=\"token punctuation\">,</span> <span class=\"token punctuation\">(</span>n<span class=\"token operator\">-</span><span class=\"token number\">1</span><span class=\"token punctuation\">)</span><span class=\"token operator\">//</span><span class=\"token number\">3</span>    <span class=\"token comment\"># 해당 숫자의 키패드 상 좌표 계산</span></code></pre></div>\n<ul>\n<li><strong>왼손, 오른손 위치 저장</strong><br>\n<code class=\"language-text\">left</code>, <code class=\"language-text\">right</code>에 현재 왼손, 오른손 위치 저장<br>\n시작 위치는 <code class=\"language-text\">*</code>, <code class=\"language-text\">#</code> 좌표[x, y] 저장</li>\n<li><strong>numbers에 있는 숫자만큼 반복문 진행</strong><br>\n키패드 상에 있는 위치에 맞게 <code class=\"language-text\">x = (n-1) % 3</code>, <code class=\"language-text\">y = (n-1) // 3</code> 계산<br>\n<code class=\"language-text\">n</code>이 <strong>0</strong>인 경우에는 계산하기 쉽게 키패드 위치처럼 <strong>11</strong>로 저장하고 계산</li>\n</ul>\n<div class=\"gatsby-highlight\" data-language=\"python\"><pre class=\"language-python\"><code class=\"language-python\"><span class=\"token comment\"># 키패드 위치에 따라 나눠서 처리</span>\n        <span class=\"token keyword\">if</span> n <span class=\"token operator\">==</span> <span class=\"token number\">1</span> <span class=\"token keyword\">or</span> n <span class=\"token operator\">==</span> <span class=\"token number\">4</span> <span class=\"token keyword\">or</span> n <span class=\"token operator\">==</span> <span class=\"token number\">7</span><span class=\"token punctuation\">:</span>\n            answer <span class=\"token operator\">+=</span> <span class=\"token string\">'L'</span>\n            left <span class=\"token operator\">=</span> <span class=\"token punctuation\">[</span>x<span class=\"token punctuation\">,</span> y<span class=\"token punctuation\">]</span>\n        <span class=\"token keyword\">elif</span> n <span class=\"token operator\">==</span> <span class=\"token number\">3</span> <span class=\"token keyword\">or</span> n <span class=\"token operator\">==</span> <span class=\"token number\">6</span> <span class=\"token keyword\">or</span> n <span class=\"token operator\">==</span> <span class=\"token number\">9</span><span class=\"token punctuation\">:</span>\n            answer <span class=\"token operator\">+=</span> <span class=\"token string\">'R'</span>\n            right <span class=\"token operator\">=</span> <span class=\"token punctuation\">[</span>x<span class=\"token punctuation\">,</span> y<span class=\"token punctuation\">]</span>\n        <span class=\"token keyword\">else</span><span class=\"token punctuation\">:</span>\n            <span class=\"token comment\"># 왼손, 오른손 거리 계산</span>\n            left_dir <span class=\"token operator\">=</span> <span class=\"token builtin\">abs</span><span class=\"token punctuation\">(</span>left<span class=\"token punctuation\">[</span><span class=\"token number\">0</span><span class=\"token punctuation\">]</span><span class=\"token operator\">-</span>x<span class=\"token punctuation\">)</span> <span class=\"token operator\">+</span> <span class=\"token builtin\">abs</span><span class=\"token punctuation\">(</span>left<span class=\"token punctuation\">[</span><span class=\"token number\">1</span><span class=\"token punctuation\">]</span><span class=\"token operator\">-</span>y<span class=\"token punctuation\">)</span>\n            right_dir <span class=\"token operator\">=</span> <span class=\"token builtin\">abs</span><span class=\"token punctuation\">(</span>right<span class=\"token punctuation\">[</span><span class=\"token number\">0</span><span class=\"token punctuation\">]</span><span class=\"token operator\">-</span>x<span class=\"token punctuation\">)</span> <span class=\"token operator\">+</span> <span class=\"token builtin\">abs</span><span class=\"token punctuation\">(</span>right<span class=\"token punctuation\">[</span><span class=\"token number\">1</span><span class=\"token punctuation\">]</span><span class=\"token operator\">-</span>y<span class=\"token punctuation\">)</span>\n            <span class=\"token keyword\">if</span> left_dir <span class=\"token operator\">&lt;</span> right_dir<span class=\"token punctuation\">:</span>\n                answer <span class=\"token operator\">+=</span> <span class=\"token string\">'L'</span>\n                left <span class=\"token operator\">=</span> <span class=\"token punctuation\">[</span>x<span class=\"token punctuation\">,</span>y<span class=\"token punctuation\">]</span>\n            <span class=\"token keyword\">elif</span> left_dir <span class=\"token operator\">></span> right_dir<span class=\"token punctuation\">:</span>\n                answer <span class=\"token operator\">+=</span> <span class=\"token string\">'R'</span>\n                right <span class=\"token operator\">=</span> <span class=\"token punctuation\">[</span>x<span class=\"token punctuation\">,</span> y<span class=\"token punctuation\">]</span>\n            <span class=\"token comment\"># 거리가 같으면 hand 값에 따라서 처리</span>\n            <span class=\"token keyword\">else</span><span class=\"token punctuation\">:</span>\n                <span class=\"token keyword\">if</span> hand <span class=\"token operator\">==</span> <span class=\"token string\">\"left\"</span><span class=\"token punctuation\">:</span> \n                    answer <span class=\"token operator\">+=</span> <span class=\"token string\">'L'</span>\n                    left <span class=\"token operator\">=</span> <span class=\"token punctuation\">[</span>x<span class=\"token punctuation\">,</span> y<span class=\"token punctuation\">]</span>\n                <span class=\"token keyword\">else</span><span class=\"token punctuation\">:</span> \n                    answer <span class=\"token operator\">+=</span> <span class=\"token string\">'R'</span>\n                    right <span class=\"token operator\">=</span> <span class=\"token punctuation\">[</span>x<span class=\"token punctuation\">,</span> y<span class=\"token punctuation\">]</span></code></pre></div>\n<ul>\n<li><strong>키패드 위치에 따라 나눠서 처리</strong><br>\n<code class=\"language-text\">n</code>이 <strong>2, 5, 8, 0</strong>인 경우에는 <code class=\"language-text\">left</code>, <code class=\"language-text\">right</code> 값과의 거리를 계산해서<br>\n왼손이 가까우면 왼손으로, 오른손이 가까우면 오른손으로 처리<br>\n거리가 같으면 <code class=\"language-text\">hand</code> 값에 따라 나눠서 처리</li>\n</ul>\n<hr>\n<h2 id=\"-code\" style=\"position:relative;\"><a href=\"#-code\" aria-label=\" code permalink\" class=\"anchor before\"><svg aria-hidden=\"true\" focusable=\"false\" height=\"16\" version=\"1.1\" viewBox=\"0 0 16 16\" width=\"16\"><path fill-rule=\"evenodd\" d=\"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z\"></path></svg></a>🧩 Code</h2>\n<details><summary>전체 코드 확인</summary>\n<div class=\"gatsby-highlight\" data-language=\"python\"><pre class=\"language-python\"><code class=\"language-python\"><span class=\"token keyword\">def</span> <span class=\"token function\">solution</span><span class=\"token punctuation\">(</span>numbers<span class=\"token punctuation\">,</span> hand<span class=\"token punctuation\">)</span><span class=\"token punctuation\">:</span>\n    answer <span class=\"token operator\">=</span> <span class=\"token string\">''</span>\n    left<span class=\"token punctuation\">,</span> right <span class=\"token operator\">=</span> <span class=\"token punctuation\">[</span><span class=\"token number\">0</span><span class=\"token punctuation\">,</span> <span class=\"token number\">3</span><span class=\"token punctuation\">]</span><span class=\"token punctuation\">,</span> <span class=\"token punctuation\">[</span><span class=\"token number\">2</span><span class=\"token punctuation\">,</span> <span class=\"token number\">3</span><span class=\"token punctuation\">]</span>    <span class=\"token comment\"># '*', '#' 좌표[x, y] 저장</span>\n    <span class=\"token keyword\">for</span> n <span class=\"token keyword\">in</span> numbers<span class=\"token punctuation\">:</span>\n        <span class=\"token keyword\">if</span> n <span class=\"token operator\">==</span> <span class=\"token number\">0</span><span class=\"token punctuation\">:</span> n <span class=\"token operator\">=</span> <span class=\"token number\">11</span>   <span class=\"token comment\"># 0은 계산 편하게 11로 저장</span>\n        x<span class=\"token punctuation\">,</span> y <span class=\"token operator\">=</span> <span class=\"token punctuation\">(</span>n<span class=\"token operator\">-</span><span class=\"token number\">1</span><span class=\"token punctuation\">)</span><span class=\"token operator\">%</span><span class=\"token number\">3</span><span class=\"token punctuation\">,</span> <span class=\"token punctuation\">(</span>n<span class=\"token operator\">-</span><span class=\"token number\">1</span><span class=\"token punctuation\">)</span><span class=\"token operator\">//</span><span class=\"token number\">3</span>    <span class=\"token comment\"># 해당 숫자의 키패드 상 좌표 계산</span>\n        <span class=\"token comment\"># 키패드 위치에 따라 나눠서 처리</span>\n        <span class=\"token keyword\">if</span> n <span class=\"token operator\">==</span> <span class=\"token number\">1</span> <span class=\"token keyword\">or</span> n <span class=\"token operator\">==</span> <span class=\"token number\">4</span> <span class=\"token keyword\">or</span> n <span class=\"token operator\">==</span> <span class=\"token number\">7</span><span class=\"token punctuation\">:</span>\n            answer <span class=\"token operator\">+=</span> <span class=\"token string\">'L'</span>\n            left <span class=\"token operator\">=</span> <span class=\"token punctuation\">[</span>x<span class=\"token punctuation\">,</span> y<span class=\"token punctuation\">]</span>\n        <span class=\"token keyword\">elif</span> n <span class=\"token operator\">==</span> <span class=\"token number\">3</span> <span class=\"token keyword\">or</span> n <span class=\"token operator\">==</span> <span class=\"token number\">6</span> <span class=\"token keyword\">or</span> n <span class=\"token operator\">==</span> <span class=\"token number\">9</span><span class=\"token punctuation\">:</span>\n            answer <span class=\"token operator\">+=</span> <span class=\"token string\">'R'</span>\n            right <span class=\"token operator\">=</span> <span class=\"token punctuation\">[</span>x<span class=\"token punctuation\">,</span> y<span class=\"token punctuation\">]</span>\n        <span class=\"token keyword\">else</span><span class=\"token punctuation\">:</span>\n            <span class=\"token comment\"># 왼손, 오른손 거리 계산</span>\n            left_dir <span class=\"token operator\">=</span> <span class=\"token builtin\">abs</span><span class=\"token punctuation\">(</span>left<span class=\"token punctuation\">[</span><span class=\"token number\">0</span><span class=\"token punctuation\">]</span><span class=\"token operator\">-</span>x<span class=\"token punctuation\">)</span> <span class=\"token operator\">+</span> <span class=\"token builtin\">abs</span><span class=\"token punctuation\">(</span>left<span class=\"token punctuation\">[</span><span class=\"token number\">1</span><span class=\"token punctuation\">]</span><span class=\"token operator\">-</span>y<span class=\"token punctuation\">)</span>\n            right_dir <span class=\"token operator\">=</span> <span class=\"token builtin\">abs</span><span class=\"token punctuation\">(</span>right<span class=\"token punctuation\">[</span><span class=\"token number\">0</span><span class=\"token punctuation\">]</span><span class=\"token operator\">-</span>x<span class=\"token punctuation\">)</span> <span class=\"token operator\">+</span> <span class=\"token builtin\">abs</span><span class=\"token punctuation\">(</span>right<span class=\"token punctuation\">[</span><span class=\"token number\">1</span><span class=\"token punctuation\">]</span><span class=\"token operator\">-</span>y<span class=\"token punctuation\">)</span>\n            <span class=\"token keyword\">if</span> left_dir <span class=\"token operator\">&lt;</span> right_dir<span class=\"token punctuation\">:</span>\n                answer <span class=\"token operator\">+=</span> <span class=\"token string\">'L'</span>\n                left <span class=\"token operator\">=</span> <span class=\"token punctuation\">[</span>x<span class=\"token punctuation\">,</span>y<span class=\"token punctuation\">]</span>\n            <span class=\"token keyword\">elif</span> left_dir <span class=\"token operator\">></span> right_dir<span class=\"token punctuation\">:</span>\n                answer <span class=\"token operator\">+=</span> <span class=\"token string\">'R'</span>\n                right <span class=\"token operator\">=</span> <span class=\"token punctuation\">[</span>x<span class=\"token punctuation\">,</span> y<span class=\"token punctuation\">]</span>\n            <span class=\"token comment\"># 거리가 같으면 hand 값에 따라서 처리</span>\n            <span class=\"token keyword\">else</span><span class=\"token punctuation\">:</span>\n                <span class=\"token keyword\">if</span> hand <span class=\"token operator\">==</span> <span class=\"token string\">\"left\"</span><span class=\"token punctuation\">:</span> \n                    answer <span class=\"token operator\">+=</span> <span class=\"token string\">'L'</span>\n                    left <span class=\"token operator\">=</span> <span class=\"token punctuation\">[</span>x<span class=\"token punctuation\">,</span> y<span class=\"token punctuation\">]</span>\n                <span class=\"token keyword\">else</span><span class=\"token punctuation\">:</span> \n                    answer <span class=\"token operator\">+=</span> <span class=\"token string\">'R'</span>\n                    right <span class=\"token operator\">=</span> <span class=\"token punctuation\">[</span>x<span class=\"token punctuation\">,</span> y<span class=\"token punctuation\">]</span>\n    <span class=\"token keyword\">return</span> answer</code></pre></div>\n</details>\n<hr>\n<h2 id=\"-review\" style=\"position:relative;\"><a href=\"#-review\" aria-label=\" review permalink\" class=\"anchor before\"><svg aria-hidden=\"true\" focusable=\"false\" height=\"16\" version=\"1.1\" viewBox=\"0 0 16 16\" width=\"16\"><path fill-rule=\"evenodd\" d=\"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z\"></path></svg></a>📝 Review</h2>\n<p>좌표를 통해 거리를 계산하는 것이 편하겠다고 생각해서 왼손과 오른손의 현재 위치를 좌표로 저장하고, 번호를 키패드 위치에 맞게 좌표로 계산해서 저장하는 방식으로 구현했다.<br>\n간단하게 구현하면 되는 문제였는데 조건문이 많아져서 코드는 안이쁜 것 같음,,</p>\n<div class=\"table-of-contents\">\n<ul>\n<li><a href=\"#2020-%EC%B9%B4%EC%B9%B4%EC%98%A4-%EC%9D%B8%ED%84%B4%EC%8B%AD\">[2020 카카오 인턴십]</a></li>\n<li><a href=\"#%EB%AC%B8%EC%A0%9C\">문제</a></li>\n<li><a href=\"#%EC%A0%9C%ED%95%9C%EC%82%AC%ED%95%AD\">제한사항</a></li>\n<li><a href=\"#%EC%9E%85%EC%B6%9C%EB%A0%A5-%EC%98%88\">입출력 예</a></li>\n<li><a href=\"#-algorithm\">🔍 Algorithm</a></li>\n<li><a href=\"#-logic\">💻 Logic</a></li>\n<li><a href=\"#-code\">🧩 Code</a></li>\n<li><a href=\"#-review\">📝 Review</a></li>\n</ul>\n</div>","frontmatter":{"date":"April 28, 2022","title":"[Programmers] 67256번: 키패드 누르기 (Python)","categories":"Algorithm","author":"JFe","emoji":"💻"},"fields":{"slug":"/pg-67256/"}},"site":{"siteMetadata":{"siteUrl":"https://jfelog.netlify.app","comments":{"utterances":{"repo":"Go-Jaecheol/Jfe_Blog"}}}}},"pageContext":{"slug":"/jpa-specification/","nextSlug":"/pg-64065/","prevSlug":"/pg-67256/"}},
    "staticQueryHashes": ["1073350324","1956554647","2938748437"]}