<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0">
  <channel>
    <title>빙글빙글 돌아가는 Debug 하루</title>
    <link>https://debug.tistory.com/</link>
    <description>백엔드 개발자</description>
    <language>ko</language>
    <pubDate>Thu, 16 Jul 2026 16:23:04 +0900</pubDate>
    <generator>TISTORY</generator>
    <ttl>100</ttl>
    <managingEditor>aeongg</managingEditor>
    <image>
      <title>빙글빙글 돌아가는 Debug 하루</title>
      <url>https://tistory1.daumcdn.net/tistory/5385528/attach/3d6fec99dfaa44e79d30dbb8eb187fb6</url>
      <link>https://debug.tistory.com</link>
    </image>
    <item>
      <title>[PlantiFy] MSA 환경에서 JWKS 기반 분산 인증 구현 - RS256 전환 + common-auth-lib</title>
      <link>https://debug.tistory.com/564</link>
      <description>&lt;h2 style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size26&quot;&gt;전체 구조 요약&lt;/h2&gt;
&lt;pre id=&quot;code_1780838797657&quot; class=&quot;awk&quot; style=&quot;background-color: #f8f8f8; color: #383a42; text-align: start;&quot; data-ke-type=&quot;codeblock&quot; data-ke-language=&quot;java&quot;&gt;&lt;code&gt;auth-service
  &amp;rarr; RSA 개인키로 JWT 서명 (RS256)
  &amp;rarr; /.well-known/jwks.json 으로 공개키 노출

각 서비스
  &amp;rarr; JWKS 엔드포인트에서 공개키 캐싱
  &amp;rarr; Auth 호출 없이 로컬에서 JWT 검증&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;blockquote data-ke-style=&quot;style2&quot;&gt;&lt;b&gt;설계 배경과 기존 `/validate-token`&amp;nbsp;구조의 문제점&lt;br /&gt;&lt;/b&gt;&lt;a href=&quot;https://debug.tistory.com/430&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;[PlantiFy] MSA 환경에서 Kakao Social Login 구현하기 - 서비스 개요 / Auth 병목 문제와 JWKS 기반 분산 인증 구조 개선&lt;/a&gt;&lt;/blockquote&gt;
&lt;figure id=&quot;og_1780763603630&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;[PlantiFy] MSA 환경에서 Kakao Social Login 구현하기 - 서비스 개요 / Auth 병목 문제와 JWKS 기반 분산 인증&quot; data-og-description=&quot;서비스 개요 및 상황Gateway 병목 피하려고 Auth 서버 분리Gateway 중앙화: 인증, 라우팅, 로깅, rate limit 등 공통 책임이 과도하게 집중되면 병목 지점이 될 수 있음특히 Gateway 단에서만 인증하고 내부 &quot; data-og-host=&quot;debug.tistory.com&quot; data-og-source-url=&quot;https://debug.tistory.com/430&quot; data-og-url=&quot;https://debug.tistory.com/430&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/bGzANJ/dJMb88GcJ9X/p2k1KtSKy3BKOD2iBkavnK/img.png?width=800&amp;amp;height=285&amp;amp;face=0_0_800_285,https://scrap.kakaocdn.net/dn/EsRzt/dJMb86O9uY0/Ph9TM6goxiXBP2uGb6ccm1/img.png?width=800&amp;amp;height=285&amp;amp;face=0_0_800_285,https://scrap.kakaocdn.net/dn/zKVkp/dJMb83SqJjM/XpSyRWGckhbGABelcdzkD0/img.png?width=6845&amp;amp;height=5865&amp;amp;face=0_0_6845_5865&quot;&gt;&lt;a href=&quot;https://debug.tistory.com/430&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://debug.tistory.com/430&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/bGzANJ/dJMb88GcJ9X/p2k1KtSKy3BKOD2iBkavnK/img.png?width=800&amp;amp;height=285&amp;amp;face=0_0_800_285,https://scrap.kakaocdn.net/dn/EsRzt/dJMb86O9uY0/Ph9TM6goxiXBP2uGb6ccm1/img.png?width=800&amp;amp;height=285&amp;amp;face=0_0_800_285,https://scrap.kakaocdn.net/dn/zKVkp/dJMb83SqJjM/XpSyRWGckhbGABelcdzkD0/img.png?width=6845&amp;amp;height=5865&amp;amp;face=0_0_6845_5865');&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;[PlantiFy] MSA 환경에서 Kakao Social Login 구현하기 - 서비스 개요 / Auth 병목 문제와 JWKS 기반 분산 인증&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;서비스 개요 및 상황Gateway 병목 피하려고 Auth 서버 분리Gateway 중앙화: 인증, 라우팅, 로깅, rate limit 등 공통 책임이 과도하게 집중되면 병목 지점이 될 수 있음특히 Gateway 단에서만 인증하고 내부&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;debug.tistory.com&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style6&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;1. auth-service: RS256 전환&lt;/h2&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;RSA 키 로딩 (`RsaKeyProvider`)&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;PEM 파일이 있으면 로드하고, 없으면 로컬 실험용 키 쌍 자동 생성&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;키가 새로 생성될 때마다 `kid`도 `UUID`로 새로 발급해서 리소스 서비스가 stale 캐시 키를 사용하는 문제 방지&lt;/p&gt;
&lt;pre id=&quot;code_1780763765652&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;@Component
public class RsaKeyProvider {

    public RsaKeyProvider(@Value(&quot;${jwt.private-key}&quot;) Resource privateKeyResource,
                          @Value(&quot;${jwt.public-key}&quot;) Resource publicKeyResource,
                          @Value(&quot;${jwt.key-id}&quot;) String keyId) {
        KeyPair fallbackKeyPair = null;
        if (!privateKeyResource.exists() || !publicKeyResource.exists()) {
            fallbackKeyPair = generateLocalExperimentKeyPair();
        }
        this.privateKey = fallbackKeyPair == null
                ? loadPrivateKey(privateKeyResource)
                : (RSAPrivateKey) fallbackKeyPair.getPrivate();
        this.publicKey = fallbackKeyPair == null
                ? loadPublicKey(publicKeyResource)
                : (RSAPublicKey) fallbackKeyPair.getPublic();
        this.keyId = fallbackKeyPair == null
                ? keyId
                : &quot;local-generated-&quot; + UUID.randomUUID();
    }
}&lt;/code&gt;&lt;/pre&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-style=&quot;style3&quot; data-ke-type=&quot;horizontalRule&quot; /&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;JWT 발급 (`JwtAuthProvider`)&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;HS256에서 RS256으로 전환하면서 변경된 2가지&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;`signWith(secretKey)`&amp;nbsp;&amp;rarr; `signWith(rsaKeyProvider.getPrivateKey(), SignatureAlgorithm.RS256)`&lt;/li&gt;
&lt;li&gt;`role`이 하드코딩&amp;nbsp;&quot;USER&quot;였던 것 &amp;rarr; 실제 사용자 `role`을 클레임에 포함
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;`role`&lt;span style=&quot;text-align: start;&quot;&gt;이 클레임에 없으면 리소스 서비스는&amp;nbsp;&lt;/span&gt;ROLE_*&lt;span style=&quot;text-align: start;&quot;&gt;&amp;nbsp;권한을 매핑할 수 없음 &lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;text-align: start;&quot;&gt;HS256: `&lt;/span&gt;/validate-token`&lt;span style=&quot;text-align: start;&quot;&gt;은 DB에서 `role`을 조회했지만, &lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;text-align: start;&quot;&gt;JWKS 로컬 검증으로 전환하면 Auth 호출이 없으므로 반드시 토큰 발급 시점에 role이 포함되어야 함&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;pre id=&quot;code_1780763858114&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;public String createAccessToken(long userId, Role role) {
    return createToken(userId, role, &quot;Access&quot;, accessTokenExpiration);
}

private String createToken(Long userId, Role role, String type, long tokenValidTime) {
    Claims claims = Jwts.claims().setSubject(type);
    claims.put(&quot;userId&quot;, userId);
    if (role != null) {
        claims.put(&quot;role&quot;, role.name());  // 실제 role 클레임 포함
    }

    return Jwts.builder()
            .setClaims(claims)
            .setIssuedAt(new Date(System.currentTimeMillis()))
            .setExpiration(new Date(System.currentTimeMillis() + tokenValidTime))
            .setHeaderParam(&quot;kid&quot;, rsaKeyProvider.getKeyId())  // kid 포함
            .signWith(rsaKeyProvider.getPrivateKey(), SignatureAlgorithm.RS256)
            .compact();
}&lt;/code&gt;&lt;/pre&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style3&quot; /&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;JWKS 엔드포인트 (`JwksController`)&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;리소스 서비스들이 공개키를 가져갈 수 있도록 표준 JWKS 형식으로 노출&lt;/p&gt;
&lt;pre id=&quot;code_1780763963011&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;@RestController
@RequiredArgsConstructor
public class JwksController {

    private final RsaKeyProvider rsaKeyProvider;

    @GetMapping(&quot;/.well-known/jwks.json&quot;)
    public Map&amp;lt;String, Object&amp;gt; jwks() {
        RSAKey rsaKey = new RSAKey.Builder(rsaKeyProvider.getPublicKey())
                .keyID(rsaKeyProvider.getKeyId())
                .algorithm(JWSAlgorithm.RS256)
                .keyUse(KeyUse.SIGNATURE)
                .build();
        return new JWKSet(rsaKey).toJSONObject();
    }
}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;응답 예시&lt;/h4&gt;
&lt;pre id=&quot;code_1780763996344&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;{
  &quot;keys&quot;: [
    {
      &quot;kty&quot;: &quot;RSA&quot;,
      &quot;kid&quot;: &quot;plantify-local-rsa-key-1&quot;,
      &quot;use&quot;: &quot;sig&quot;,
      &quot;alg&quot;: &quot;RS256&quot;,
      &quot;n&quot;: &quot;...&quot;,
      &quot;e&quot;: &quot;AQAB&quot;
    }
  ]
}&lt;/code&gt;&lt;/pre&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style6&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;2. common-auth-lib: 공통 인증 모듈&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;`JwtFilter`를 서비스마다 복붙하는 대신 Spring Boot AutoConfiguration으로 의존성 추가만으로 동작하도록 구성&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;자동 설정 (`PlantifyResourceServerAutoConfiguration`)&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;`NimbusJwtDecoder`: 내부적으로 JWKS 캐싱/ `kid`가 캐시에 없으면 자동으로 JWKS 엔드포인트 재조회&lt;/p&gt;
&lt;pre id=&quot;code_1780764092426&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;@AutoConfiguration
@EnableConfigurationProperties(PlantifyAuthProperties.class)
public class PlantifyResourceServerAutoConfiguration {

    @Bean
    @ConditionalOnProperty(prefix = &quot;auth&quot;, name = &quot;jwk-set-uri&quot;)
    JwtDecoder jwtDecoder(PlantifyAuthProperties properties) {
        return NimbusJwtDecoder.withJwkSetUri(properties.getJwkSetUri()).build();
    }

    @Bean
    JwtAuthenticationConverter jwtAuthenticationConverter() {
        Converter&amp;lt;Jwt, Collection&amp;lt;GrantedAuthority&amp;gt;&amp;gt; authoritiesConverter = jwt -&amp;gt; {
            String role = jwt.getClaimAsString(&quot;role&quot;);
            if (role == null || role.isBlank()) return List.of();
            return List.of(new SimpleGrantedAuthority(&quot;ROLE_&quot; + role));
        };

        JwtAuthenticationConverter converter = new JwtAuthenticationConverter();
        converter.setJwtGrantedAuthoritiesConverter(authoritiesConverter);
        converter.setPrincipalClaimName(&quot;userId&quot;);  // principal = userId
        return converter;
    }

    @Bean
    SecurityFilterChain securityFilterChain(HttpSecurity http,
                                            PlantifyAuthProperties properties,
                                            JwtAuthenticationConverter jwtAuthenticationConverter) throws Exception {
        String[] permitAll = properties.getPermitAll().toArray(String[]::new);

        return http
                .csrf(AbstractHttpConfigurer::disable)
                .sessionManagement(s -&amp;gt; s.sessionCreationPolicy(SessionCreationPolicy.STATELESS))
                .authorizeHttpRequests(r -&amp;gt; r
                        .requestMatchers(permitAll).permitAll()
                        .anyRequest().authenticated()
                )
                .oauth2ResourceServer(o -&amp;gt; o.jwt(j -&amp;gt; j.jwtAuthenticationConverter(jwtAuthenticationConverter)))
                .build();
    }
}&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;AutoConfiguration으로 등록하려면 파일 필요&lt;/p&gt;
&lt;pre id=&quot;code_1780839051600&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;// resources/META-INF/spring/org.springframework.boot.autoconfigure.AutoConfiguration.imports
com.plantify.authlib.PlantifyResourceServerAutoConfiguration&lt;/code&gt;&lt;/pre&gt;
&lt;p style=&quot;position: absolute;&quot; 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;설정 프로퍼티 (`PlantifyAuthProperties`)&lt;/p&gt;
&lt;pre id=&quot;code_1780839134684&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;@ConfigurationProperties(prefix = &quot;auth&quot;)
public class PlantifyAuthProperties {
    private String jwkSetUri;
    private List&amp;lt;String&amp;gt; permitAll = new ArrayList&amp;lt;&amp;gt;(List.of(&quot;/actuator/**&quot;, &quot;/health&quot;));
}&lt;/code&gt;&lt;/pre&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style6&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;3. 리소스 서비스 적용&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;의존성 추가 + `yml` 설정&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;build.gradle&lt;/p&gt;
&lt;pre id=&quot;code_1780764134610&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;dependencies {
    implementation 'com.plantify:common-auth-lib'
}&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;settings.gradle&lt;/p&gt;
&lt;pre id=&quot;code_1780764152091&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;includeBuild '../common-auth-lib'&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;application.yml&lt;/p&gt;
&lt;pre id=&quot;code_1780764163374&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;auth:
  jwk-set-uri: ${AUTH_JWK_SET_URI:http://localhost:8081/.well-known/jwks.json}
  permit-all:
    - /actuator/**
    - /health&lt;/code&gt;&lt;/pre&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style6&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;시퀀스 다이어그램&lt;/h2&gt;
&lt;h3 style=&quot;background-color: #ffffff; color: #1f2328; text-align: start;&quot; data-ke-size=&quot;size23&quot;&gt;JWKS 발견 흐름 (최초 1회)&lt;/h3&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2026-06-07 오전 1.44.33.png&quot; data-origin-width=&quot;1100&quot; data-origin-height=&quot;642&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bBAsxp/dJMcagTj8Ab/9zz8cGmOUMb2N7zMX2aBJ0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bBAsxp/dJMcagTj8Ab/9zz8cGmOUMb2N7zMX2aBJ0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bBAsxp/dJMcagTj8Ab/9zz8cGmOUMb2N7zMX2aBJ0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbBAsxp%2FdJMcagTj8Ab%2F9zz8cGmOUMb2N7zMX2aBJ0%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;463&quot; height=&quot;270&quot; data-filename=&quot;스크린샷 2026-06-07 오전 1.44.33.png&quot; data-origin-width=&quot;1100&quot; data-origin-height=&quot;642&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style3&quot; /&gt;
&lt;h3 style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size23&quot;&gt;보호된 API 흐름 (이후 매 요청)&lt;/h3&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2026-06-07 오전 1.45.35.png&quot; data-origin-width=&quot;1634&quot; data-origin-height=&quot;954&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/dcW2jd/dJMcajvJa9v/2iT960NoU643PTikyIb3Hk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/dcW2jd/dJMcajvJa9v/2iT960NoU643PTikyIb3Hk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/dcW2jd/dJMcajvJa9v/2iT960NoU643PTikyIb3Hk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FdcW2jd%2FdJMcajvJa9v%2F2iT960NoU643PTikyIb3Hk%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;685&quot; height=&quot;400&quot; data-filename=&quot;스크린샷 2026-06-07 오전 1.45.35.png&quot; data-origin-width=&quot;1634&quot; data-origin-height=&quot;954&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style6&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;테스트&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;환경&lt;span style=&quot;text-align: start;&quot;&gt;: MacBook, Docker Compose, k6 v0.53.0, 20 VU, 1분&lt;/span&gt;&lt;span style=&quot;text-align: start;&quot;&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;span style=&quot;text-align: start;&quot;&gt;1) 베이스라인 부하 테스트&lt;/span&gt;&lt;/h3&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;span style=&quot;text-align: start;&quot;&gt;Main&lt;/span&gt;&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;1. `main` 브랜치 이동&lt;/p&gt;
&lt;pre id=&quot;code_1780825230424&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;git checkout main&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;2. Auth + demo 서버 실행&lt;/p&gt;
&lt;pre id=&quot;code_1780825244178&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;docker compose up --build auth-service demo-resource-service&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;3. 다른 터미널에서 k6 실행&lt;/p&gt;
&lt;pre id=&quot;code_1780825258678&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;docker compose run --rm k6 run /scripts/baseline-auth-call.js&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;span style=&quot;font-family: -apple-system, BlinkMacSystemFont, 'Helvetica Neue', 'Apple SD Gothic Neo', Arial, sans-serif; letter-spacing: 0px;&quot;&gt;테스트 목적&lt;/span&gt;&lt;/h4&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;span style=&quot;font-family: -apple-system, BlinkMacSystemFont, 'Helvetica Neue', 'Apple SD Gothic Neo', Arial, sans-serif; letter-spacing: 0px;&quot;&gt;k6가 Auth 서버의 실험용 토큰 발급 API를 호출&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;받은 JWT를 들고 demo 서버의 `/api/demo/me` 호출&lt;/li&gt;
&lt;li&gt;demo 서버는 매 요청마다 Auth 서버의 `/v1/auth/validate-token`을 호출&lt;/li&gt;
&lt;li&gt;Auth가 토큰을 검증하고&amp;nbsp;userId,&amp;nbsp;role을 반환&lt;/li&gt;
&lt;li&gt;demo 서버가 응답&lt;/li&gt;
&lt;li&gt;k6가 latency, 실패율, p95 같은 지표 확인&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;결과&lt;/h4&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;k6 -&amp;gt; Auth `/v1/auth/validate-token` 직접 호출
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;`auth_call_duration` 측정용&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;k6 -&amp;gt; demo `/api/demo/me` 호출
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;demo 내부에서 다시 Auth `/v1/auth/validate-token` 호출&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;=&amp;gt; `iterations`보다 `http_reqs`가 약 2배&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2026-06-07 오후 6.48.02.png&quot; data-origin-width=&quot;1892&quot; data-origin-height=&quot;874&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cqboSW/dJMcaaMjLb2/9u1zEizYKfKjkj8J2fuE6k/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cqboSW/dJMcaaMjLb2/9u1zEizYKfKjkj8J2fuE6k/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cqboSW/dJMcaaMjLb2/9u1zEizYKfKjkj8J2fuE6k/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcqboSW%2FdJMcaaMjLb2%2F9u1zEizYKfKjkj8J2fuE6k%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;755&quot; height=&quot;349&quot; data-filename=&quot;스크린샷 2026-06-07 오후 6.48.02.png&quot; data-origin-width=&quot;1892&quot; data-origin-height=&quot;874&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;`checks: 100.00%`&lt;/li&gt;
&lt;li&gt;`http_req_failed: 0.00%`
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;HTTP 요청 실패 X&lt;/li&gt;
&lt;li&gt;basline 정상 상태에서는 안정적으로 동작함&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;`iterations: 1160`&lt;/span&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;`/api/demo/me` 테스트 루프가 1160번 수행됨&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;보호 API를 약 1160번 호출&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;`http_reqs: 2321`
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;총 HTTP 요청 수&lt;/li&gt;
&lt;li&gt;계산: 1160 iterations * 2 requests + setup dev-token 1 = 2321&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;`http_req_duration p95: 52.3ms`
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;전체 HTTP 요청 중 95%가 52.3ms 안에 끝남&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;`auth_call_duration p95: 40.02ms`
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;Auth `/validate-token` 직접 호출만 따로 측정한 p95&lt;/li&gt;
&lt;li&gt;basline에서 인증 검증 네트워크 호출이 어느 정도 비중을 가지는지 보여줌&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size20&quot;&gt;Refactor&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;1. `refactor/jwks-local-validation` 브랜치 이동&lt;/p&gt;
&lt;pre id=&quot;code_1780826370498&quot; class=&quot;bash&quot; style=&quot;background-color: #f8f8f8; color: #383a42; text-align: start;&quot; data-ke-type=&quot;codeblock&quot; data-ke-language=&quot;bash&quot;&gt;&lt;code&gt;git checkout refactor/jwks-local-validation&lt;/code&gt;&lt;/pre&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;2. Auth + demo 서버 실행&lt;/p&gt;
&lt;pre id=&quot;code_1780826370499&quot; class=&quot;bash&quot; style=&quot;background-color: #f8f8f8; color: #383a42; text-align: start;&quot; data-ke-type=&quot;codeblock&quot; data-ke-language=&quot;bash&quot;&gt;&lt;code&gt;docker compose up --build auth-service demo-resource-service&lt;/code&gt;&lt;/pre&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;3. 다른 터미널에서 k6 실행&lt;/p&gt;
&lt;pre id=&quot;code_1780826425620&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;docker compose run --rm k6 run /scripts/baseline-auth-call.js&lt;/code&gt;&lt;/pre&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size20&quot;&gt;&lt;span&gt;테스트 목적&lt;/span&gt;&lt;/h4&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;Auth가 RS256 JWT 발급&lt;/li&gt;
&lt;li&gt;Auth가 JWKS endpoint 제공&lt;/li&gt;
&lt;li&gt;demo-resource-service가 Auth&lt;span&gt; `&lt;/span&gt;&lt;span style=&quot;background-color: oklab(0.999994 0.0000455678 0.0000200868 / 0.0470588);&quot;&gt;/validate-token`&lt;/span&gt;을 매번 호출하지 않음&lt;/li&gt;
&lt;li&gt;demo-resource-service가 JWKS 공개키로 JWT를 로컬 검증&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;background-color: oklab(0.999994 0.0000455678 0.0000200868 / 0.0470588);&quot;&gt;`/api/demo/me`&lt;/span&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;요청 latency, 실패율, p95 확인&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;결과&lt;/h4&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2026-06-07 오후 7.05.26.png&quot; data-origin-width=&quot;1904&quot; data-origin-height=&quot;800&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/YSaGy/dJMcada8N9U/QkjU2hvARlir5AnMZG3zIK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/YSaGy/dJMcada8N9U/QkjU2hvARlir5AnMZG3zIK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/YSaGy/dJMcada8N9U/QkjU2hvARlir5AnMZG3zIK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FYSaGy%2FdJMcada8N9U%2FQkjU2hvARlir5AnMZG3zIK%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;755&quot; height=&quot;317&quot; data-filename=&quot;스크린샷 2026-06-07 오후 7.05.26.png&quot; data-origin-width=&quot;1904&quot; data-origin-height=&quot;800&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;`checks: 100.00%`&lt;/li&gt;
&lt;li&gt;`http_req_failed: 0.00%`&lt;/li&gt;
&lt;li&gt;`iterations: 1200`&lt;/li&gt;
&lt;li&gt;`http_reqs: 1201`&lt;br /&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;계산: 1200 iterations * 1 requests + setup dev-token 1 = 1201&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;`http_req_duration p95: 17.77ms`&lt;/li&gt;
&lt;/ul&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-style=&quot;style3&quot; data-ke-type=&quot;horizontalRule&quot; /&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;요약&lt;/h3&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2026-06-07 오후 10.09.26.png&quot; data-origin-width=&quot;1116&quot; data-origin-height=&quot;422&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bnFDzb/dJMcaiczR3L/2db1BG0FBhOVKQwif1WKL1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bnFDzb/dJMcaiczR3L/2db1BG0FBhOVKQwif1WKL1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bnFDzb/dJMcaiczR3L/2db1BG0FBhOVKQwif1WKL1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbnFDzb%2FdJMcaiczR3L%2F2db1BG0FBhOVKQwif1WKL1%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;616&quot; height=&quot;233&quot; data-filename=&quot;스크린샷 2026-06-07 오후 10.09.26.png&quot; data-origin-width=&quot;1116&quot; data-origin-height=&quot;422&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;`main`에서는 한 `iteration`마다 k6가 요청 2번 보냄&lt;/li&gt;
&lt;li&gt;`refactor`에서는 한 `iteration`마다 k6가 요청 1번 보냄
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;`iterations`와 `http_reqs`가 거의 동일&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;=&amp;gt; `refactor`에서는 demo가 매 요청마다 Auth `/validate-token` 호출 X, JWKS로 로컬 검증&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style3&quot; /&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;2) 장애 테스트&lt;/h3&gt;
&lt;pre id=&quot;code_1780825425085&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;docker compose run --rm k6 run /scripts/auth-failure-window.js&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;실행한 상태에서 다른 터미널에서 Auth 멈추기&lt;/p&gt;
&lt;pre id=&quot;code_1780825440181&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;docker stop plantify-auth-service&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size20&quot;&gt;&lt;span&gt;테스트 목적&lt;/span&gt;&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;JWKS가 이미 캐시된 상태라면 Auth가 내려가도 demo-resource-service의 `/api/demo/me`는 계속 200 반환&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;결과&lt;/h4&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2026-06-07 오후 10.21.34.png&quot; data-origin-width=&quot;1880&quot; data-origin-height=&quot;822&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bSjUAQ/dJMcafNHc76/ICY1EvkHzKNjwRPFyQe451/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bSjUAQ/dJMcafNHc76/ICY1EvkHzKNjwRPFyQe451/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bSjUAQ/dJMcafNHc76/ICY1EvkHzKNjwRPFyQe451/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbSjUAQ%2FdJMcafNHc76%2FICY1EvkHzKNjwRPFyQe451%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;755&quot; height=&quot;330&quot; data-filename=&quot;스크린샷 2026-06-07 오후 10.21.34.png&quot; data-origin-width=&quot;1880&quot; data-origin-height=&quot;822&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;`checks: 100.00%`&lt;/li&gt;
&lt;li&gt;`http_req_failed: 0.00%`&lt;/li&gt;
&lt;li&gt;`iterations: 2380`&lt;/li&gt;
&lt;li&gt;`http_reqs: 2381`&lt;br /&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;계산: 2380 iterations + setup dev-token 1 = 1201&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;`http_req_duration p95: 17.54ms`&lt;/li&gt;
&lt;/ul&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style6&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;참고&lt;/h2&gt;
&lt;figure id=&quot;og_1780838722936&quot; contenteditable=&quot;false&quot; data-ke-type=&quot;opengraph&quot; data-ke-align=&quot;alignCenter&quot; data-og-type=&quot;object&quot; data-og-title=&quot;GitHub - seunzu/plantify-msa-auth-refactor: JWKS 기반 분산 인증 설계 및 Auth SPOF 제거&quot; data-og-description=&quot;JWKS 기반 분산 인증 설계 및 Auth SPOF 제거. Contribute to seunzu/plantify-msa-auth-refactor development by creating an account on GitHub.&quot; data-og-host=&quot;github.com&quot; data-og-source-url=&quot;https://github.com/seunzu/plantify-msa-auth-refactor&quot; data-og-url=&quot;https://github.com/seunzu/plantify-msa-auth-refactor&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/f0rJr/dJMb9b3ZNrD/CTX7c6rFItnxSoxzcmRnFK/img.png?width=1200&amp;amp;height=600&amp;amp;face=0_0_1200_600,https://scrap.kakaocdn.net/dn/pUKPZ/dJMb8Qet1TM/bn1zq3Fs2fCUOaFQrnO4fk/img.png?width=1200&amp;amp;height=600&amp;amp;face=0_0_1200_600&quot;&gt;&lt;a href=&quot;https://github.com/seunzu/plantify-msa-auth-refactor&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://github.com/seunzu/plantify-msa-auth-refactor&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/f0rJr/dJMb9b3ZNrD/CTX7c6rFItnxSoxzcmRnFK/img.png?width=1200&amp;amp;height=600&amp;amp;face=0_0_1200_600,https://scrap.kakaocdn.net/dn/pUKPZ/dJMb8Qet1TM/bn1zq3Fs2fCUOaFQrnO4fk/img.png?width=1200&amp;amp;height=600&amp;amp;face=0_0_1200_600');&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;GitHub - seunzu/plantify-msa-auth-refactor: JWKS 기반 분산 인증 설계 및 Auth SPOF 제거&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;JWKS 기반 분산 인증 설계 및 Auth SPOF 제거. Contribute to seunzu/plantify-msa-auth-refactor development by creating an account on GitHub.&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;github.com&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;</description>
      <category> /프로젝트</category>
      <author>aeongg</author>
      <guid isPermaLink="true">https://debug.tistory.com/564</guid>
      <comments>https://debug.tistory.com/564#entry564comment</comments>
      <pubDate>Mon, 1 Jun 2026 16:21:06 +0900</pubDate>
    </item>
    <item>
      <title>[LeetCode 75/Graphs - BFS] 1926 - Nearest Exit from Entrance in Maze / 994 - Rotting Oranges</title>
      <link>https://debug.tistory.com/554</link>
      <description>&lt;h2 data-ke-size=&quot;size26&quot;&gt;1926 - Nearest Exit from Entrance in Maze&lt;/h2&gt;
&lt;p&gt;&lt;figure class=&quot;imagegridblock&quot;&gt;
  &lt;div class=&quot;image-container&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/qq9JT/dJMcadgQ6xj/11Rd1DtClVmGgcsrYtKMnk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/qq9JT/dJMcadgQ6xj/11Rd1DtClVmGgcsrYtKMnk/img.png&quot; data-is-animation=&quot;false&quot; data-origin-width=&quot;1120&quot; data-origin-height=&quot;700&quot; data-filename=&quot;스크린샷 2026-03-05 오후 5.46.08.png&quot; style=&quot;width: 59.2512%; margin-right: 10px;&quot; data-widthpercent=&quot;59.95&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/qq9JT/dJMcadgQ6xj/11Rd1DtClVmGgcsrYtKMnk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fqq9JT%2FdJMcadgQ6xj%2F11Rd1DtClVmGgcsrYtKMnk%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;1120&quot; height=&quot;700&quot;/&gt;&lt;/span&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/Z8Ven/dJMcaflryEj/cIdlU5ovUSOmQEa5ktcRN1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/Z8Ven/dJMcaflryEj/cIdlU5ovUSOmQEa5ktcRN1/img.png&quot; data-is-animation=&quot;false&quot; data-origin-width=&quot;1116&quot; data-origin-height=&quot;1044&quot; data-filename=&quot;스크린샷 2026-03-05 오후 5.46.18.png&quot; style=&quot;width: 39.586%;&quot; data-widthpercent=&quot;40.05&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/Z8Ven/dJMcaflryEj/cIdlU5ovUSOmQEa5ktcRN1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FZ8Ven%2FdJMcaflryEj%2FcIdlU5ovUSOmQEa5ktcRN1%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;1116&quot; height=&quot;1044&quot;/&gt;&lt;/span&gt;&lt;/div&gt;
&lt;/figure&gt;
&lt;figure class=&quot;imagegridblock&quot;&gt;
  &lt;div class=&quot;image-container&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/DqWCW/dJMcahp2bw6/GLvRNU22OeqzcPS2gwNTn0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/DqWCW/dJMcahp2bw6/GLvRNU22OeqzcPS2gwNTn0/img.png&quot; data-is-animation=&quot;false&quot; data-origin-width=&quot;1112&quot; data-origin-height=&quot;966&quot; data-filename=&quot;스크린샷 2026-03-05 오후 5.46.42.png&quot; style=&quot;width: 56.5964%; margin-right: 10px;&quot; data-widthpercent=&quot;57.26&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/DqWCW/dJMcahp2bw6/GLvRNU22OeqzcPS2gwNTn0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FDqWCW%2FdJMcahp2bw6%2FGLvRNU22OeqzcPS2gwNTn0%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;1112&quot; height=&quot;966&quot;/&gt;&lt;/span&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/B7hE6/dJMcaaLcKmY/up0nQi12nlYNEKVdP1XPj0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/B7hE6/dJMcaaLcKmY/up0nQi12nlYNEKVdP1XPj0/img.png&quot; data-is-animation=&quot;false&quot; data-origin-width=&quot;976&quot; data-origin-height=&quot;1136&quot; data-filename=&quot;스크린샷 2026-03-05 오후 5.46.51.png&quot; data-widthpercent=&quot;42.74&quot; style=&quot;width: 42.2408%;&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/B7hE6/dJMcaaLcKmY/up0nQi12nlYNEKVdP1XPj0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FB7hE6%2FdJMcaaLcKmY%2Fup0nQi12nlYNEKVdP1XPj0%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;976&quot; height=&quot;1136&quot;/&gt;&lt;/span&gt;&lt;/div&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-style=&quot;style3&quot; data-ke-type=&quot;horizontalRule&quot; /&gt;
&lt;h3 style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size23&quot;&gt;풀이&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;2차원, 정점 (r, c), 상하좌우 이동&lt;/li&gt;
&lt;li&gt;`.`: 이동 가능 / `+`: 벽 (이동 불가)&lt;/li&gt;
&lt;li&gt;출구: 가장자리에 있는 `.` (!= 시작점)&lt;/li&gt;
&lt;/ul&gt;
&lt;pre id=&quot;code_1776265223891&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;int[] dr = {1, -1, 0, 0};
int[] dc = {0, 0, 1, -1};&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;`q.offer(new int[]{r, c, dist})`: (행, 열, 거리)&lt;/li&gt;
&lt;li&gt;`maze[nr][nc] = '+'`: 지나간 곳을 벽으로 바꿈&lt;/li&gt;
&lt;/ul&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-style=&quot;style3&quot; data-ke-type=&quot;horizontalRule&quot; /&gt;
&lt;h3 style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size23&quot;&gt;코드&lt;/h3&gt;
&lt;pre id=&quot;code_1772699663253&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;class Solution {
    int m, n;
    int[] dr = {1, -1, 0, 0};
    int[] dc = {0, 0, 1, -1};

    int bfs(char[][] maze, int[] entrance) {
        Queue&amp;lt;int[]&amp;gt; q = new ArrayDeque&amp;lt;&amp;gt;();
        q.offer(new int[]{entrance[0], entrance[1], 0});

        maze[entrance[0]][entrance[1]] = '+';

        while (!q.isEmpty()) {
            int[] cur = q.poll();
            int r = cur[0];
            int c = cur[1];
            int dist = cur[2];

            for (int i = 0; i &amp;lt; 4; i++) {
                int nr = r + dr[i];
                int nc = c + dc[i];

                if (nr &amp;lt; 0 || nc &amp;lt; 0 || nr &amp;gt;= m || nc &amp;gt;= n) continue;

                if (maze[nr][nc] == '+') continue;

                if (nr == 0 || nr == m - 1 || nc == 0 || nc == n - 1) {
                    return dist + 1;
                }

                maze[nr][nc] = '+';
                q.offer(new int[]{nr, nc, dist + 1});
            }
        }

        return -1;
    }

    public int nearestExit(char[][] maze, int[] entrance) {
        m = maze.length;
        n = maze[0].length;

        return bfs(maze, entrance);
    }
}&lt;/code&gt;&lt;/pre&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style6&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;994&amp;nbsp;-&amp;nbsp;Rotting&amp;nbsp;Oranges&lt;/h2&gt;
&lt;p&gt;&lt;figure class=&quot;imagegridblock&quot;&gt;
  &lt;div class=&quot;image-container&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bCredo/dJMcafMxpob/CkUGO6CDd8ztTFyTZWKtK1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bCredo/dJMcafMxpob/CkUGO6CDd8ztTFyTZWKtK1/img.png&quot; data-is-animation=&quot;false&quot; data-origin-width=&quot;954&quot; data-origin-height=&quot;1220&quot; data-filename=&quot;스크린샷 2026-03-05 오후 5.43.31.png&quot; style=&quot;width: 44.9877%; margin-right: 10px;&quot; data-widthpercent=&quot;45.52&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bCredo/dJMcafMxpob/CkUGO6CDd8ztTFyTZWKtK1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbCredo%2FdJMcafMxpob%2FCkUGO6CDd8ztTFyTZWKtK1%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;954&quot; height=&quot;1220&quot;/&gt;&lt;/span&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/GVUz7/dJMcafMxppb/MYkVUVqs9m8ntStCLcEiX1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/GVUz7/dJMcafMxppb/MYkVUVqs9m8ntStCLcEiX1/img.png&quot; data-is-animation=&quot;false&quot; data-origin-width=&quot;936&quot; data-origin-height=&quot;1000&quot; data-filename=&quot;스크린샷 2026-03-05 오후 5.43.41.png&quot; data-widthpercent=&quot;54.48&quot; style=&quot;width: 53.8495%;&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/GVUz7/dJMcafMxppb/MYkVUVqs9m8ntStCLcEiX1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FGVUz7%2FdJMcafMxppb%2FMYkVUVqs9m8ntStCLcEiX1%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;936&quot; height=&quot;1000&quot;/&gt;&lt;/span&gt;&lt;/div&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-style=&quot;style3&quot; data-ke-type=&quot;horizontalRule&quot; /&gt;
&lt;h3 style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size23&quot;&gt;풀이&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;0: 빈 공간 / 1: 신선한 오렌지 / 2: 썩은 오렌지&lt;/li&gt;
&lt;li&gt;상하좌우 이동&lt;/li&gt;
&lt;li&gt;썩은 오렌지(2) -&amp;gt; 신선한 오렌지(1)로 퍼짐 &lt;br /&gt;=&amp;gt; 신선한 오렌지가 썩은 오렌지로 변하는 데 걸리는 최소 시간&lt;br /&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;모든 썩은 오렌지 -&amp;gt; 동시에 시작점으로 넣음&lt;/li&gt;
&lt;li&gt;`fresh`: 남은 신선한 오렌지 개수 카운트&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;pre id=&quot;code_1776265466764&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;if (grid[r][c] == 2) {
    q.offer(new int[]{r, c});
}

if (grid[r][c] == 1) fresh++;&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;`!q.isEmpty() &amp;amp;&amp;amp; fresh &amp;gt; 0`: 더 이상 퍼질 게 없거나 다 썩었으면 종료&lt;/li&gt;
&lt;li&gt;현재 큐에 있는 것들 = 같은 시간(`minute`)에 있는 상태&lt;/li&gt;
&lt;/ul&gt;
&lt;pre id=&quot;code_1776265550062&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;while (!q.isEmpty() &amp;amp;&amp;amp; fresh &amp;gt; 0) {
	int size = q.size();
    
    for (int i = 0; i &amp;lt; size; i++) {
        int[] cur = q.poll();

        for (int d = 0; d &amp;lt; 4; d++) {
            int nr = cur[0] + dr[d];
            int nc = cur[1] + dc[d];

            if (nr &amp;lt; 0 || nc &amp;lt; 0 || nr &amp;gt;= m || nc &amp;gt;= n) continue;

            if (grid[nr][nc] != 1) continue;

            grid[nr][nc] = 2;
            fresh--;

            q.offer(new int[]{nr, nc});
        }
    }

    minutes++;
}&lt;/code&gt;&lt;/pre&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-style=&quot;style3&quot; data-ke-type=&quot;horizontalRule&quot; /&gt;
&lt;h3 style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size23&quot;&gt;코드&lt;/h3&gt;
&lt;pre id=&quot;code_1772700149499&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;class Solution {
    int m, n;
    int[] dr = {1, -1, 0, 0};
    int[] dc = {0, 0, 1, -1};

    int bfs(int[][] grid, Queue&amp;lt;int[]&amp;gt; q, int fresh) {
        int minutes = 0;

        while (!q.isEmpty() &amp;amp;&amp;amp; fresh &amp;gt; 0) {
            int size = q.size();

            for (int i = 0; i &amp;lt; size; i++) {
                int[] cur = q.poll();

                for (int d = 0; d &amp;lt; 4; d++) {
                    int nr = cur[0] + dr[d];
                    int nc = cur[1] + dc[d];

                    if (nr &amp;lt; 0 || nc &amp;lt; 0 || nr &amp;gt;= m || nc &amp;gt;= n) continue;

                    if (grid[nr][nc] != 1) continue;

                    grid[nr][nc] = 2;
                    fresh--;

                    q.offer(new int[]{nr, nc});
                }
            }

            minutes++;
        }

        return fresh == 0 ? minutes : -1;
    }

    public int orangesRotting(int[][] grid) {
        m = grid.length;
        n = grid[0].length;

        Queue&amp;lt;int[]&amp;gt; q = new ArrayDeque&amp;lt;&amp;gt;();
        int fresh = 0;

        for (int r = 0; r &amp;lt; m; r++) {
            for (int c = 0; c &amp;lt; n; c++) {
                if (grid[r][c] == 2) {
                    q.offer(new int[]{r, c});
                }

                if (grid[r][c] == 1) fresh++;
            }
        }

        return bfs(grid, q, fresh);
    }
}&lt;/code&gt;&lt;/pre&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-style=&quot;style6&quot; data-ke-type=&quot;horizontalRule&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;출처&lt;/h2&gt;
&lt;figure id=&quot;og_1772699259740&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;LeetCode 75 - Study Plan - LeetCode&quot; data-og-description=&quot;Ace Coding Interview with 75 Qs&quot; data-og-host=&quot;leetcode.com&quot; data-og-source-url=&quot;https://leetcode.com/studyplan/leetcode-75/&quot; data-og-url=&quot;https://leetcode.com/studyplan/leetcode-75/&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/kmrKN/dJMb85WQ4Tl/daQbUthZzDbnhJP62KBub1/img.png?width=720&amp;amp;height=720&amp;amp;face=0_0_720_720,https://scrap.kakaocdn.net/dn/bT6i5Z/dJMb82MASHT/JamVd3wgFhaFpkcUPgWC90/img.png?width=720&amp;amp;height=720&amp;amp;face=0_0_720_720,https://scrap.kakaocdn.net/dn/cdGwGO/dJMb83SgCsg/bXnaP0ANi5KalTcpVoWOK0/img.png?width=360&amp;amp;height=360&amp;amp;face=0_0_360_360&quot;&gt;&lt;a href=&quot;https://leetcode.com/studyplan/leetcode-75/&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://leetcode.com/studyplan/leetcode-75/&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/kmrKN/dJMb85WQ4Tl/daQbUthZzDbnhJP62KBub1/img.png?width=720&amp;amp;height=720&amp;amp;face=0_0_720_720,https://scrap.kakaocdn.net/dn/bT6i5Z/dJMb82MASHT/JamVd3wgFhaFpkcUPgWC90/img.png?width=720&amp;amp;height=720&amp;amp;face=0_0_720_720,https://scrap.kakaocdn.net/dn/cdGwGO/dJMb83SgCsg/bXnaP0ANi5KalTcpVoWOK0/img.png?width=360&amp;amp;height=360&amp;amp;face=0_0_360_360');&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;LeetCode 75 - Study Plan - LeetCode&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;Ace Coding Interview with 75 Qs&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;leetcode.com&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;</description>
      <category>✏️/LeetCode</category>
      <author>aeongg</author>
      <guid isPermaLink="true">https://debug.tistory.com/554</guid>
      <comments>https://debug.tistory.com/554#entry554comment</comments>
      <pubDate>Thu, 5 Mar 2026 17:28:10 +0900</pubDate>
    </item>
    <item>
      <title>[LeetCode 75/Binary Search Tree] 700 - Search in a Binary Search Tree / 450 - Delete Node in a BST (Java)</title>
      <link>https://debug.tistory.com/552</link>
      <description>&lt;h2 data-ke-size=&quot;size26&quot;&gt;700 - Search in a Binary Search Tree&lt;/h2&gt;
&lt;p&gt;&lt;figure class=&quot;imagegridblock&quot;&gt;
  &lt;div class=&quot;image-container&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/c5pmRG/dJMcaiJbmJQ/Bd72kSNGkrKgjCzI5MOI8K/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/c5pmRG/dJMcaiJbmJQ/Bd72kSNGkrKgjCzI5MOI8K/img.png&quot; data-is-animation=&quot;false&quot; data-origin-width=&quot;1000&quot; data-origin-height=&quot;1274&quot; data-filename=&quot;스크린샷 2026-03-04 오후 2.10.17.png&quot; style=&quot;width: 51.3176%; margin-right: 10px;&quot; data-widthpercent=&quot;51.92&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/c5pmRG/dJMcaiJbmJQ/Bd72kSNGkrKgjCzI5MOI8K/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fc5pmRG%2FdJMcaiJbmJQ%2FBd72kSNGkrKgjCzI5MOI8K%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;1000&quot; height=&quot;1274&quot;/&gt;&lt;/span&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/J2j4w/dJMcabDk9ki/RFcw3rtKsG0aqv7hXP0eY1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/J2j4w/dJMcabDk9ki/RFcw3rtKsG0aqv7hXP0eY1/img.png&quot; data-is-animation=&quot;false&quot; data-origin-width=&quot;910&quot; data-origin-height=&quot;1252&quot; data-filename=&quot;스크린샷 2026-03-04 오후 2.10.05.png&quot; style=&quot;width: 47.5196%;&quot; data-widthpercent=&quot;48.08&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/J2j4w/dJMcabDk9ki/RFcw3rtKsG0aqv7hXP0eY1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FJ2j4w%2FdJMcabDk9ki%2FRFcw3rtKsG0aqv7hXP0eY1%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;910&quot; height=&quot;1252&quot;/&gt;&lt;/span&gt;&lt;/div&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style3&quot; /&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;풀이&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;BST에서 값이 val과 같은 노드 찾고 그 노드를 root로 하는 subtree&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;BST: 왼쪽 subtree &amp;lt; 현재 노드 &amp;lt; 오른쪽 subtree&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;node.val &amp;gt; val -&amp;gt; 왼쪽으로 이동&lt;/li&gt;
&lt;li&gt;node.val &amp;lt; val -&amp;gt; 오른쪽으로 이동&lt;/li&gt;
&lt;/ul&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-style=&quot;style3&quot; data-ke-type=&quot;horizontalRule&quot; /&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;코드&lt;/h3&gt;
&lt;pre id=&quot;code_1772600989884&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;class Solution {
    public TreeNode searchBST(TreeNode root, int val) {
        if (root == null) return null;

        if (root.val == val) return root;

        if (val &amp;lt; root.val) return searchBST(root.left, val);
        else return searchBST(root.right, val);
    }
}&lt;/code&gt;&lt;/pre&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-style=&quot;style6&quot; data-ke-type=&quot;horizontalRule&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;450 - Delete Node in a BST&lt;/h2&gt;
&lt;p&gt;&lt;figure class=&quot;imagegridblock&quot;&gt;
  &lt;div class=&quot;image-container&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/P8wSg/dJMcafsbuRY/OriHSE8caur3R6rBH9ltb0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/P8wSg/dJMcafsbuRY/OriHSE8caur3R6rBH9ltb0/img.png&quot; data-is-animation=&quot;false&quot; data-origin-width=&quot;1114&quot; data-origin-height=&quot;1312&quot; data-filename=&quot;스크린샷 2026-03-04 오후 2.12.26.png&quot; style=&quot;width: 52.921%; margin-right: 10px;&quot; data-widthpercent=&quot;53.54&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/P8wSg/dJMcafsbuRY/OriHSE8caur3R6rBH9ltb0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FP8wSg%2FdJMcafsbuRY%2FOriHSE8caur3R6rBH9ltb0%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;1114&quot; height=&quot;1312&quot;/&gt;&lt;/span&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/uIXEE/dJMcah4CzJq/SWzT8Z3dUdSE7cYm75vzVk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/uIXEE/dJMcah4CzJq/SWzT8Z3dUdSE7cYm75vzVk/img.png&quot; data-filename=&quot;스크린샷 2026-03-04 오후 2.12.49.png&quot; data-origin-height=&quot;1466&quot; data-origin-width=&quot;1080&quot; data-is-animation=&quot;false&quot; style=&quot;width: 45.9162%;&quot; data-widthpercent=&quot;46.46&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/uIXEE/dJMcah4CzJq/SWzT8Z3dUdSE7cYm75vzVk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FuIXEE%2FdJMcah4CzJq%2FSWzT8Z3dUdSE7cYm75vzVk%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;1080&quot; height=&quot;1466&quot;/&gt;&lt;/span&gt;&lt;/div&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-style=&quot;style3&quot; data-ke-type=&quot;horizontalRule&quot; /&gt;
&lt;h3 style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size23&quot;&gt;풀이&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;BST에서 값 key 가진 노드 찾아 삭제하고 삭제 후에도 BST 성질 유지&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;BST: 왼쪽 subtree &amp;lt; 현재 노드 &amp;lt; 오른쪽 subtree&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;node.val &amp;gt; val -&amp;gt; 왼쪽으로 이동&lt;/li&gt;
&lt;li&gt;node.val &amp;lt; val -&amp;gt; 오른쪽으로 이동&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;삭제 3가지 경우&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;자식 X (leaf) -&amp;gt; `return null`&lt;/li&gt;
&lt;li&gt;자식 하나 -&amp;gt; `return node.left` or `return node.right`&lt;/li&gt;
&lt;li&gt;자식 둘 -&amp;gt; 오른쪽 subtree에서 가장 작은 값 or 왼쪽 subtree에서 가장 작은 값으로 대체&lt;/li&gt;
&lt;/ul&gt;
&lt;pre id=&quot;code_1772605534121&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;// case 1,2: 자식 0개 또는 1개
if (root.left == null) return root.right;
if (root.right == null) return root.left;

// case 3: 자식 2개
TreeNode min = findMin(root.right);
root.val = min.val;
root.right = deleteNode(root.right, min.val);&lt;/code&gt;&lt;/pre&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style3&quot; /&gt;
&lt;h3 style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size23&quot;&gt;코드&lt;/h3&gt;
&lt;pre id=&quot;code_1772601101566&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;class Solution {
    TreeNode findMin(TreeNode node) {
        while (node.left != null) {
            node = node.left;
        }

        return node;
    }

    public TreeNode deleteNode(TreeNode root, int key) {
        if (root == null) return null;

        if (key &amp;lt; root.val) {
            root.left = deleteNode(root.left, key);
        } else if (key &amp;gt; root.val) {
            root.right = deleteNode(root.right, key);
        } else {
            if (root.left == null) return root.right;
            if (root.right == null) return root.left;

            TreeNode min = findMin(root.right);
            root.val = min.val;
            root.right = deleteNode(root.right, min.val);
        }

        return root;
    }
}&lt;/code&gt;&lt;/pre&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style6&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;출처&lt;/h2&gt;
&lt;figure id=&quot;og_1772600843524&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;LeetCode 75 - Study Plan - LeetCode&quot; data-og-description=&quot;Ace Coding Interview with 75 Qs&quot; data-og-host=&quot;leetcode.com&quot; data-og-source-url=&quot;https://leetcode.com/studyplan/leetcode-75/&quot; data-og-url=&quot;https://leetcode.com/studyplan/leetcode-75/&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/cLqYyU/dJMb8PGtQeh/XkzOeZwdp2cnjaqDMvDkKk/img.png?width=720&amp;amp;height=720&amp;amp;face=0_0_720_720,https://scrap.kakaocdn.net/dn/sp2a6/dJMb8XR3iY5/uhPQ2rO0d2yAmerrZtnU60/img.png?width=720&amp;amp;height=720&amp;amp;face=0_0_720_720,https://scrap.kakaocdn.net/dn/cRCGPH/dJMb9gxi35N/5FujKSTorvgp60jnasvHv1/img.png?width=360&amp;amp;height=360&amp;amp;face=0_0_360_360&quot;&gt;&lt;a href=&quot;https://leetcode.com/studyplan/leetcode-75/&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://leetcode.com/studyplan/leetcode-75/&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/cLqYyU/dJMb8PGtQeh/XkzOeZwdp2cnjaqDMvDkKk/img.png?width=720&amp;amp;height=720&amp;amp;face=0_0_720_720,https://scrap.kakaocdn.net/dn/sp2a6/dJMb8XR3iY5/uhPQ2rO0d2yAmerrZtnU60/img.png?width=720&amp;amp;height=720&amp;amp;face=0_0_720_720,https://scrap.kakaocdn.net/dn/cRCGPH/dJMb9gxi35N/5FujKSTorvgp60jnasvHv1/img.png?width=360&amp;amp;height=360&amp;amp;face=0_0_360_360');&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;LeetCode 75 - Study Plan - LeetCode&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;Ace Coding Interview with 75 Qs&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;leetcode.com&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;</description>
      <category>✏️/LeetCode</category>
      <author>aeongg</author>
      <guid isPermaLink="true">https://debug.tistory.com/552</guid>
      <comments>https://debug.tistory.com/552#entry552comment</comments>
      <pubDate>Wed, 4 Mar 2026 14:08:12 +0900</pubDate>
    </item>
    <item>
      <title>[LeetCode 75/Binary Tree - BFS] 199 - Binary Tree Right Side View / 1161 - Maximum Level Sum of a Binary Tree (Java)</title>
      <link>https://debug.tistory.com/551</link>
      <description>&lt;h2 data-ke-size=&quot;size26&quot;&gt;199&amp;nbsp;-&amp;nbsp;Binary&amp;nbsp;Tree&amp;nbsp;Right&amp;nbsp;Side&amp;nbsp;View&lt;/h2&gt;
&lt;p&gt;&lt;figure class=&quot;imagegridblock&quot;&gt;
  &lt;div class=&quot;image-container&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/dWAG5a/dJMcaioVMce/9mZ4ALOuwpzWP4vA1ESf6K/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/dWAG5a/dJMcaioVMce/9mZ4ALOuwpzWP4vA1ESf6K/img.png&quot; data-is-animation=&quot;false&quot; data-origin-width=&quot;966&quot; data-origin-height=&quot;1370&quot; data-filename=&quot;스크린샷 2026-03-04 오후 1.15.22.png&quot; style=&quot;width: 48.7405%; margin-right: 10px;&quot; data-widthpercent=&quot;49.31&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/dWAG5a/dJMcaioVMce/9mZ4ALOuwpzWP4vA1ESf6K/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FdWAG5a%2FdJMcaioVMce%2F9mZ4ALOuwpzWP4vA1ESf6K%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;966&quot; height=&quot;1370&quot;/&gt;&lt;/span&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/FcFaU/dJMb99ZQdWw/pkBcIttpNxJYBPRKZqldq1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/FcFaU/dJMb99ZQdWw/pkBcIttpNxJYBPRKZqldq1/img.png&quot; data-is-animation=&quot;false&quot; data-origin-width=&quot;932&quot; data-origin-height=&quot;1286&quot; data-filename=&quot;스크린샷 2026-03-04 오후 1.15.01.png&quot; style=&quot;width: 50.0967%;&quot; data-widthpercent=&quot;50.69&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/FcFaU/dJMb99ZQdWw/pkBcIttpNxJYBPRKZqldq1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FFcFaU%2FdJMb99ZQdWw%2FpkBcIttpNxJYBPRKZqldq1%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;932&quot; height=&quot;1286&quot;/&gt;&lt;/span&gt;&lt;/div&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-style=&quot;style3&quot; data-ke-type=&quot;horizontalRule&quot; /&gt;
&lt;h3 style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size23&quot;&gt;풀이&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이진 트리의 루트 노드가 주어졌을 때, 트리를 오른쪽에서 바라봄&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;-&amp;gt; 각 높이(level)마다 맨 오른쪽 노드만 보임&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;=&amp;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;BFS로 트리를 레벨 순서로 탐색&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;ex. root = [1, 2, 3, , null, 5, null, 4]&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;level 0 / [1] =&amp;gt; 1&lt;/li&gt;
&lt;li&gt;level 1 / [2, 3] =&amp;gt; 3&lt;/li&gt;
&lt;li&gt;level 2 / [5, 4] =&amp;gt; 4&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;=&amp;gt; [1, 3, 4]&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-style=&quot;style3&quot; data-ke-type=&quot;horizontalRule&quot; /&gt;
&lt;h3 style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size23&quot;&gt;코드&lt;/h3&gt;
&lt;pre id=&quot;code_1772597666800&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;class Solution {
    public List&amp;lt;Integer&amp;gt; rightSideView(TreeNode root) {
        List&amp;lt;Integer&amp;gt; arr = new ArrayList&amp;lt;&amp;gt;();
        if (root == null) return arr;

        Queue&amp;lt;TreeNode&amp;gt; q = new ArrayDeque&amp;lt;&amp;gt;();
        q.offer(root);
        
        while (!q.isEmpty()) {
            int size = q.size();
            for (int i = 0; i &amp;lt; size; i++) {
                TreeNode node = q.poll();

                if (i == size - 1) {
                    arr.add(node.val);
                }

                if (node.left != null) q.offer(node.left);
                if (node.right != null) q.offer(node.right);
            }
        }

        return arr;
    }
}&lt;/code&gt;&lt;/pre&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style6&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;1161&amp;nbsp;-&amp;nbsp;Maximum&amp;nbsp;Level&amp;nbsp;Sum&amp;nbsp;of&amp;nbsp;a&amp;nbsp;Binary&amp;nbsp;Tree&lt;/h2&gt;
&lt;p&gt;&lt;figure class=&quot;imagegridblock&quot;&gt;
  &lt;div class=&quot;image-container&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/DpMoZ/dJMcah4CvlX/7CMW8SSGuH8Tr4o6OBZMT1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/DpMoZ/dJMcah4CvlX/7CMW8SSGuH8Tr4o6OBZMT1/img.png&quot; data-is-animation=&quot;false&quot; data-origin-width=&quot;1120&quot; data-origin-height=&quot;1008&quot; data-filename=&quot;스크린샷 2026-03-04 오후 1.33.00.png&quot; style=&quot;width: 45.1017%; margin-right: 10px;&quot; data-widthpercent=&quot;45.63&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/DpMoZ/dJMcah4CvlX/7CMW8SSGuH8Tr4o6OBZMT1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FDpMoZ%2FdJMcah4CvlX%2F7CMW8SSGuH8Tr4o6OBZMT1%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;1120&quot; height=&quot;1008&quot;/&gt;&lt;/span&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/ulopy/dJMcah4CvmE/edwTQ8qzT6ZpOzwVqaSYs1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/ulopy/dJMcah4CvmE/edwTQ8qzT6ZpOzwVqaSYs1/img.png&quot; data-is-animation=&quot;false&quot; data-origin-width=&quot;1112&quot; data-origin-height=&quot;840&quot; data-filename=&quot;스크린샷 2026-03-04 오후 1.33.12.png&quot; style=&quot;width: 53.7355%;&quot; data-widthpercent=&quot;54.37&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/ulopy/dJMcah4CvmE/edwTQ8qzT6ZpOzwVqaSYs1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fulopy%2FdJMcah4CvmE%2FedwTQ8qzT6ZpOzwVqaSYs1%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;1112&quot; height=&quot;840&quot;/&gt;&lt;/span&gt;&lt;/div&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-style=&quot;style3&quot; data-ke-type=&quot;horizontalRule&quot; /&gt;
&lt;h3 style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size23&quot;&gt;풀이&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;각 레벨 노드 값 합 계산해서 합이 가장 큰 레벨 번호 반환&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;-&amp;gt; `sum += node.val`&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-style=&quot;style3&quot; data-ke-type=&quot;horizontalRule&quot; /&gt;
&lt;pre id=&quot;code_1772598698185&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;class Solution {
    public int maxLevelSum(TreeNode root) {
        Queue&amp;lt;TreeNode&amp;gt; q = new ArrayDeque&amp;lt;&amp;gt;();
        q.offer(root);

        int level = 1;
        int maxLevel = 1;
        int maxSum = Integer.MIN_VALUE;

        while (!q.isEmpty()) {
            int size = q.size();
            int sum = 0;

            for (int i = 0; i &amp;lt; size; i++) {
                TreeNode node = q.poll();
                sum += node.val;

                if (node.left != null) q.offer(node.left);
                if (node.right != null) q.offer(node.right);
            }

            if (sum &amp;gt; maxSum) {
                maxSum = sum;
                maxLevel = level;
            }

            level++;
        }

        return maxLevel;        
    }
}&lt;/code&gt;&lt;/pre&gt;
&lt;h3 style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size23&quot;&gt;코드&lt;/h3&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-style=&quot;style6&quot; data-ke-type=&quot;horizontalRule&quot; /&gt;
&lt;h2 style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size26&quot;&gt;출처&lt;/h2&gt;
&lt;figure id=&quot;og_1772447187881&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;LeetCode 75 - Study Plan - LeetCode&quot; data-og-description=&quot;Ace Coding Interview with 75 Qs&quot; data-og-host=&quot;leetcode.com&quot; data-og-source-url=&quot;https://leetcode.com/studyplan/leetcode-75/&quot; data-og-url=&quot;https://leetcode.com/studyplan/leetcode-75/&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/rI8Y4/dJMb87f3Wpb/JeJzmEA9NZl0ojPjO7PwoK/img.png?width=720&amp;amp;height=720&amp;amp;face=0_0_720_720,https://scrap.kakaocdn.net/dn/dnQN8s/dJMb88eX9Bg/fFtWk2ENUGFJgEhgPvSb01/img.png?width=720&amp;amp;height=720&amp;amp;face=0_0_720_720,https://scrap.kakaocdn.net/dn/bl7sgd/dJMb85WQM1t/25fTb0F1mndFwvtTbiseK1/img.png?width=360&amp;amp;height=360&amp;amp;face=0_0_360_360&quot;&gt;&lt;a href=&quot;https://leetcode.com/studyplan/leetcode-75/&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://leetcode.com/studyplan/leetcode-75/&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/rI8Y4/dJMb87f3Wpb/JeJzmEA9NZl0ojPjO7PwoK/img.png?width=720&amp;amp;height=720&amp;amp;face=0_0_720_720,https://scrap.kakaocdn.net/dn/dnQN8s/dJMb88eX9Bg/fFtWk2ENUGFJgEhgPvSb01/img.png?width=720&amp;amp;height=720&amp;amp;face=0_0_720_720,https://scrap.kakaocdn.net/dn/bl7sgd/dJMb85WQM1t/25fTb0F1mndFwvtTbiseK1/img.png?width=360&amp;amp;height=360&amp;amp;face=0_0_360_360');&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;LeetCode 75 - Study Plan - LeetCode&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;Ace Coding Interview with 75 Qs&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;leetcode.com&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;</description>
      <category>✏️/LeetCode</category>
      <author>aeongg</author>
      <guid isPermaLink="true">https://debug.tistory.com/551</guid>
      <comments>https://debug.tistory.com/551#entry551comment</comments>
      <pubDate>Tue, 3 Mar 2026 19:45:43 +0900</pubDate>
    </item>
    <item>
      <title>[LeetCode 75/Binary Tree - DFS] 437 - Path Sum 3 / 1372 - Longest ZigZag Path in a Binary Tree / 236 - Lowest Common Ancestor of a Binary Tree (Java)</title>
      <link>https://debug.tistory.com/550</link>
      <description>&lt;h2 data-ke-size=&quot;size26&quot;&gt;437 - Path Sum 3&lt;/h2&gt;
&lt;p&gt;&lt;figure class=&quot;imagegridblock&quot;&gt;
  &lt;div class=&quot;image-container&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/dUe738/dJMcag5H8FN/0DwPVrXlxvQIolCWq9qSA1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/dUe738/dJMcag5H8FN/0DwPVrXlxvQIolCWq9qSA1/img.png&quot; data-is-animation=&quot;false&quot; data-origin-width=&quot;1056&quot; data-origin-height=&quot;1362&quot; data-filename=&quot;스크린샷 2026-03-03 오후 7.27.29.png&quot; style=&quot;width: 38.1843%; margin-right: 10px;&quot; data-widthpercent=&quot;38.63&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/dUe738/dJMcag5H8FN/0DwPVrXlxvQIolCWq9qSA1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FdUe738%2FdJMcag5H8FN%2F0DwPVrXlxvQIolCWq9qSA1%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;1056&quot; height=&quot;1362&quot;/&gt;&lt;/span&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/erbaeV/dJMcacoG7Zw/hKXtv6s9jaZ9ZOujFmEbx0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/erbaeV/dJMcacoG7Zw/hKXtv6s9jaZ9ZOujFmEbx0/img.png&quot; data-is-animation=&quot;false&quot; data-origin-width=&quot;968&quot; data-origin-height=&quot;786&quot; data-filename=&quot;스크린샷 2026-03-03 오후 7.27.49.png&quot; style=&quot;width: 60.6529%;&quot; data-widthpercent=&quot;61.37&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/erbaeV/dJMcacoG7Zw/hKXtv6s9jaZ9ZOujFmEbx0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FerbaeV%2FdJMcacoG7Zw%2FhKXtv6s9jaZ9ZOujFmEbx0%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;968&quot; height=&quot;786&quot;/&gt;&lt;/span&gt;&lt;/div&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style3&quot; /&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;풀이&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;부모 -&amp;gt; 자식 경로 중 합이 `targetSum`인 경로 개수&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;=&amp;gt; 모든 노드를 시작점으로 생각&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;`int dfs(TreeNode node, long target)`: 현재 node에서 시작해서 아래로 내려가며 합이 `target`이 되는 경로 개수&lt;/li&gt;
&lt;li&gt;`int pathSum(TreeNode root, int targetSum)`: 모든 노드를 시작점으로 고려
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;`dfs(root, targetSum)`: root에서 시작하는 경로 개수&lt;/li&gt;
&lt;li&gt;`pathSum(root.left, targetSum)`: 왼쪽 subtree에서 시작하는 경로 개수&lt;/li&gt;
&lt;li&gt;`pathSum(root.right, targetSum)`: 오른쪽 subtree에서 시작하는 경로 개수&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style3&quot; /&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;코드&lt;/h3&gt;
&lt;pre id=&quot;code_1772533610122&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;class Solution {
    int dfs(TreeNode node, long target) {
        if (node == null) return 0;

        int cnt = 0;
        if (node.val == target) cnt++;

        cnt += dfs(node.left, target - node.val);
        cnt += dfs(node.right, target - node.val);

        return cnt;
    }
    
    public int pathSum(TreeNode root, int targetSum) {
        if (root == null) return 0;

        return dfs(root, targetSum)
            + pathSum(root.left, targetSum)
            + pathSum(root.right, targetSum);
    }
}&lt;/code&gt;&lt;/pre&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-style=&quot;style6&quot; data-ke-type=&quot;horizontalRule&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;1372 - Longest ZigZag Path in a Binary Tree&lt;/h2&gt;
&lt;p&gt;&lt;figure class=&quot;imagegridblock&quot;&gt;
  &lt;div class=&quot;image-container&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/ca8NsP/dJMcadHRtIH/Z1MoXbpiTkgn9Ju3XUgZV1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/ca8NsP/dJMcadHRtIH/Z1MoXbpiTkgn9Ju3XUgZV1/img.png&quot; data-is-animation=&quot;false&quot; data-origin-width=&quot;1130&quot; data-origin-height=&quot;906&quot; data-filename=&quot;스크린샷 2026-03-03 오후 7.31.18.png&quot; style=&quot;width: 45.4369%; margin-right: 10px;&quot; data-widthpercent=&quot;46.52&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/ca8NsP/dJMcadHRtIH/Z1MoXbpiTkgn9Ju3XUgZV1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fca8NsP%2FdJMcadHRtIH%2FZ1MoXbpiTkgn9Ju3XUgZV1%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;1130&quot; height=&quot;906&quot;/&gt;&lt;/span&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/2OntP/dJMcad19Aq7/4KdmoZqixvPqXUbrztGivK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/2OntP/dJMcad19Aq7/4KdmoZqixvPqXUbrztGivK/img.png&quot; data-is-animation=&quot;false&quot; data-origin-width=&quot;914&quot; data-origin-height=&quot;1144&quot; data-filename=&quot;스크린샷 2026-03-03 오후 7.31.02.png&quot; style=&quot;width: 29.1058%; margin-right: 10px;&quot; data-widthpercent=&quot;29.8&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/2OntP/dJMcad19Aq7/4KdmoZqixvPqXUbrztGivK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2F2OntP%2FdJMcad19Aq7%2F4KdmoZqixvPqXUbrztGivK%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;914&quot; height=&quot;1144&quot;/&gt;&lt;/span&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bjya2G/dJMcafyYrxj/EzFkRsDzAqg83It9tTjrlk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bjya2G/dJMcafyYrxj/EzFkRsDzAqg83It9tTjrlk/img.png&quot; data-is-animation=&quot;false&quot; data-origin-width=&quot;908&quot; data-origin-height=&quot;1430&quot; data-filename=&quot;스크린샷 2026-03-03 오후 7.30.51.png&quot; style=&quot;width: 23.1317%;&quot; data-widthpercent=&quot;23.68&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bjya2G/dJMcafyYrxj/EzFkRsDzAqg83It9tTjrlk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fbjya2G%2FdJMcafyYrxj%2FEzFkRsDzAqg83It9tTjrlk%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;908&quot; height=&quot;1430&quot;/&gt;&lt;/span&gt;&lt;/div&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-style=&quot;style3&quot; data-ke-type=&quot;horizontalRule&quot; /&gt;
&lt;h3 style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size23&quot;&gt;풀이&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;아무 노드에서 시작 -&amp;gt; 방향 선택(left/right) -&amp;gt; 한 번 이동 -&amp;gt; 방향 변경 =&amp;gt; 반복&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;지그재그 길이 = 방문한 노드 수 - 1 (노드 1개 -&amp;gt; 길이 0)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;매번 방향을 바꿔줘야 함
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;현재 노드, 현재 방향, 현재 길이&amp;nbsp;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;각 노드에서 왼쪽/오른쪽 시작 경우 모두 고려&lt;/li&gt;
&lt;/ul&gt;
&lt;pre id=&quot;code_1772536884067&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;dfs(root, true, 0);
dfs(root, false, 0);&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;`goLeft == true`: 왼쪽으로 가야 함&amp;nbsp;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;왼쪽으로 간 뒤 오른쪽으로 가야 함&lt;/li&gt;
&lt;li&gt;현재 노드에서 새 zigzag 시작&lt;/li&gt;
&lt;/ul&gt;
&lt;pre id=&quot;code_1772536954921&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;dfs(node.left, false, len + 1);
dfs(node.right, true, 1);&lt;/code&gt;&lt;/pre&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-style=&quot;style3&quot; data-ke-type=&quot;horizontalRule&quot; /&gt;
&lt;h3 style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size23&quot;&gt;코드&lt;/h3&gt;
&lt;pre id=&quot;code_1772533831903&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;class Solution {
    int max = 0;

    void dfs(TreeNode node, boolean goLeft, int len) {
        if (node == null) return;

        max = Math.max(max, len);
        
        if (goLeft) {
            dfs(node.left, false, len + 1);
            dfs(node.right, true, 1);
        } else {
            dfs(node.right, true, len + 1);
            dfs(node.left, false, 1);
        }
    }

    public int longestZigZag(TreeNode root) {
        dfs(root, true, 0);
        dfs(root, false, 0);

        return max;
    }
}&lt;/code&gt;&lt;/pre&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-style=&quot;style6&quot; data-ke-type=&quot;horizontalRule&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;236 - Lowest Common Ancestor of a Binary Tree&lt;/h2&gt;
&lt;p&gt;&lt;figure class=&quot;imagegridblock&quot;&gt;
  &lt;div class=&quot;image-container&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/6URQN/dJMcadVoBlw/x30KY8Z2sWqmQQHXS5QBtk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/6URQN/dJMcadVoBlw/x30KY8Z2sWqmQQHXS5QBtk/img.png&quot; data-is-animation=&quot;false&quot; data-origin-width=&quot;1056&quot; data-origin-height=&quot;1276&quot; data-filename=&quot;스크린샷 2026-03-03 오후 7.39.39.png&quot; style=&quot;width: 52.0496%; margin-right: 10px;&quot; data-widthpercent=&quot;52.66&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/6URQN/dJMcadVoBlw/x30KY8Z2sWqmQQHXS5QBtk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2F6URQN%2FdJMcadVoBlw%2Fx30KY8Z2sWqmQQHXS5QBtk%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;1056&quot; height=&quot;1276&quot;/&gt;&lt;/span&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/b0Z2C6/dJMcadny9kA/IYTuqEvGXyR34dCnRYybyk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/b0Z2C6/dJMcadny9kA/IYTuqEvGXyR34dCnRYybyk/img.png&quot; data-is-animation=&quot;false&quot; data-origin-width=&quot;1040&quot; data-origin-height=&quot;1398&quot; data-filename=&quot;스크린샷 2026-03-03 오후 7.39.25.png&quot; style=&quot;width: 46.7876%;&quot; data-widthpercent=&quot;47.34&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/b0Z2C6/dJMcadny9kA/IYTuqEvGXyR34dCnRYybyk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fb0Z2C6%2FdJMcadny9kA%2FIYTuqEvGXyR34dCnRYybyk%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;1040&quot; height=&quot;1398&quot;/&gt;&lt;/span&gt;&lt;/div&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-style=&quot;style3&quot; data-ke-type=&quot;horizontalRule&quot; /&gt;
&lt;h3 style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size23&quot;&gt;풀이&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;LCA: 두 노드 p, q를 모두 포함하는 &lt;u&gt;&lt;b&gt;가장 낮은&lt;/b&gt;&lt;/u&gt; 공통 조상&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;lowest: root에서 가장 먼(가장 깊은) 공통 조상&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;=&amp;gt; 어떤 노드에서 왼쪽 subtree에 p, q 있고, 오른쪽 subtree에 p, q 있으면 그 노드가 LCA&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;왼쪽, 오른쪽 찾은 경우(`lt != null &amp;amp;&amp;amp; rt != null`) -&amp;gt; 현재 root가 LCA&lt;/li&gt;
&lt;li&gt;한쪽만 찾은 경우 -&amp;gt; 그 결과를 위로 전달&lt;/li&gt;
&lt;/ul&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-style=&quot;style3&quot; data-ke-type=&quot;horizontalRule&quot; /&gt;
&lt;h3 style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size23&quot;&gt;코드&lt;/h3&gt;
&lt;pre id=&quot;code_1772534274546&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;class Solution {
    public TreeNode lowestCommonAncestor(TreeNode root, TreeNode p, TreeNode q) {
        if (root == null || root == p || root == q) return root;

        TreeNode lt = lowestCommonAncestor(root.left, p, q);
        TreeNode rt = lowestCommonAncestor(root.right, p, q);

        if (lt != null &amp;amp;&amp;amp; rt != null) return root;
        
        return lt != null ? lt : rt;
    }
}&lt;/code&gt;&lt;/pre&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style6&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;출처&lt;/h2&gt;
&lt;figure id=&quot;og_1772447098602&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;LeetCode 75 - Study Plan - LeetCode&quot; data-og-description=&quot;Ace Coding Interview with 75 Qs&quot; data-og-host=&quot;leetcode.com&quot; data-og-source-url=&quot;https://leetcode.com/studyplan/leetcode-75/&quot; data-og-url=&quot;https://leetcode.com/studyplan/leetcode-75/&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/rI8Y4/dJMb87f3Wpb/JeJzmEA9NZl0ojPjO7PwoK/img.png?width=720&amp;amp;height=720&amp;amp;face=0_0_720_720,https://scrap.kakaocdn.net/dn/dnQN8s/dJMb88eX9Bg/fFtWk2ENUGFJgEhgPvSb01/img.png?width=720&amp;amp;height=720&amp;amp;face=0_0_720_720,https://scrap.kakaocdn.net/dn/bl7sgd/dJMb85WQM1t/25fTb0F1mndFwvtTbiseK1/img.png?width=360&amp;amp;height=360&amp;amp;face=0_0_360_360&quot;&gt;&lt;a href=&quot;https://leetcode.com/studyplan/leetcode-75/&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://leetcode.com/studyplan/leetcode-75/&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/rI8Y4/dJMb87f3Wpb/JeJzmEA9NZl0ojPjO7PwoK/img.png?width=720&amp;amp;height=720&amp;amp;face=0_0_720_720,https://scrap.kakaocdn.net/dn/dnQN8s/dJMb88eX9Bg/fFtWk2ENUGFJgEhgPvSb01/img.png?width=720&amp;amp;height=720&amp;amp;face=0_0_720_720,https://scrap.kakaocdn.net/dn/bl7sgd/dJMb85WQM1t/25fTb0F1mndFwvtTbiseK1/img.png?width=360&amp;amp;height=360&amp;amp;face=0_0_360_360');&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;LeetCode 75 - Study Plan - LeetCode&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;Ace Coding Interview with 75 Qs&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;leetcode.com&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;</description>
      <category>✏️/LeetCode</category>
      <author>aeongg</author>
      <guid isPermaLink="true">https://debug.tistory.com/550</guid>
      <comments>https://debug.tistory.com/550#entry550comment</comments>
      <pubDate>Mon, 2 Mar 2026 20:03:31 +0900</pubDate>
    </item>
    <item>
      <title>[LeetCode 75/Binary Tree - DFS] 104 - Maximum Depth of Binary Tree / 872 - Leaf-Similar Trees / 1448 - Count Good Nodes in Binary Tree (Java)</title>
      <link>https://debug.tistory.com/549</link>
      <description>&lt;h2 data-ke-size=&quot;size26&quot;&gt;104 - Maximum Depth of Binary Tree&lt;/h2&gt;
&lt;p&gt;&lt;figure class=&quot;imagegridblock&quot;&gt;
  &lt;div class=&quot;image-container&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/brZjPC/dJMcaaLaIfG/WKpUK1Us5EN8NPeO0bD2qk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/brZjPC/dJMcaaLaIfG/WKpUK1Us5EN8NPeO0bD2qk/img.png&quot; data-is-animation=&quot;false&quot; data-origin-width=&quot;1054&quot; data-origin-height=&quot;1220&quot; data-filename=&quot;스크린샷 2026-03-02 오후 7.21.54.png&quot; style=&quot;width: 31.6263%; margin-right: 10px;&quot; data-widthpercent=&quot;32&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/brZjPC/dJMcaaLaIfG/WKpUK1Us5EN8NPeO0bD2qk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbrZjPC%2FdJMcaaLaIfG%2FWKpUK1Us5EN8NPeO0bD2qk%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;1054&quot; height=&quot;1220&quot;/&gt;&lt;/span&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/ce6I8v/dJMcai3rSmD/Y0fq4mToDJupDiE1f15PM1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/ce6I8v/dJMcai3rSmD/Y0fq4mToDJupDiE1f15PM1/img.png&quot; data-is-animation=&quot;false&quot; data-origin-width=&quot;918&quot; data-origin-height=&quot;500&quot; data-filename=&quot;스크린샷 2026-03-02 오후 7.22.01.png&quot; data-widthpercent=&quot;68&quot; style=&quot;width: 67.2109%;&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/ce6I8v/dJMcai3rSmD/Y0fq4mToDJupDiE1f15PM1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fce6I8v%2FdJMcai3rSmD%2FY0fq4mToDJupDiE1f15PM1%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;918&quot; height=&quot;500&quot;/&gt;&lt;/span&gt;&lt;/div&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-style=&quot;style3&quot; data-ke-type=&quot;horizontalRule&quot; /&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;풀이&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이진 트리 노드 정의 클래스&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;`val`: 자기 값&lt;/li&gt;
&lt;li&gt;`left`: 왼쪽 자식&lt;/li&gt;
&lt;li&gt;`right`: 오른쪽 자식&lt;/li&gt;
&lt;/ul&gt;
&lt;pre id=&quot;code_1772448418543&quot; class=&quot;java&quot; style=&quot;background-color: #f8f8f8; color: #383a42; text-align: start;&quot; data-ke-type=&quot;codeblock&quot; data-ke-language=&quot;java&quot;&gt;&lt;code&gt;class TreeNode {
    int val;
    TreeNode left;
    TreeNode right;

    TreeNode() {}
    
    TreeNode(int val) {
        this.val = val;
    }

    TreeNode(int val, TreeNode left, TreeNode right) {
        this.val = val;
        this.left = left;
        this.right = right;
    }
}&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;ex. root = [3, 9, 20, null, null, 15, 7]&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;-&amp;gt; 가장 긴 경로: 3 -&amp;gt; 20 -&amp;gt; 15 / 3 -&amp;gt; 20 -&amp;gt; 7 =&amp;gt; 3개&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;현재 노드 깊이 = 1 + max(왼쪽 깊이, 오른쪽 깊이)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;root가 null이면 깊이 0&amp;nbsp;&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style3&quot; /&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;코드&lt;/h3&gt;
&lt;pre id=&quot;code_1772446795533&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;class Solution {
    public int maxDepth(TreeNode root) {
        if (root == null) return 0;

        int lt = maxDepth(root.left);
        int rt = maxDepth(root.right);

        return 1 + Math.max(lt, rt);
    }
}&lt;/code&gt;&lt;/pre&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style6&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;872 - Leaf-Similar Trees&lt;/h2&gt;
&lt;p&gt;&lt;figure class=&quot;imagegridblock&quot;&gt;
  &lt;div class=&quot;image-container&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/mjiik/dJMcagki0vO/lQQkfKpQGuBVmb6fxUBbn1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/mjiik/dJMcagki0vO/lQQkfKpQGuBVmb6fxUBbn1/img.png&quot; data-is-animation=&quot;false&quot; data-origin-width=&quot;932&quot; data-origin-height=&quot;1372&quot; data-filename=&quot;스크린샷 2026-03-02 오후 7.22.53.png&quot; style=&quot;width: 48.4239%; margin-right: 10px;&quot; data-widthpercent=&quot;48.99&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/mjiik/dJMcagki0vO/lQQkfKpQGuBVmb6fxUBbn1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fmjiik%2FdJMcagki0vO%2FlQQkfKpQGuBVmb6fxUBbn1%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;932&quot; height=&quot;1372&quot;/&gt;&lt;/span&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cnryQI/dJMcafeGgt7/2MFXqU8mJNeutOFmmc6qa0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cnryQI/dJMcafeGgt7/2MFXqU8mJNeutOFmmc6qa0/img.png&quot; data-is-animation=&quot;false&quot; data-origin-width=&quot;942&quot; data-origin-height=&quot;1332&quot; data-filename=&quot;스크린샷 2026-03-02 오후 7.23.08.png&quot; style=&quot;width: 50.4133%;&quot; data-widthpercent=&quot;51.01&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cnryQI/dJMcafeGgt7/2MFXqU8mJNeutOFmmc6qa0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcnryQI%2FdJMcafeGgt7%2F2MFXqU8mJNeutOFmmc6qa0%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;942&quot; height=&quot;1332&quot;/&gt;&lt;/span&gt;&lt;/div&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style3&quot; /&gt;
&lt;h3 style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size23&quot;&gt;풀이&lt;/h3&gt;
&lt;pre id=&quot;code_1772449165086&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;List&amp;lt;Integer&amp;gt; leaves1 = new ArrayList&amp;lt;&amp;gt;();
List&amp;lt;Integer&amp;gt; leaves2 = new ArrayList&amp;lt;&amp;gt;();

dfs(root1, leaves1);
dfs(root2, leaves2);&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;u&gt;&lt;b&gt;리프 노드&lt;/b&gt;&lt;/u&gt;만 왼쪽부터 순서대로 모아서 비교&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;리프(leaf): 자식이 없는 노드&amp;nbsp;&lt;/p&gt;
&lt;pre id=&quot;code_1772448579225&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;node.left == null &amp;amp;&amp;amp; node.right == null&lt;/code&gt;&lt;/pre&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-style=&quot;style3&quot; data-ke-type=&quot;horizontalRule&quot; /&gt;
&lt;h3 style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size23&quot;&gt;코드&lt;/h3&gt;
&lt;pre id=&quot;code_1772446937939&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;class Solution {
    void dfs(TreeNode node, List&amp;lt;Integer&amp;gt; leaves) {
        if (node == null) return;

        if (node.left == null &amp;amp;&amp;amp; node.right == null) {
            leaves.add(node.val);
            return;
        }

        dfs(node.left, leaves);
        dfs(node.right, leaves);
    }

    public boolean leafSimilar(TreeNode root1, TreeNode root2) {
        List&amp;lt;Integer&amp;gt; leaves1 = new ArrayList&amp;lt;&amp;gt;();
        List&amp;lt;Integer&amp;gt; leaves2 = new ArrayList&amp;lt;&amp;gt;();

        dfs(root1, leaves1);
        dfs(root2, leaves2);

        return leaves1.equals(leaves2);
    }
}&lt;/code&gt;&lt;/pre&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-style=&quot;style6&quot; data-ke-type=&quot;horizontalRule&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;1448 - Count Good Nodes in Binary Tree&lt;/h2&gt;
&lt;p&gt;&lt;figure class=&quot;imagegridblock&quot;&gt;
  &lt;div class=&quot;image-container&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bFguvn/dJMcacoGsSZ/lY1y7DvZkOegoSCau3gq00/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bFguvn/dJMcacoGsSZ/lY1y7DvZkOegoSCau3gq00/img.png&quot; data-is-animation=&quot;false&quot; data-origin-width=&quot;1068&quot; data-origin-height=&quot;1282&quot; data-filename=&quot;스크린샷 2026-03-02 오후 7.30.13.png&quot; style=&quot;width: 47.1553%; margin-right: 10px;&quot; data-widthpercent=&quot;47.71&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bFguvn/dJMcacoGsSZ/lY1y7DvZkOegoSCau3gq00/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbFguvn%2FdJMcacoGsSZ%2FlY1y7DvZkOegoSCau3gq00%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;1068&quot; height=&quot;1282&quot;/&gt;&lt;/span&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bzKzTq/dJMcahDvt8h/QSs2U5vjC17wIkYjLWVXyK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bzKzTq/dJMcahDvt8h/QSs2U5vjC17wIkYjLWVXyK/img.png&quot; data-is-animation=&quot;false&quot; data-origin-width=&quot;1050&quot; data-origin-height=&quot;1150&quot; data-filename=&quot;스크린샷 2026-03-02 오후 7.29.59.png&quot; style=&quot;width: 51.6819%;&quot; data-widthpercent=&quot;52.29&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bzKzTq/dJMcahDvt8h/QSs2U5vjC17wIkYjLWVXyK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbzKzTq%2FdJMcahDvt8h%2FQSs2U5vjC17wIkYjLWVXyK%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;1050&quot; height=&quot;1150&quot;/&gt;&lt;/span&gt;&lt;/div&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style3&quot; /&gt;
&lt;h3 style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size23&quot;&gt;풀이&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;good node: root -&amp;gt; x 경로에서 x보다 큰 값이 없어야 함&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;=&amp;gt; x &amp;gt;= 경로에서 최대값&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;-&amp;gt; 지금까지 경로에서 최대값 같이 전달해서 현재 노드 값과 비교, 최대값 갱신&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-style=&quot;style3&quot; data-ke-type=&quot;horizontalRule&quot; /&gt;
&lt;h3 style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size23&quot;&gt;코드&lt;/h3&gt;
&lt;pre id=&quot;code_1772447375476&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;class Solution {
    int dfs(TreeNode node, int max) {
        if (node == null) return 0;

        int cnt = 0;
        if (node.val &amp;gt;= max) cnt = 1;

        max = Math.max(max, node.val);

        cnt += dfs(node.left, max);
        cnt += dfs(node.right, max);
        
        return cnt;
    }

    public int goodNodes(TreeNode root) {
        return dfs(root, root.val);
    }
}&lt;/code&gt;&lt;/pre&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-style=&quot;style6&quot; data-ke-type=&quot;horizontalRule&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;출처&lt;/h2&gt;
&lt;figure id=&quot;og_1772446782818&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;LeetCode 75 - Study Plan - LeetCode&quot; data-og-description=&quot;Ace Coding Interview with 75 Qs&quot; data-og-host=&quot;leetcode.com&quot; data-og-source-url=&quot;https://leetcode.com/studyplan/leetcode-75/&quot; data-og-url=&quot;https://leetcode.com/studyplan/leetcode-75/&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/rI8Y4/dJMb87f3Wpb/JeJzmEA9NZl0ojPjO7PwoK/img.png?width=720&amp;amp;height=720&amp;amp;face=0_0_720_720,https://scrap.kakaocdn.net/dn/dnQN8s/dJMb88eX9Bg/fFtWk2ENUGFJgEhgPvSb01/img.png?width=720&amp;amp;height=720&amp;amp;face=0_0_720_720,https://scrap.kakaocdn.net/dn/bl7sgd/dJMb85WQM1t/25fTb0F1mndFwvtTbiseK1/img.png?width=360&amp;amp;height=360&amp;amp;face=0_0_360_360&quot;&gt;&lt;a href=&quot;https://leetcode.com/studyplan/leetcode-75/&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://leetcode.com/studyplan/leetcode-75/&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/rI8Y4/dJMb87f3Wpb/JeJzmEA9NZl0ojPjO7PwoK/img.png?width=720&amp;amp;height=720&amp;amp;face=0_0_720_720,https://scrap.kakaocdn.net/dn/dnQN8s/dJMb88eX9Bg/fFtWk2ENUGFJgEhgPvSb01/img.png?width=720&amp;amp;height=720&amp;amp;face=0_0_720_720,https://scrap.kakaocdn.net/dn/bl7sgd/dJMb85WQM1t/25fTb0F1mndFwvtTbiseK1/img.png?width=360&amp;amp;height=360&amp;amp;face=0_0_360_360');&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;LeetCode 75 - Study Plan - LeetCode&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;Ace Coding Interview with 75 Qs&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;leetcode.com&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;</description>
      <category>✏️/LeetCode</category>
      <author>aeongg</author>
      <guid isPermaLink="true">https://debug.tistory.com/549</guid>
      <comments>https://debug.tistory.com/549#entry549comment</comments>
      <pubDate>Mon, 2 Mar 2026 19:23:18 +0900</pubDate>
    </item>
    <item>
      <title>[LeetCode 75/Linked List] 2095 - Delete the Middle Node of a Linked List / 328 - Odd Even Linked List / 206 - Reverse Linked List / 2130 - Maximum Twin Sum of a Linked List (Java)</title>
      <link>https://debug.tistory.com/548</link>
      <description>&lt;h2 data-ke-size=&quot;size26&quot;&gt;2095 - Delete the Middle Node of a Linked List&lt;/h2&gt;
&lt;p&gt;&lt;figure class=&quot;imagegridblock&quot;&gt;
  &lt;div class=&quot;image-container&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cGlA2H/dJMcabwwBrZ/xmk4Ke1HAKB4JHJqIaddD0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cGlA2H/dJMcabwwBrZ/xmk4Ke1HAKB4JHJqIaddD0/img.png&quot; data-is-animation=&quot;false&quot; data-origin-width=&quot;1024&quot; data-origin-height=&quot;1326&quot; data-filename=&quot;스크린샷 2026-03-01 오후 8.06.28.png&quot; style=&quot;width: 49.6639%; margin-right: 10px;&quot; data-widthpercent=&quot;50.25&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cGlA2H/dJMcabwwBrZ/xmk4Ke1HAKB4JHJqIaddD0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcGlA2H%2FdJMcabwwBrZ%2Fxmk4Ke1HAKB4JHJqIaddD0%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;1024&quot; height=&quot;1326&quot;/&gt;&lt;/span&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/WS6JD/dJMcadA3eAx/qgVVxGLKBOGgbkY4cupTEK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/WS6JD/dJMcadA3eAx/qgVVxGLKBOGgbkY4cupTEK/img.png&quot; data-filename=&quot;스크린샷 2026-03-01 오후 8.06.13.png&quot; data-origin-height=&quot;1334&quot; data-origin-width=&quot;1020&quot; data-is-animation=&quot;false&quot; style=&quot;width: 49.1733%;&quot; data-widthpercent=&quot;49.75&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/WS6JD/dJMcadA3eAx/qgVVxGLKBOGgbkY4cupTEK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FWS6JD%2FdJMcadA3eAx%2FqgVVxGLKBOGgbkY4cupTEK%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;1020&quot; height=&quot;1334&quot;/&gt;&lt;/span&gt;&lt;/div&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-style=&quot;style3&quot; data-ke-type=&quot;horizontalRule&quot; /&gt;
&lt;h3 style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size23&quot;&gt;풀이&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;길이 n인 리스트에서 인덱스 &amp;lfloor;n/2&amp;rfloor; (0-based) 노드 삭제&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;ex. [1, 3, 4, 7, 1, 2, 6] -&amp;gt; n = 7, &amp;lfloor;7/2&amp;rfloor; = 3 =&amp;gt; 7 삭제&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;`head.next == null`: 노드 1개 == middle -&amp;gt; 삭제 =&amp;gt; null&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;gt; `fast`: 2칸씩 이동 / `slow`: 1칸씩 이동&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;`fast`가 끝에 도달하면 `slow`는 middle에 있음&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;(`prev`: `slow`의 이전 노드 저장)&lt;/p&gt;
&lt;pre id=&quot;code_1772449842273&quot; class=&quot;java&quot; style=&quot;background-color: #f8f8f8; color: #383a42; text-align: start;&quot; data-ke-type=&quot;codeblock&quot; data-ke-language=&quot;java&quot;&gt;&lt;code&gt;ListNode slow = head;
ListNode fast = head;
ListNode prev = null;

while (fast != null &amp;amp;&amp;amp; fast.next != null) {
    prev = slow;
    slow = slow.next;
    fast = fast.next.next;
}

prev.next = slow.next;&lt;/code&gt;&lt;/pre&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-style=&quot;style3&quot; data-ke-type=&quot;horizontalRule&quot; /&gt;
&lt;h3 style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size23&quot;&gt;코드&lt;/h3&gt;
&lt;pre id=&quot;code_1772363207930&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;class Solution {
    public ListNode deleteMiddle(ListNode head) {
        if (head.next == null) return null;

        ListNode slow = head;
        ListNode fast = head;
        ListNode prev = null;

        while (fast != null &amp;amp;&amp;amp; fast.next != null) {
            prev = slow;
            slow = slow.next;
            fast = fast.next.next;
        }

        prev.next = slow.next;

        return head;
    }
}&lt;/code&gt;&lt;/pre&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style6&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;328 - Odd Even Linked List&lt;/h2&gt;
&lt;p&gt;&lt;figure class=&quot;imagegridblock&quot;&gt;
  &lt;div class=&quot;image-container&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/ltbPK/dJMcahjfFvQ/xMC0IksQFo12DPdGKt7DSk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/ltbPK/dJMcahjfFvQ/xMC0IksQFo12DPdGKt7DSk/img.png&quot; data-is-animation=&quot;false&quot; data-origin-width=&quot;1030&quot; data-origin-height=&quot;636&quot; data-filename=&quot;스크린샷 2026-03-01 오후 8.07.03.png&quot; style=&quot;width: 65.7416%; margin-right: 10px;&quot; data-widthpercent=&quot;66.52&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/ltbPK/dJMcahjfFvQ/xMC0IksQFo12DPdGKt7DSk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FltbPK%2FdJMcahjfFvQ%2FxMC0IksQFo12DPdGKt7DSk%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;1030&quot; height=&quot;636&quot;/&gt;&lt;/span&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/dhUOQv/dJMcabi1R0B/3bVk97p9KerGF4kK3uYYn1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/dhUOQv/dJMcabi1R0B/3bVk97p9KerGF4kK3uYYn1/img.png&quot; data-is-animation=&quot;false&quot; data-origin-width=&quot;1024&quot; data-origin-height=&quot;1256&quot; data-filename=&quot;스크린샷 2026-03-01 오후 8.07.13.png&quot; style=&quot;width: 33.0956%;&quot; data-widthpercent=&quot;33.48&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/dhUOQv/dJMcabi1R0B/3bVk97p9KerGF4kK3uYYn1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FdhUOQv%2FdJMcabi1R0B%2F3bVk97p9KerGF4kK3uYYn1%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;1024&quot; height=&quot;1256&quot;/&gt;&lt;/span&gt;&lt;/div&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-style=&quot;style3&quot; data-ke-type=&quot;horizontalRule&quot; /&gt;
&lt;h3 style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size23&quot;&gt;풀이&lt;/h3&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;`odd`: 홀수 체인 포인터 / `even`: 짝수 체인 포인터&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;(`evenHead`: 짝수 시작점 저장)&lt;/p&gt;
&lt;pre id=&quot;code_1772449973822&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;ListNode odd = head;
ListNode even = head.next;
ListNode evenHead = even;

while (even != null &amp;amp;&amp;amp; even.next != null) {
    odd.next = even.next;
    odd = odd.next;

    even.next = odd.next;
    even = even.next;
}

odd.next = evenHead;&lt;/code&gt;&lt;/pre&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-style=&quot;style3&quot; data-ke-type=&quot;horizontalRule&quot; /&gt;
&lt;h3 style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size23&quot;&gt;코드&lt;/h3&gt;
&lt;pre id=&quot;code_1772363248730&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;class Solution {
    public ListNode oddEvenList(ListNode head) {
        if (head == null || head.next == null) return head;

        ListNode odd = head;
        ListNode even = head.next;
        ListNode evenHead = even;

        while (even != null &amp;amp;&amp;amp; even.next != null) {
            odd.next = even.next;
            odd = odd.next;

            even.next = odd.next;
            even = even.next;
        }

        odd.next = evenHead;

        return head;
    }
}&lt;/code&gt;&lt;/pre&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-style=&quot;style6&quot; data-ke-type=&quot;horizontalRule&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;206 - Reverse Linked List&lt;/h2&gt;
&lt;p&gt;&lt;figure class=&quot;imagegridblock&quot;&gt;
  &lt;div class=&quot;image-container&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/Dk3qA/dJMcadOA3Ia/4pKl6BoSyVo8ejkFLxzs7k/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/Dk3qA/dJMcadOA3Ia/4pKl6BoSyVo8ejkFLxzs7k/img.png&quot; data-is-animation=&quot;false&quot; data-origin-width=&quot;1028&quot; data-origin-height=&quot;994&quot; data-filename=&quot;스크린샷 2026-03-01 오후 8.07.58.png&quot; style=&quot;width: 56.5625%; margin-right: 10px;&quot; data-widthpercent=&quot;57.23&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/Dk3qA/dJMcadOA3Ia/4pKl6BoSyVo8ejkFLxzs7k/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FDk3qA%2FdJMcadOA3Ia%2F4pKl6BoSyVo8ejkFLxzs7k%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;1028&quot; height=&quot;994&quot;/&gt;&lt;/span&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bfMYqC/dJMcah4A7Xx/sTkkZxgd0oiHU93HiIKqQK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bfMYqC/dJMcah4A7Xx/sTkkZxgd0oiHU93HiIKqQK/img.png&quot; data-is-animation=&quot;false&quot; data-origin-width=&quot;892&quot; data-origin-height=&quot;1154&quot; data-filename=&quot;스크린샷 2026-03-01 오후 8.07.48.png&quot; style=&quot;width: 42.2747%;&quot; data-widthpercent=&quot;42.77&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bfMYqC/dJMcah4A7Xx/sTkkZxgd0oiHU93HiIKqQK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbfMYqC%2FdJMcah4A7Xx%2FsTkkZxgd0oiHU93HiIKqQK%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;892&quot; height=&quot;1154&quot;/&gt;&lt;/span&gt;&lt;/div&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-style=&quot;style3&quot; data-ke-type=&quot;horizontalRule&quot; /&gt;
&lt;h3 style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size23&quot;&gt;풀이&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;포인터 방향 뒤집기&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;-&amp;gt; 현재 노드 방향 뒤집고 앞으로 한 칸 이동&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;=&amp;gt; `prev`: 이전 노드 / `cur`: 현재 노드 / `next`: 다음 노드&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-style=&quot;style3&quot; data-ke-type=&quot;horizontalRule&quot; /&gt;
&lt;h3 style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size23&quot;&gt;코드&lt;/h3&gt;
&lt;pre id=&quot;code_1772363259471&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;class Solution {
    public ListNode reverseList(ListNode head) {
        ListNode prev = null;
        ListNode cur = head;

        while (cur != null) {
            ListNode next = cur.next;
            cur.next = prev;         
            prev = cur;              
            cur = next;              
        }

        return prev; 
    }
}&lt;/code&gt;&lt;/pre&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-style=&quot;style6&quot; data-ke-type=&quot;horizontalRule&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;2130 - Maximum Twin Sum of a Linked List&lt;/h2&gt;
&lt;p&gt;&lt;figure class=&quot;imagegridblock&quot;&gt;
  &lt;div class=&quot;image-container&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/blulaM/dJMcagEDD3e/V7ObzgIO6WVUFnj6HSedB0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/blulaM/dJMcagEDD3e/V7ObzgIO6WVUFnj6HSedB0/img.png&quot; data-is-animation=&quot;false&quot; data-origin-width=&quot;1054&quot; data-origin-height=&quot;1348&quot; data-filename=&quot;스크린샷 2026-03-01 오후 8.09.12.png&quot; style=&quot;width: 51.7059%; margin-right: 10px;&quot; data-widthpercent=&quot;52.31&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/blulaM/dJMcagEDD3e/V7ObzgIO6WVUFnj6HSedB0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FblulaM%2FdJMcagEDD3e%2FV7ObzgIO6WVUFnj6HSedB0%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;1054&quot; height=&quot;1348&quot;/&gt;&lt;/span&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/c286ou/dJMcaiCpexY/yzAjfKkZAqbGAouXQwh97k/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/c286ou/dJMcaiCpexY/yzAjfKkZAqbGAouXQwh97k/img.png&quot; data-is-animation=&quot;false&quot; data-origin-width=&quot;1042&quot; data-origin-height=&quot;1462&quot; data-filename=&quot;스크린샷 2026-03-01 오후 8.08.56.png&quot; style=&quot;width: 47.1313%;&quot; data-widthpercent=&quot;47.69&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/c286ou/dJMcaiCpexY/yzAjfKkZAqbGAouXQwh97k/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fc286ou%2FdJMcaiCpexY%2FyzAjfKkZAqbGAouXQwh97k%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;1042&quot; height=&quot;1462&quot;/&gt;&lt;/span&gt;&lt;/div&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style3&quot; /&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;풀이&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;양쪽 끝끼리 짝 만들어서 가장 큰 합 구하기&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;=&amp;gt; i번째 노드 &amp;lt;-&amp;gt; (n - 1 - i)번째 노드&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;ex. [5, 3, 2, 1] -&amp;gt; (0 &amp;lt;-&amp;gt; 3) -&amp;gt; 5 + 1 = 6 / (1 &amp;lt;-&amp;gt; 2) -&amp;gt; 4 + 2 = 6 =&amp;gt; max = 6&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;중간 찾기&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;`fast`: 2칸씩 이동 / `slow`: 1칸씩 이동&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;`fast`가 끝에 도달하면 `slow`는 middle에 있음&lt;/p&gt;
&lt;pre id=&quot;code_1772450394092&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;ListNode slow = head;
ListNode fast = head;

while (fast != null &amp;amp;&amp;amp; fast.next != null) {
    slow = slow.next;
    fast = fast.next.next;
}&lt;/code&gt;&lt;/pre&gt;
&lt;pre id=&quot;code_1772450748397&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;5 &amp;rarr; 4 &amp;rarr; 2 &amp;rarr; 1
        &amp;uarr;
      slow&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;b&gt;뒤 절반 reverse&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;`slow`: 뒤 절반 시작점 -&amp;gt; `ListNode cur = slow`&lt;/p&gt;
&lt;pre id=&quot;code_1772450401825&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;ListNode prev = null;
ListNode cur = slow;

while (cur != null) {
    ListNode next = cur.next;
    cur.next = prev;
    prev = cur;
    cur = next;
}&lt;/code&gt;&lt;/pre&gt;
&lt;pre id=&quot;code_1772450757396&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;5 &amp;rarr; 4     1 &amp;rarr; 2
           &amp;uarr;
         prev&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;b&gt;twin sum 계산&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;`prev`: 뒤집한 리스트의 시작점 -&amp;gt; `ListNode second = prev`&lt;/p&gt;
&lt;pre id=&quot;code_1772450407166&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;int max = 0;
ListNode first = head;
ListNode second = prev;

while (second != null) {
    max = Math.max(max, first.val + second.val);
    first = first.next;
    second = second.next;
}&lt;/code&gt;&lt;/pre&gt;
&lt;pre id=&quot;code_1772450767560&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;first  = head  &amp;rarr; 5 &amp;rarr; 4
second = prev  &amp;rarr; 1 &amp;rarr; 2&lt;/code&gt;&lt;/pre&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style3&quot; /&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;코드&lt;/h3&gt;
&lt;pre id=&quot;code_1772450169654&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;class Solution {
    public int pairSum(ListNode head) {
        ListNode slow = head;
        ListNode fast = head;

        while (fast != null &amp;amp;&amp;amp; fast.next != null) {
            slow = slow.next;
            fast = fast.next.next;
        }

        ListNode prev = null;
        ListNode cur = slow;

        while (cur != null) {
            ListNode next = cur.next;
            cur.next = prev;
            prev = cur;
            cur = next;
        }

        int max = 0;
        ListNode first = head;
        ListNode second = prev;

        while (second != null) {
            max = Math.max(max, first.val + second.val);
            first = first.next;
            second = second.next;
        }

        return max;
    }
}&lt;/code&gt;&lt;/pre&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-style=&quot;style6&quot; data-ke-type=&quot;horizontalRule&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;출처&lt;/h2&gt;
&lt;figure id=&quot;og_1772363366354&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;LeetCode 75 - Study Plan - LeetCode&quot; data-og-description=&quot;Ace Coding Interview with 75 Qs&quot; data-og-host=&quot;leetcode.com&quot; data-og-source-url=&quot;https://leetcode.com/studyplan/leetcode-75/&quot; data-og-url=&quot;https://leetcode.com/studyplan/leetcode-75/&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/ntx8c/dJMb8UHMBDg/npQzDVp5IplaotThexiG20/img.png?width=720&amp;amp;height=720&amp;amp;face=0_0_720_720,https://scrap.kakaocdn.net/dn/bWKJwE/dJMb8WMm0Nr/ybP1YCkYJ4m73ZmqcQzVm1/img.png?width=720&amp;amp;height=720&amp;amp;face=0_0_720_720,https://scrap.kakaocdn.net/dn/ilArm/dJMb8WMm0Ns/RXKXZrfc33DBsBPt6WsGP0/img.png?width=360&amp;amp;height=360&amp;amp;face=0_0_360_360&quot;&gt;&lt;a href=&quot;https://leetcode.com/studyplan/leetcode-75/&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://leetcode.com/studyplan/leetcode-75/&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/ntx8c/dJMb8UHMBDg/npQzDVp5IplaotThexiG20/img.png?width=720&amp;amp;height=720&amp;amp;face=0_0_720_720,https://scrap.kakaocdn.net/dn/bWKJwE/dJMb8WMm0Nr/ybP1YCkYJ4m73ZmqcQzVm1/img.png?width=720&amp;amp;height=720&amp;amp;face=0_0_720_720,https://scrap.kakaocdn.net/dn/ilArm/dJMb8WMm0Ns/RXKXZrfc33DBsBPt6WsGP0/img.png?width=360&amp;amp;height=360&amp;amp;face=0_0_360_360');&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;LeetCode 75 - Study Plan - LeetCode&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;Ace Coding Interview with 75 Qs&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;leetcode.com&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;</description>
      <category>✏️/LeetCode</category>
      <author>aeongg</author>
      <guid isPermaLink="true">https://debug.tistory.com/548</guid>
      <comments>https://debug.tistory.com/548#entry548comment</comments>
      <pubDate>Sun, 1 Mar 2026 20:04:17 +0900</pubDate>
    </item>
    <item>
      <title>[LeetCode 75/Stack] 2390 - Removing Stars From a String / 735 - Asteroid Collision / 394 - Decode String (Java)</title>
      <link>https://debug.tistory.com/547</link>
      <description>&lt;h2 data-ke-size=&quot;size26&quot;&gt;2390&amp;nbsp;-&amp;nbsp;Removing&amp;nbsp;Stars&amp;nbsp;From&amp;nbsp;a&amp;nbsp;String&lt;/h2&gt;
&lt;p&gt;&lt;figure class=&quot;imagegridblock&quot;&gt;
  &lt;div class=&quot;image-container&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bArAQ8/dJMcacvsBDh/sPQP6L8aHh812wKku0Eoq1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bArAQ8/dJMcacvsBDh/sPQP6L8aHh812wKku0Eoq1/img.png&quot; data-is-animation=&quot;false&quot; data-origin-width=&quot;1136&quot; data-origin-height=&quot;822&quot; data-filename=&quot;스크린샷 2026-02-27 오후 10.23.56.png&quot; style=&quot;width: 57.3868%; margin-right: 10px;&quot; data-widthpercent=&quot;58.06&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bArAQ8/dJMcacvsBDh/sPQP6L8aHh812wKku0Eoq1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbArAQ8%2FdJMcacvsBDh%2FsPQP6L8aHh812wKku0Eoq1%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;1136&quot; height=&quot;822&quot;/&gt;&lt;/span&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cTRu4T/dJMcaibmRq3/fQmw7NbR6qCaZbh5kxSYz1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cTRu4T/dJMcaibmRq3/fQmw7NbR6qCaZbh5kxSYz1/img.png&quot; data-is-animation=&quot;false&quot; data-origin-width=&quot;1118&quot; data-origin-height=&quot;1120&quot; data-filename=&quot;스크린샷 2026-02-27 오후 10.22.49.png&quot; style=&quot;width: 41.4504%;&quot; data-widthpercent=&quot;41.94&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cTRu4T/dJMcaibmRq3/fQmw7NbR6qCaZbh5kxSYz1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcTRu4T%2FdJMcaibmRq3%2FfQmw7NbR6qCaZbh5kxSYz1%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;1118&quot; height=&quot;1120&quot;/&gt;&lt;/span&gt;&lt;/div&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style3&quot; /&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;풀이&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;*를 만나면 왼쪽에서 가장 가까운 문자 하나 삭제&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;-&amp;gt; 마지막에 들어온 문자(LIFO) 지움 =&amp;gt; 스택&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;일반 문자 -&amp;gt; 스택에 push&lt;/li&gt;
&lt;li&gt;* -&amp;gt; 스택에서 pop&lt;/li&gt;
&lt;/ul&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-style=&quot;style3&quot; data-ke-type=&quot;horizontalRule&quot; /&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;코드&lt;/h3&gt;
&lt;pre id=&quot;code_1772198660212&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;class Solution {
    public String removeStars(String s) {
        StringBuilder sb = new StringBuilder();
        Stack&amp;lt;Character&amp;gt; stack = new Stack&amp;lt;&amp;gt;();

        for (char c : s.toCharArray()) {
            if (c == '*') stack.pop();
            else stack.push(c);
        }

        for (char c : stack) sb.append(c);

        return sb.toString();
    }
}&lt;/code&gt;&lt;/pre&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style6&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;735 - Asteroid Collision&lt;/h2&gt;
&lt;p&gt;&lt;figure class=&quot;imagegridblock&quot;&gt;
  &lt;div class=&quot;image-container&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/EL8GF/dJMcaf6KT5T/l3JUZkGYFIVQhz1dSGWH1k/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/EL8GF/dJMcaf6KT5T/l3JUZkGYFIVQhz1dSGWH1k/img.png&quot; data-is-animation=&quot;false&quot; data-origin-width=&quot;1066&quot; data-origin-height=&quot;954&quot; data-filename=&quot;스크린샷 2026-02-27 오후 10.32.28.png&quot; style=&quot;width: 54.9861%; margin-right: 10px;&quot; data-widthpercent=&quot;55.63&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/EL8GF/dJMcaf6KT5T/l3JUZkGYFIVQhz1dSGWH1k/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FEL8GF%2FdJMcaf6KT5T%2Fl3JUZkGYFIVQhz1dSGWH1k%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;1066&quot; height=&quot;954&quot;/&gt;&lt;/span&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cZRo0c/dJMcaf6KT5k/hBsHdMMjY5iKS7rKWTMiS1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cZRo0c/dJMcaf6KT5k/hBsHdMMjY5iKS7rKWTMiS1/img.png&quot; data-is-animation=&quot;false&quot; data-origin-width=&quot;1064&quot; data-origin-height=&quot;1194&quot; data-filename=&quot;스크린샷 2026-02-27 오후 10.32.15.png&quot; style=&quot;width: 43.8512%;&quot; data-widthpercent=&quot;44.37&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cZRo0c/dJMcaf6KT5k/hBsHdMMjY5iKS7rKWTMiS1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcZRo0c%2FdJMcaf6KT5k%2FhBsHdMMjY5iKS7rKWTMiS1%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;1064&quot; height=&quot;1194&quot;/&gt;&lt;/span&gt;&lt;/div&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-style=&quot;style3&quot; data-ke-type=&quot;horizontalRule&quot; /&gt;
&lt;h3 style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size23&quot;&gt;풀이&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;부호: 방향 (양수 - 오른쪽/음수 - 왼쪽)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;두 소행성 충돌하면 작은 소행성 폭발/ 크기 같으면 둘 다 폭발/ 같은 방향으로 움직이는 소행성 충돌 X&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;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;충돌 조건: `stack`이 비어 있지 않고, 현재 운석이 왼쪽(-), 스택 top이 오른쪽(+)&amp;nbsp;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;top이 더 작음: 스택에서 pop&lt;/li&gt;
&lt;li&gt;같은 크기 -&amp;gt; 둘 다 폭발&lt;/li&gt;
&lt;li&gt;top이 더 큼 -&amp;gt; a만 파괴, 스택 유지&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;`destroyed`: 현재 운석이 살아남았는지
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;충돌에서 살아남았거나 충돌 없었으면 push&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;pre id=&quot;code_1772367186784&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;else if (c == '[') {
    cntStack.push(k);
    stringStack.push(cur);

    cur = new StringBuilder();
    k = 0;
} else if (c == ']') {
    int repeat = cntStack.pop();
    StringBuilder prev = stringStack.pop();
    for (int i = 0; i &amp;lt; repeat; i++) {
        prev.append(cur);
    }
    cur = prev;
} else cur.append(c);&lt;/code&gt;&lt;/pre&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style3&quot; /&gt;
&lt;h3 style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size23&quot;&gt;코드&lt;/h3&gt;
&lt;pre id=&quot;code_1772199060137&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;class Solution {
    public int[] asteroidCollision(int[] asteroids) {
        Stack&amp;lt;Integer&amp;gt; stack = new Stack&amp;lt;&amp;gt;();

        for (int a : asteroids) {
            boolean destroyed = false;

            while (!stack.isEmpty() &amp;amp;&amp;amp; a &amp;lt; 0 &amp;amp;&amp;amp; stack.peek() &amp;gt; 0) {
                if (stack.peek() &amp;lt; -a) stack.pop();
                else if (stack.peek() == -a) {
                    stack.pop();
                    destroyed = true;
                    break;
                } else {
                    destroyed = true;
                    break;
                }
            }

            if (!destroyed) stack.push(a);
        }

        int n = stack.size();
        int[] result = new int[n];
        for (int i = n - 1; i &amp;gt;= 0; i--) {
            result[i] = stack.pop();
        }

        return result;
    }
}&lt;/code&gt;&lt;/pre&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-style=&quot;style6&quot; data-ke-type=&quot;horizontalRule&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;394&amp;nbsp;-&amp;nbsp;Decode&amp;nbsp;String&lt;/h2&gt;
&lt;p&gt;&lt;figure class=&quot;imagegridblock&quot;&gt;
  &lt;div class=&quot;image-container&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/Z773G/dJMcagLn4rG/BY2RkcYhStgYgV10mIYit0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/Z773G/dJMcagLn4rG/BY2RkcYhStgYgV10mIYit0/img.png&quot; data-is-animation=&quot;false&quot; data-origin-width=&quot;1134&quot; data-origin-height=&quot;696&quot; data-filename=&quot;스크린샷 2026-02-27 오후 10.36.29.png&quot; style=&quot;width: 60.0471%; margin-right: 10px;&quot; data-widthpercent=&quot;60.75&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/Z773G/dJMcagLn4rG/BY2RkcYhStgYgV10mIYit0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FZ773G%2FdJMcagLn4rG%2FBY2RkcYhStgYgV10mIYit0%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;1134&quot; height=&quot;696&quot;/&gt;&lt;/span&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/Fpf53/dJMcaioTHJG/SsY1cKq4FwmJOFakrqCBP1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/Fpf53/dJMcaioTHJG/SsY1cKq4FwmJOFakrqCBP1/img.png&quot; data-is-animation=&quot;false&quot; data-origin-width=&quot;1042&quot; data-origin-height=&quot;990&quot; data-filename=&quot;스크린샷 2026-02-27 오후 10.36.38.png&quot; style=&quot;width: 38.7901%;&quot; data-widthpercent=&quot;39.25&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/Fpf53/dJMcaioTHJG/SsY1cKq4FwmJOFakrqCBP1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FFpf53%2FdJMcaioTHJG%2FSsY1cKq4FwmJOFakrqCBP1%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;1042&quot; height=&quot;990&quot;/&gt;&lt;/span&gt;&lt;/div&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-style=&quot;style3&quot; data-ke-type=&quot;horizontalRule&quot; /&gt;
&lt;h3 style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size23&quot;&gt;풀이&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;ex. 3[a2[c]] -&amp;gt; a2[c] = acc -&amp;gt; 3[acc] = accaccacc&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;=&amp;gt; 중첩 구조로 닫는 괄호 ] 만날 때마다 계산&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;-&amp;gt; Stack 2개 사용 (숫자 스택: 반복 횟수 저장 / 문자열 스택: 이전까지 문자열 저장)&lt;/p&gt;
&lt;pre id=&quot;code_1772366695076&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;Stack&amp;lt;Integer&amp;gt; cntStack = new Stack&amp;lt;&amp;gt;();
Stack&amp;lt;StringBuilder&amp;gt; stringStack = new Stack&amp;lt;&amp;gt;();&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;pre id=&quot;code_1772366730953&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;if (Character.isDigit(c)) {
    k = k * 10 + (c - '0');  
}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;'[' 만났을 때
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;현재 반복 숫자 저장&lt;/li&gt;
&lt;li&gt;현재까지 만든 문자열 저장&lt;/li&gt;
&lt;li&gt;새로운 내부 문자열 시작&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;']' 만났을 때 -&amp;gt; 이전 상태 복원
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;현재 문자열 `repeat`(`cntStack.pop()`)만큼 붙여서 이전 문자열 뒤에 연결&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;pre id=&quot;code_1772367213065&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;else if (c == '[') {
    cntStack.push(k);
    stringStack.push(cur);

    cur = new StringBuilder();
    k = 0;
} else if (c == ']') {
    int repeat = cntStack.pop();
    StringBuilder prev = stringStack.pop();
    for (int i = 0; i &amp;lt; repeat; i++) {
        prev.append(cur);
    }
    cur = prev;
} else cur.append(c);&lt;/code&gt;&lt;/pre&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style3&quot; /&gt;
&lt;h3 style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size23&quot;&gt;코드&lt;/h3&gt;
&lt;pre id=&quot;code_1772199345742&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;class Solution {
    public String decodeString(String s) {
        Stack&amp;lt;Integer&amp;gt; cntStack = new Stack&amp;lt;&amp;gt;();
        Stack&amp;lt;StringBuilder&amp;gt; stringStack = new Stack&amp;lt;&amp;gt;();
        
        StringBuilder cur = new StringBuilder();
        int k = 0;
        
        for (char c : s.toCharArray()) {
            if (Character.isDigit(c)) {
                k = k * 10 + (c - '0');  
            } else if (c == '[') {
                cntStack.push(k);
                stringStack.push(cur);
                
                cur = new StringBuilder();
                k = 0;
            } else if (c == ']') {
                int repeat = cntStack.pop();
                StringBuilder prev = stringStack.pop();
                for (int i = 0; i &amp;lt; repeat; i++) {
                    prev.append(cur);
                }
                cur = prev;
            } else cur.append(c);
        }
        
        return cur.toString();
    }
}&lt;/code&gt;&lt;/pre&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-style=&quot;style6&quot; data-ke-type=&quot;horizontalRule&quot; /&gt;
&lt;h2 style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size26&quot;&gt;출처&lt;/h2&gt;
&lt;figure id=&quot;og_1772363400971&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;LeetCode 75 - Study Plan - LeetCode&quot; data-og-description=&quot;Ace Coding Interview with 75 Qs&quot; data-og-host=&quot;leetcode.com&quot; data-og-source-url=&quot;https://leetcode.com/studyplan/leetcode-75/&quot; data-og-url=&quot;https://leetcode.com/studyplan/leetcode-75/&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/ntx8c/dJMb8UHMBDg/npQzDVp5IplaotThexiG20/img.png?width=720&amp;amp;height=720&amp;amp;face=0_0_720_720,https://scrap.kakaocdn.net/dn/bWKJwE/dJMb8WMm0Nr/ybP1YCkYJ4m73ZmqcQzVm1/img.png?width=720&amp;amp;height=720&amp;amp;face=0_0_720_720,https://scrap.kakaocdn.net/dn/ilArm/dJMb8WMm0Ns/RXKXZrfc33DBsBPt6WsGP0/img.png?width=360&amp;amp;height=360&amp;amp;face=0_0_360_360&quot;&gt;&lt;a href=&quot;https://leetcode.com/studyplan/leetcode-75/&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://leetcode.com/studyplan/leetcode-75/&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/ntx8c/dJMb8UHMBDg/npQzDVp5IplaotThexiG20/img.png?width=720&amp;amp;height=720&amp;amp;face=0_0_720_720,https://scrap.kakaocdn.net/dn/bWKJwE/dJMb8WMm0Nr/ybP1YCkYJ4m73ZmqcQzVm1/img.png?width=720&amp;amp;height=720&amp;amp;face=0_0_720_720,https://scrap.kakaocdn.net/dn/ilArm/dJMb8WMm0Ns/RXKXZrfc33DBsBPt6WsGP0/img.png?width=360&amp;amp;height=360&amp;amp;face=0_0_360_360');&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;LeetCode 75 - Study Plan - LeetCode&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;Ace Coding Interview with 75 Qs&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;leetcode.com&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;</description>
      <category>✏️/LeetCode</category>
      <author>aeongg</author>
      <guid isPermaLink="true">https://debug.tistory.com/547</guid>
      <comments>https://debug.tistory.com/547#entry547comment</comments>
      <pubDate>Fri, 27 Feb 2026 22:32:40 +0900</pubDate>
    </item>
    <item>
      <title>[LeetCode 75/Queue] 993 - Number of Recent Calls / 649 - Dota2 Senate (Java)</title>
      <link>https://debug.tistory.com/546</link>
      <description>&lt;h2 data-ke-size=&quot;size26&quot;&gt;993 - Number of Recent Calls&lt;/h2&gt;
&lt;p&gt;&lt;figure class=&quot;imagegridblock&quot;&gt;
  &lt;div class=&quot;image-container&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/dHo5N7/dJMcadHPGqn/EWdgCj9jDEvKRAgHFyoRP1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/dHo5N7/dJMcadHPGqn/EWdgCj9jDEvKRAgHFyoRP1/img.png&quot; data-is-animation=&quot;false&quot; data-origin-width=&quot;1132&quot; data-origin-height=&quot;758&quot; data-filename=&quot;스크린샷 2026-02-27 오후 6.44.39.png&quot; style=&quot;width: 59.2402%; margin-right: 10px;&quot; data-widthpercent=&quot;59.94&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/dHo5N7/dJMcadHPGqn/EWdgCj9jDEvKRAgHFyoRP1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FdHo5N7%2FdJMcadHPGqn%2FEWdgCj9jDEvKRAgHFyoRP1%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;1132&quot; height=&quot;758&quot;/&gt;&lt;/span&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/uZqfn/dJMcagLnZt3/7xsesEzrUbI4VN3o3NihWk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/uZqfn/dJMcagLnZt3/7xsesEzrUbI4VN3o3NihWk/img.png&quot; data-is-animation=&quot;false&quot; data-origin-width=&quot;1118&quot; data-origin-height=&quot;1120&quot; data-filename=&quot;스크린샷 2026-02-27 오후 6.44.54.png&quot; data-widthpercent=&quot;40.06&quot; style=&quot;width: 39.597%;&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/uZqfn/dJMcagLnZt3/7xsesEzrUbI4VN3o3NihWk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FuZqfn%2FdJMcagLnZt3%2F7xsesEzrUbI4VN3o3NihWk%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;1118&quot; height=&quot;1120&quot;/&gt;&lt;/span&gt;&lt;/div&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-style=&quot;style3&quot; data-ke-type=&quot;horizontalRule&quot; /&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;풀이&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;`RecentCounter()`: 최근 요청 수 0으로 초기화&lt;/li&gt;
&lt;li&gt;`int ping(int t)`: 시간 t에 새로운 요청 추가, 지난 3000밀리초 동안 발생한 요청 수(새로운 요청 포함) 반환&lt;br /&gt;/ [t - 3000, t ] 범위 내에서 발생한 요청 수 반환&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;=&amp;gt; 시간 t 계속 증가 -&amp;gt; 최근 3000ms 안에 있는 요청만 유지&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;=&amp;gt; Sliding Window + Queue (새로운 요청 뒤에 추가, 오래된 요청 앞에서 제거: FIFO)&lt;/p&gt;
&lt;pre id=&quot;code_1772367507380&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;Queue&amp;lt;Integer&amp;gt; q;&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;b&gt;생성자&lt;/b&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1772367523452&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;public RecentCounter() {
    q = new LinkedList&amp;lt;&amp;gt;();
}&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;`ping(int t)`: t 기준으로 지난 3000ms 안에 있는 요청 수 반환&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;q.offer(t)&lt;/li&gt;
&lt;li&gt;[t - 3000, t] -&amp;gt; `q.peek() &amp;lt; t - 3000` =&amp;gt; 범위 밖 -&amp;gt; 제거 =&amp;gt; 오래된 요청 제거: `q.poll()`&lt;/li&gt;
&lt;/ul&gt;
&lt;pre id=&quot;code_1772367949235&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;public int ping(int t) {
    q.offer(t);

    while (!q.isEmpty() &amp;amp;&amp;amp; q.peek() &amp;lt; t - 3000) {
        q.poll();
    }

    return q.size();
}&lt;/code&gt;&lt;/pre&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;ex. ping(1)
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;범위: [-2999, 1]&lt;/li&gt;
&lt;li&gt;요청: [&lt;u&gt;1&lt;/u&gt;] =&amp;gt; 1개&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;ex. ping(100)
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;범위: [-2900, 100]&lt;/li&gt;
&lt;li&gt;요청: [&lt;u&gt;1, 100&lt;/u&gt;] =&amp;gt; 2개&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;ex. ping(3001)
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;범위: [1, 3001]&lt;/li&gt;
&lt;li&gt;요청: [&lt;u&gt;1, 100, 3001&lt;/u&gt;] =&amp;gt; 3개&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;ex. ping(3002)
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;범위: [2, 3002]&lt;/li&gt;
&lt;li&gt;요청: [1, &lt;u&gt;100, 3001, 3002&lt;/u&gt;] =&amp;gt; 3개&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style3&quot; /&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;코드&lt;/h3&gt;
&lt;pre id=&quot;code_1772185545382&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;class RecentCounter {
    Queue&amp;lt;Integer&amp;gt; q;

    public RecentCounter() {
        q = new LinkedList&amp;lt;&amp;gt;();
    }
    
    public int ping(int t) {
        q.offer(t);

        while (!q.isEmpty() &amp;amp;&amp;amp; q.peek() &amp;lt; t - 3000) {
            q.poll();
        }

        return q.size();
    }
}&lt;/code&gt;&lt;/pre&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style6&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;649 - Dota2 Senate&lt;/h2&gt;
&lt;p&gt;&lt;figure class=&quot;imagegridblock&quot;&gt;
  &lt;div class=&quot;image-container&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/c4Akmg/dJMcagR9a6I/NNVWyfuJxSGxSi5eZ2Zuq0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/c4Akmg/dJMcagR9a6I/NNVWyfuJxSGxSi5eZ2Zuq0/img.png&quot; data-is-animation=&quot;false&quot; data-origin-width=&quot;1072&quot; data-origin-height=&quot;1194&quot; data-filename=&quot;스크린샷 2026-02-27 오후 6.49.48.png&quot; style=&quot;width: 54.8767%; margin-right: 10px;&quot; data-widthpercent=&quot;55.52&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/c4Akmg/dJMcagR9a6I/NNVWyfuJxSGxSi5eZ2Zuq0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fc4Akmg%2FdJMcagR9a6I%2FNNVWyfuJxSGxSi5eZ2Zuq0%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;1072&quot; height=&quot;1194&quot;/&gt;&lt;/span&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/boxuEB/dJMcaiPT4u5/tDNTJnDCUP2ptvmPZLeNy1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/boxuEB/dJMcaiPT4u5/tDNTJnDCUP2ptvmPZLeNy1/img.png&quot; data-is-animation=&quot;false&quot; data-origin-width=&quot;1040&quot; data-origin-height=&quot;1446&quot; data-filename=&quot;스크린샷 2026-02-27 오후 6.49.26.png&quot; style=&quot;width: 43.9605%;&quot; data-widthpercent=&quot;44.48&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/boxuEB/dJMcaiPT4u5/tDNTJnDCUP2ptvmPZLeNy1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FboxuEB%2FdJMcaiPT4u5%2FtDNTJnDCUP2ptvmPZLeNy1%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;1040&quot; height=&quot;1446&quot;/&gt;&lt;/span&gt;&lt;/div&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style3&quot; /&gt;
&lt;h3 style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size23&quot;&gt;풀이&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Doat2 세계에 Radiant/Dire 두 진영 존재, 두 가지 권한 중 하나 행사&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;R - 상원의원 한 명 권리 박탈: 이번 및 이후&lt;/li&gt;
&lt;li&gt;D - 승리 선언: 투표권 가진 상원의원 모두 같은 당 소속 -&amp;gt; 승리 선언&amp;nbsp;&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;=&amp;gt; 각 사람은 자기 턴이 오면 상대 한 명 제거&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;-&amp;gt; 누가 더 빨리 등장하는지 중요 =&amp;gt; 위치(index) 저장&lt;/p&gt;
&lt;pre id=&quot;code_1772368200105&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;Queue&amp;lt;Integer&amp;gt; radiant = new LinkedList&amp;lt;&amp;gt;();
Queue&amp;lt;Integer&amp;gt; dire = new LinkedList&amp;lt;&amp;gt;();

for (int i = 0; i &amp;lt; n; i++) {
    if (senate.charAt(i) == 'R') radiant.offer(i);
    else dire.offer(i);
}&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;현재 가장 앞에 있는 R과 D 대결&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;rIdx &amp;lt; dIdx: R이 먼저 등장 = R이 먼저 행동 -&amp;gt; D 제거, R 남음
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;`radiant.offer(rIdx + n)`: 다음 라운드의 맨 뒤에서 다시 등장 -&amp;gt; 라운드 순환 구조&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;pre id=&quot;code_1772368231353&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;while (!radiant.isEmpty() &amp;amp;&amp;amp; !dire.isEmpty()) {
    int rIdx = radiant.poll();
    int dIdx = dire.poll();

    if (rIdx &amp;lt; dIdx) radiant.offer(rIdx + n);
    else dire.offer(dIdx + n);
}&lt;/code&gt;&lt;/pre&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-style=&quot;style3&quot; data-ke-type=&quot;horizontalRule&quot; /&gt;
&lt;h3 style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size23&quot;&gt;코드&lt;/h3&gt;
&lt;pre id=&quot;code_1772185732452&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;class Solution {
    public String predictPartyVictory(String senate) {
        int n = senate.length();

        Queue&amp;lt;Integer&amp;gt; radiant = new LinkedList&amp;lt;&amp;gt;();
        Queue&amp;lt;Integer&amp;gt; dire = new LinkedList&amp;lt;&amp;gt;();

        for (int i = 0; i &amp;lt; n; i++) {
            if (senate.charAt(i) == 'R') radiant.offer(i);
            else dire.offer(i);
        }

        while (!radiant.isEmpty() &amp;amp;&amp;amp; !dire.isEmpty()) {
            int rIdx = radiant.poll();
            int dIdx = dire.poll();

            if (rIdx &amp;lt; dIdx) radiant.offer(rIdx + n);
            else dire.offer(dIdx + n);
        }

        return radiant.isEmpty() ? &quot;Dire&quot; : &quot;Radiant&quot;;
    }
}&lt;/code&gt;&lt;/pre&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-style=&quot;style6&quot; data-ke-type=&quot;horizontalRule&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;출처&lt;/h2&gt;
&lt;figure id=&quot;og_1772363386255&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;LeetCode 75 - Study Plan - LeetCode&quot; data-og-description=&quot;Ace Coding Interview with 75 Qs&quot; data-og-host=&quot;leetcode.com&quot; data-og-source-url=&quot;https://leetcode.com/studyplan/leetcode-75/&quot; data-og-url=&quot;https://leetcode.com/studyplan/leetcode-75/&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/ntx8c/dJMb8UHMBDg/npQzDVp5IplaotThexiG20/img.png?width=720&amp;amp;height=720&amp;amp;face=0_0_720_720,https://scrap.kakaocdn.net/dn/bWKJwE/dJMb8WMm0Nr/ybP1YCkYJ4m73ZmqcQzVm1/img.png?width=720&amp;amp;height=720&amp;amp;face=0_0_720_720,https://scrap.kakaocdn.net/dn/ilArm/dJMb8WMm0Ns/RXKXZrfc33DBsBPt6WsGP0/img.png?width=360&amp;amp;height=360&amp;amp;face=0_0_360_360&quot;&gt;&lt;a href=&quot;https://leetcode.com/studyplan/leetcode-75/&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://leetcode.com/studyplan/leetcode-75/&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/ntx8c/dJMb8UHMBDg/npQzDVp5IplaotThexiG20/img.png?width=720&amp;amp;height=720&amp;amp;face=0_0_720_720,https://scrap.kakaocdn.net/dn/bWKJwE/dJMb8WMm0Nr/ybP1YCkYJ4m73ZmqcQzVm1/img.png?width=720&amp;amp;height=720&amp;amp;face=0_0_720_720,https://scrap.kakaocdn.net/dn/ilArm/dJMb8WMm0Ns/RXKXZrfc33DBsBPt6WsGP0/img.png?width=360&amp;amp;height=360&amp;amp;face=0_0_360_360');&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;LeetCode 75 - Study Plan - LeetCode&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;Ace Coding Interview with 75 Qs&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;leetcode.com&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;</description>
      <category>✏️/LeetCode</category>
      <author>aeongg</author>
      <guid isPermaLink="true">https://debug.tistory.com/546</guid>
      <comments>https://debug.tistory.com/546#entry546comment</comments>
      <pubDate>Fri, 27 Feb 2026 18:44:19 +0900</pubDate>
    </item>
    <item>
      <title>[LeetCode 75/Hash Map &amp;amp; Set] 2215 - Find the Difference of Two Arrays / 1207 - Unique Number of Occurrences / 1657 - Determine if Two String Are Close / 2352 - Equal Row and Column Pairs (Java)</title>
      <link>https://debug.tistory.com/545</link>
      <description>&lt;h2 data-ke-size=&quot;size26&quot;&gt;2215 - Find&amp;nbsp;the&amp;nbsp;Difference&amp;nbsp;of&amp;nbsp;Two&amp;nbsp;Arrays&lt;/h2&gt;
&lt;p&gt;&lt;figure class=&quot;imagegridblock&quot;&gt;
  &lt;div class=&quot;image-container&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/c9O2dr/dJMcacoG8MH/Mkv9CWIVSH3kXBkmOFeP51/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/c9O2dr/dJMcacoG8MH/Mkv9CWIVSH3kXBkmOFeP51/img.png&quot; data-filename=&quot;스크린샷 2026-03-03 오후 7.47.01.png&quot; data-origin-height=&quot;676&quot; data-origin-width=&quot;944&quot; data-is-animation=&quot;false&quot; style=&quot;width: 63.4536%; margin-right: 10px;&quot; data-widthpercent=&quot;64.2&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/c9O2dr/dJMcacoG8MH/Mkv9CWIVSH3kXBkmOFeP51/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fc9O2dr%2FdJMcacoG8MH%2FMkv9CWIVSH3kXBkmOFeP51%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;944&quot; height=&quot;676&quot;/&gt;&lt;/span&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bDsLKi/dJMcaih8ydE/ddMUIOLiD3KILmqTr4oy41/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bDsLKi/dJMcaih8ydE/ddMUIOLiD3KILmqTr4oy41/img.png&quot; data-is-animation=&quot;false&quot; data-origin-width=&quot;936&quot; data-origin-height=&quot;1202&quot; data-filename=&quot;스크린샷 2026-03-03 오후 7.47.24.png&quot; style=&quot;width: 35.3836%;&quot; data-widthpercent=&quot;35.8&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bDsLKi/dJMcaih8ydE/ddMUIOLiD3KILmqTr4oy41/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbDsLKi%2FdJMcaih8ydE%2FddMUIOLiD3KILmqTr4oy41%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;936&quot; height=&quot;1202&quot;/&gt;&lt;/span&gt;&lt;/div&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style3&quot; /&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;풀이&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;두 배열 nums1, nums2&amp;nbsp;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;`answer[0]`: nums1에만 있고 nums2에는 없는 값들&lt;/li&gt;
&lt;li&gt;`answer[1]:` nums2에만 있고 nums1에는 없는 값들&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;-&amp;gt; 중복 없이(distinct) 반환 =&amp;gt; `Set`&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-style=&quot;style3&quot; data-ke-type=&quot;horizontalRule&quot; /&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;코드&lt;/h3&gt;
&lt;pre id=&quot;code_1772074620424&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;class Solution {
    public List&amp;lt;List&amp;lt;Integer&amp;gt;&amp;gt; findDifference(int[] nums1, int[] nums2) {
        Set&amp;lt;Integer&amp;gt; set1 = new HashSet&amp;lt;&amp;gt;();
        Set&amp;lt;Integer&amp;gt; set2 = new HashSet&amp;lt;&amp;gt;();

        for (int n : nums1) set1.add(n);
        for (int n : nums2) set2.add(n);

        List&amp;lt;Integer&amp;gt; diff1 = new ArrayList&amp;lt;&amp;gt;();
        List&amp;lt;Integer&amp;gt; diff2 = new ArrayList&amp;lt;&amp;gt;();

        for (int s : set1) {
            if (!set2.contains(s)) {
                diff1.add(s);
            }
        }

        for (int s : set2) {
            if (!set1.contains(s)) {
                diff2.add(s);
            }
        }

        return Arrays.asList(diff1, diff2);
    }
}&lt;/code&gt;&lt;/pre&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-style=&quot;style6&quot; data-ke-type=&quot;horizontalRule&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;1207 - Unique Number of Occurrences&lt;/h2&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2026-03-03 오후 7.47.46.png&quot; data-origin-width=&quot;1044&quot; data-origin-height=&quot;1358&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/Tguh6/dJMcaiPVWvG/utJQQkz3y98fTK9AzUCKCk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/Tguh6/dJMcaiPVWvG/utJQQkz3y98fTK9AzUCKCk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/Tguh6/dJMcaiPVWvG/utJQQkz3y98fTK9AzUCKCk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FTguh6%2FdJMcaiPVWvG%2FutJQQkz3y98fTK9AzUCKCk%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;510&quot; height=&quot;663&quot; data-filename=&quot;스크린샷 2026-03-03 오후 7.47.46.png&quot; data-origin-width=&quot;1044&quot; data-origin-height=&quot;1358&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-style=&quot;style3&quot; data-ke-type=&quot;horizontalRule&quot; /&gt;
&lt;h3 style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size23&quot;&gt;풀이&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;배열 arr에서 각 숫자의 등장 횟수(빈도) 구한 뒤 같은 빈도 2개 이상 있으면 false&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;=&amp;gt; 등장 횟수 모두 서로 달라야 함&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style3&quot; /&gt;
&lt;h3 style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size23&quot;&gt;코드&lt;/h3&gt;
&lt;pre id=&quot;code_1772091358768&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;class Solution {
    public boolean uniqueOccurrences(int[] arr) {
        Map&amp;lt;Integer, Integer&amp;gt; HM = new HashMap&amp;lt;&amp;gt;();

        for (int a : arr) {
            HM.put(a, HM.getOrDefault(a, 0) + 1);
        }

        Set&amp;lt;Integer&amp;gt; set = new HashSet&amp;lt;&amp;gt;(HM.values());

        return set.size() == HM.size();
    }
}&lt;/code&gt;&lt;/pre&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-style=&quot;style6&quot; data-ke-type=&quot;horizontalRule&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;1657 - Determine if Two String Are Close&lt;/h2&gt;
&lt;p&gt;&lt;figure class=&quot;imagegridblock&quot;&gt;
  &lt;div class=&quot;image-container&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bMItOo/dJMcabDkIzC/o6u5tAQmNpk4ysqGEzGZKK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bMItOo/dJMcabDkIzC/o6u5tAQmNpk4ysqGEzGZKK/img.png&quot; data-is-animation=&quot;false&quot; data-origin-width=&quot;1110&quot; data-origin-height=&quot;806&quot; data-filename=&quot;스크린샷 2026-03-03 오후 7.48.31.png&quot; style=&quot;width: 59.6064%; margin-right: 10px;&quot; data-widthpercent=&quot;60.31&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bMItOo/dJMcabDkIzC/o6u5tAQmNpk4ysqGEzGZKK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbMItOo%2FdJMcabDkIzC%2Fo6u5tAQmNpk4ysqGEzGZKK%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;1110&quot; height=&quot;806&quot;/&gt;&lt;/span&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bNJcoH/dJMcahQ4h6n/Zqd64ihjiGqnKWUc93GZqk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bNJcoH/dJMcahQ4h6n/Zqd64ihjiGqnKWUc93GZqk/img.png&quot; data-is-animation=&quot;false&quot; data-origin-width=&quot;1104&quot; data-origin-height=&quot;1218&quot; data-filename=&quot;스크린샷 2026-03-03 오후 7.48.22.png&quot; style=&quot;width: 39.2308%;&quot; data-widthpercent=&quot;39.69&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bNJcoH/dJMcahQ4h6n/Zqd64ihjiGqnKWUc93GZqk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbNJcoH%2FdJMcahQ4h6n%2FZqd64ihjiGqnKWUc93GZqk%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;1104&quot; height=&quot;1218&quot;/&gt;&lt;/span&gt;&lt;/div&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-style=&quot;style3&quot; data-ke-type=&quot;horizontalRule&quot; /&gt;
&lt;h3 style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size23&quot;&gt;풀이&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;문자 위치 바꾸기(swap): a&lt;u&gt;b&lt;/u&gt;cd&lt;u&gt;e&lt;/u&gt; -&amp;gt; a&lt;u&gt;e&lt;/u&gt;cd&lt;u&gt;b&lt;/u&gt;&lt;/li&gt;
&lt;li&gt;문자 전체 교환: aacabb -&amp;gt; bbcbaa&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;-&amp;gt; 두 문자열 close하려면 문자 종류 같음 + 문자 빈도 집합 같음&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;gt; 정렬 후 비교&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style3&quot; /&gt;
&lt;h3 style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size23&quot;&gt;코드&lt;/h3&gt;
&lt;pre id=&quot;code_1772091343122&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;class Solution {
    public boolean closeStrings(String word1, String word2) {
        if (word1.length() != word2.length()) return false;

        Map&amp;lt;Character, Integer&amp;gt; map1 = new HashMap&amp;lt;&amp;gt;();
        for (char c : word1.toCharArray()) {
            map1.put(c, map1.getOrDefault(c, 0) + 1);
        }

        Map&amp;lt;Character, Integer&amp;gt; map2 = new HashMap&amp;lt;&amp;gt;();
        for (char c : word2.toCharArray()) {
            map2.put(c, map2.getOrDefault(c, 0) + 1);
        }

        if (!map1.keySet().equals(map2.keySet())) {
            return false;
        }

        List&amp;lt;Integer&amp;gt; freq1 = new ArrayList&amp;lt;&amp;gt;(map1.values());
        List&amp;lt;Integer&amp;gt; freq2 = new ArrayList&amp;lt;&amp;gt;(map2.values());

        Collections.sort(freq1);
        Collections.sort(freq2);

        return freq1.equals(freq2);
    }
}&lt;/code&gt;&lt;/pre&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-style=&quot;style6&quot; data-ke-type=&quot;horizontalRule&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;2352 - Equal Row and Column Pairs&lt;/h2&gt;
&lt;p&gt;&lt;figure class=&quot;imagegridblock&quot;&gt;
  &lt;div class=&quot;image-container&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bT97sK/dJMcadA4ciM/tDsS6TrqKx5hp4TKcaJdLk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bT97sK/dJMcadA4ciM/tDsS6TrqKx5hp4TKcaJdLk/img.png&quot; data-is-animation=&quot;false&quot; data-origin-width=&quot;1020&quot; data-origin-height=&quot;1092&quot; data-filename=&quot;스크린샷 2026-03-03 오후 7.48.56.png&quot; style=&quot;width: 51.386%; margin-right: 10px;&quot; data-widthpercent=&quot;51.99&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bT97sK/dJMcadA4ciM/tDsS6TrqKx5hp4TKcaJdLk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbT97sK%2FdJMcadA4ciM%2FtDsS6TrqKx5hp4TKcaJdLk%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;1020&quot; height=&quot;1092&quot;/&gt;&lt;/span&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/btlGIL/dJMcag5H9lx/K3EzmkLAAHV1S4L3c7wOA0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/btlGIL/dJMcag5H9lx/K3EzmkLAAHV1S4L3c7wOA0/img.png&quot; data-is-animation=&quot;false&quot; data-origin-width=&quot;1004&quot; data-origin-height=&quot;1164&quot; data-filename=&quot;스크린샷 2026-03-03 오후 7.49.05.png&quot; style=&quot;width: 47.4513%;&quot; data-widthpercent=&quot;48.01&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/btlGIL/dJMcag5H9lx/K3EzmkLAAHV1S4L3c7wOA0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbtlGIL%2FdJMcag5H9lx%2FK3EzmkLAAHV1S4L3c7wOA0%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;1004&quot; height=&quot;1164&quot;/&gt;&lt;/span&gt;&lt;/div&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-style=&quot;style3&quot; data-ke-type=&quot;horizontalRule&quot; /&gt;
&lt;h3 style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size23&quot;&gt;풀이&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;n x n 행렬 -&amp;gt; (ri, cj) 쌍 중 row i와 column j가 완전히 같은 배열인 경우 개수&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;ex. grid = [[3, 2, 1],[1, 7, 6],[2, 7, 7]]&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;-&amp;gt; Row 0: [3, 2, 1], Row 1: [1, 7, 6], &lt;u&gt;&lt;b&gt;Row 2: [2, 7, 7]&lt;/b&gt;&lt;/u&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;/ Column 0: [3, 1, 2], &lt;u&gt;&lt;b&gt;Column 1: [2, 7, 7]&lt;/b&gt;&lt;/u&gt;, Column 2: [1, 6, 7]&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;-&amp;gt; Row 2 == Column 1 =&amp;gt; 1개&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;각 행 문자열로 변환 후 key로 저장, 빈도 저장&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;-&amp;gt; 열(column)을 배열(`arr`)로 만든 뒤 그 배열과 동일한 행(row) 몇 개 있는지 `HM`에서 찾음&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style3&quot; /&gt;
&lt;h3 style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size23&quot;&gt;코드&lt;/h3&gt;
&lt;pre id=&quot;code_1772186036623&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;class Solution {
    public int equalPairs(int[][] grid) {
        int n = grid.length;
        Map&amp;lt;String, Integer&amp;gt; HM = new HashMap&amp;lt;&amp;gt;();

        for (int[] g : grid) {
            String key = Arrays.toString(g);
            HM.put(key, HM.getOrDefault(key, 0) + 1);
        }

        int cnt = 0;
        for (int col = 0; col &amp;lt; n; col++) {
            int[] arr = new int[n];
            for (int row = 0; row &amp;lt; n; row++) {
                arr[row] = grid[row][col];
            }

            String key = Arrays.toString(arr);
            cnt += HM.getOrDefault(key, 0);
        }

        return cnt;
    }
}&lt;/code&gt;&lt;/pre&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style6&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;출처&lt;/h2&gt;
&lt;figure id=&quot;og_1772034695889&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;LeetCode 75 - Study Plan - LeetCode&quot; data-og-description=&quot;Ace Coding Interview with 75 Qs&quot; data-og-host=&quot;leetcode.com&quot; data-og-source-url=&quot;https://leetcode.com/studyplan/leetcode-75/&quot; data-og-url=&quot;https://leetcode.com/studyplan/leetcode-75/&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/bNztOK/dJMb87f3xXx/1dqLMDiw54cK7Ge7tGdB61/img.png?width=720&amp;amp;height=720&amp;amp;face=0_0_720_720,https://scrap.kakaocdn.net/dn/UuITk/dJMb83SfWSM/XV8anHlBJkcvSeSqW37lj1/img.png?width=720&amp;amp;height=720&amp;amp;face=0_0_720_720&quot;&gt;&lt;a href=&quot;https://leetcode.com/studyplan/leetcode-75/&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://leetcode.com/studyplan/leetcode-75/&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/bNztOK/dJMb87f3xXx/1dqLMDiw54cK7Ge7tGdB61/img.png?width=720&amp;amp;height=720&amp;amp;face=0_0_720_720,https://scrap.kakaocdn.net/dn/UuITk/dJMb83SfWSM/XV8anHlBJkcvSeSqW37lj1/img.png?width=720&amp;amp;height=720&amp;amp;face=0_0_720_720');&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;LeetCode 75 - Study Plan - LeetCode&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;Ace Coding Interview with 75 Qs&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;leetcode.com&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;</description>
      <category>✏️/LeetCode</category>
      <author>aeongg</author>
      <guid isPermaLink="true">https://debug.tistory.com/545</guid>
      <comments>https://debug.tistory.com/545#entry545comment</comments>
      <pubDate>Thu, 26 Feb 2026 00:54:05 +0900</pubDate>
    </item>
  </channel>
</rss>