<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0">
  <channel>
    <title>_</title>
    <link>https://ccssbb.tistory.com/</link>
    <description></description>
    <language>ko</language>
    <pubDate>Wed, 19 Aug 2026 08:18:15 +0900</pubDate>
    <generator>TISTORY</generator>
    <ttl>100</ttl>
    <managingEditor>천숭이</managingEditor>
    <item>
      <title>[Python][투포인터] 연속된 부분수열의 합 (투포인터)</title>
      <link>https://ccssbb.tistory.com/959</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://school.programmers.co.kr/learn/courses/30/lessons/178870&quot; target=&quot;_blank&quot; rel=&quot;noopener&amp;nbsp;noreferrer&quot;&gt;https://school.programmers.co.kr/learn/courses/30/lessons/178870&lt;/a&gt;&lt;/p&gt;
&lt;figure id=&quot;og_1754046318582&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;프로그래머스&quot; data-og-description=&quot;SW개발자를 위한 평가, 교육의 Total Solution을 제공하는 개발자 성장을 위한 베이스캠프&quot; data-og-host=&quot;programmers.co.kr&quot; data-og-source-url=&quot;https://school.programmers.co.kr/learn/courses/30/lessons/178870&quot; data-og-url=&quot;https://programmers.co.kr/&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/b6Z0cw/hyZuEhBiTF/3psdgHYIpddKi9my3w8tfk/img.png?width=1920&amp;amp;height=960&amp;amp;face=0_0_1920_960,https://scrap.kakaocdn.net/dn/dk8WhF/hyZrrDXDmx/68kajUcCerqp6UUOOntls1/img.png?width=1920&amp;amp;height=960&amp;amp;face=0_0_1920_960&quot;&gt;&lt;a href=&quot;https://school.programmers.co.kr/learn/courses/30/lessons/178870&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://school.programmers.co.kr/learn/courses/30/lessons/178870&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/b6Z0cw/hyZuEhBiTF/3psdgHYIpddKi9my3w8tfk/img.png?width=1920&amp;amp;height=960&amp;amp;face=0_0_1920_960,https://scrap.kakaocdn.net/dn/dk8WhF/hyZrrDXDmx/68kajUcCerqp6UUOOntls1/img.png?width=1920&amp;amp;height=960&amp;amp;face=0_0_1920_960');&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;프로그래머스&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;SW개발자를 위한 평가, 교육의 Total Solution을 제공하는 개발자 성장을 위한 베이스캠프&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;programmers.co.kr&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;프로그래머스 LV2 문제&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1002&quot; data-origin-height=&quot;467&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bIdC4T/btsPF5QN15d/Esdgj6QqpQhUpoAC87eCwk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bIdC4T/btsPF5QN15d/Esdgj6QqpQhUpoAC87eCwk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bIdC4T/btsPF5QN15d/Esdgj6QqpQhUpoAC87eCwk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbIdC4T%2FbtsPF5QN15d%2FEsdgj6QqpQhUpoAC87eCwk%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;1002&quot; height=&quot;467&quot; data-origin-width=&quot;1002&quot; data-origin-height=&quot;467&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;정렬된 배열에서 부분 배열이 제시한 K와 같을 때 해당 인덱스를 반환. 단, 최소 개수의 부분 배열이여야 함.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;pre id=&quot;code_1754046398400&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;def solution(sequence, k):
    answer = []
    left = 0 ; right = 0 ; index_num = len(sequeㄴㄴnce) # 최소 배열 체크용
    cnt = sequence[left]
    # sequence 는 정렬된 배열
    while 1 :
        #print ([left, right])
        if cnt == k :
            # 최소 배열인지 체크
            if index_num &amp;gt; right - left :
                index_num = right - left
                answer = [left, right]
            right += 1
            if right == len(sequence) : break
            cnt += sequence[right]
        elif cnt &amp;gt; k :
            cnt -= sequence[left]
            left += 1

        elif cnt &amp;lt; k :
            right += 1
            if right == len(sequence) : break
            cnt += sequence[right]

    return answer&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;아래 표처럼, 부분 배열의 합이 입력된 K보다 크거나 같을 경우에는 R ++&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;K보다 작을 때는 L--&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이때 부분 배열의 합을 갱신해줘야 하기에,&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;L-- 이전에 합에서 [Left] 값을 빼주고, R++ 한 후에 합에서 [Right] 값을 더해주면서 전진하면됨&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;590&quot; data-origin-height=&quot;812&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/RAumj/btsPFiQFtYC/CzxHlq6BH6muVqsd9hQJN0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/RAumj/btsPFiQFtYC/CzxHlq6BH6muVqsd9hQJN0/img.png&quot; data-alt=&quot;참고 : https://velog.io/@sugyeonghh/%ED%94%84%EB%A1%9C%EA%B7%B8%EB%9E%98%EB%A8%B8%EC%8A%A4-%EC%97%B0%EC%86%8D%EB%90%9C-%EB%B6%80%EB%B6%84-%EC%88%98%EC%97%B4%EC%9D%98-%ED%95%A9Python&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/RAumj/btsPFiQFtYC/CzxHlq6BH6muVqsd9hQJN0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FRAumj%2FbtsPFiQFtYC%2FCzxHlq6BH6muVqsd9hQJN0%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;590&quot; height=&quot;812&quot; data-origin-width=&quot;590&quot; data-origin-height=&quot;812&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;참고 : https://velog.io/@sugyeonghh/%ED%94%84%EB%A1%9C%EA%B7%B8%EB%9E%98%EB%A8%B8%EC%8A%A4-%EC%97%B0%EC%86%8D%EB%90%9C-%EB%B6%80%EB%B6%84-%EC%88%98%EC%97%B4%EC%9D%98-%ED%95%A9Python&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category>자기개발 &amp;zwj; /코딩 알고리즘</category>
      <author>천숭이</author>
      <guid isPermaLink="true">https://ccssbb.tistory.com/959</guid>
      <comments>https://ccssbb.tistory.com/959#entry959comment</comments>
      <pubDate>Fri, 1 Aug 2025 20:12:24 +0900</pubDate>
    </item>
    <item>
      <title>자동차 통신 종류</title>
      <link>https://ccssbb.tistory.com/957</link>
      <description>&lt;h2 style=&quot;background-color: #ffffff; color: #1f1f1f; text-align: start;&quot; data-sourcepos=&quot;1:1-1:24&quot; data-ke-size=&quot;size26&quot;&gt;자동차에 쓰이는 CAN FD 통신 종류&lt;/h2&gt;
&lt;p style=&quot;background-color: #ffffff; color: #1f1f1f; text-align: start;&quot; data-sourcepos=&quot;3:1-3:70&quot; data-ke-size=&quot;size16&quot;&gt;자동차에는 다양한 기능을 구현하기 위해 여러 종류의 CAN FD 통신이 사용됩니다. 주요 통신 종류와 특징은 다음과 같습니다.&lt;/p&gt;
&lt;p style=&quot;background-color: #ffffff; color: #1f1f1f; text-align: start;&quot; data-sourcepos=&quot;5:1-5:20&quot; data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;1. Local CAN FD:&lt;/b&gt;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc; background-color: #ffffff; color: #1f1f1f; text-align: start;&quot; data-sourcepos=&quot;7:1-11:0&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-sourcepos=&quot;7:1-7:35&quot;&gt;엔진, 변속기, ABS와 같은 차량 내부 통신에 사용됩니다.&lt;/li&gt;
&lt;li data-sourcepos=&quot;8:1-8:35&quot;&gt;높은 안정성과 짧은 지연 시간이 필요한 시스템에 적합합니다.&lt;/li&gt;
&lt;li data-sourcepos=&quot;9:1-9:18&quot;&gt;최대 속도는 5Mbps입니다.&lt;/li&gt;
&lt;li data-sourcepos=&quot;10:1-11:0&quot;&gt;데이터 길이는 최대 64바이트입니다.&lt;/li&gt;
&lt;/ul&gt;
&lt;p style=&quot;background-color: #ffffff; color: #1f1f1f; text-align: start;&quot; data-sourcepos=&quot;12:1-12:17&quot; data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;2. B1-CAN FD:&lt;/b&gt;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc; background-color: #ffffff; color: #1f1f1f; text-align: start;&quot; data-sourcepos=&quot;14:1-18:0&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-sourcepos=&quot;14:1-14:40&quot;&gt;ADAS, 인포테인먼트와 같은 차량 내부 및 외부 통신에 사용됩니다.&lt;/li&gt;
&lt;li data-sourcepos=&quot;15:1-15:39&quot;&gt;Local CAN FD보다 빠른 속도가 필요한 시스템에 적합합니다.&lt;/li&gt;
&lt;li data-sourcepos=&quot;16:1-16:19&quot;&gt;최대 속도는 10Mbps입니다.&lt;/li&gt;
&lt;li data-sourcepos=&quot;17:1-18:0&quot;&gt;데이터 길이는 최대 64바이트입니다.&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;3. R-CANFD (Remote CAN FD (Flexible Data-rate) ) :&lt;/b&gt;&lt;/p&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;li&gt;기존 CAN FD (Controller Area Network Flexible Data-rate) 기술을 기반으로 하며, 향상된 데이터 전송 속도, 안정성, 보안을 제공합니다.&lt;/li&gt;
&lt;/ul&gt;
&lt;p style=&quot;background-color: #ffffff; color: #1f1f1f; text-align: start;&quot; data-sourcepos=&quot;19:1-19:14&quot; data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;4. CAN FD:&lt;/b&gt;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc; background-color: #ffffff; color: #1f1f1f; text-align: start;&quot; data-sourcepos=&quot;21:1-25:0&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-sourcepos=&quot;21:1-21:45&quot;&gt;ADAS, 인포테인먼트, 전력망과 같은 차량 내부 및 외부 통신에 사용됩니다.&lt;/li&gt;
&lt;li data-sourcepos=&quot;22:1-22:36&quot;&gt;B1 CAN FD와 유사하지만, 5Mbps 속도도 지원합니다.&lt;/li&gt;
&lt;li data-sourcepos=&quot;23:1-23:28&quot;&gt;최대 속도는 5Mbps 또는 10Mbps입니다.&lt;/li&gt;
&lt;li data-sourcepos=&quot;24:1-25:0&quot;&gt;데이터 길이는 최대 64바이트입니다.&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;&lt;span style=&quot;background-color: #ffffff; color: #1f1f1f; text-align: start;&quot;&gt;5. LIN (Local Interconnect Network) :&lt;/span&gt;&lt;/b&gt;&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;엔진, 변속기, ABS와 같은 차량 내부 제어 시스템에서 센서, 액츄에이터, 스위치와 같은 저속 데이터 전송에 사용됩니다.&lt;/li&gt;
&lt;/ul&gt;</description>
      <category>자동차/개념 정리</category>
      <author>천숭이</author>
      <guid isPermaLink="true">https://ccssbb.tistory.com/957</guid>
      <comments>https://ccssbb.tistory.com/957#entry957comment</comments>
      <pubDate>Wed, 3 Apr 2024 11:47:10 +0900</pubDate>
    </item>
    <item>
      <title>[Python] 스킬트리 - 프로그래머스 Lv2</title>
      <link>https://ccssbb.tistory.com/940</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;&quot;CBD&quot;라는 스킬트리 skill이 주어진다. skill_trees의 스킬들은 skill 스킬트리의 순서를 무조건 따라야 하고, 선행 스킬을 무조건 진행해야 한다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;&quot;CBADF&quot;의 경우 중간 정해지지 않은 스킬이 들어가지만, CBD 순서대로 스킬을 완료했으므로 정답이다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;하지만 &quot;BACDE&quot;같은 경우에는 B가 C 스킬을 배우기도 전에 먼저 배우려고 해 정답이 아니다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;&amp;lt;알고리즘&amp;gt;&lt;/span&gt;&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;queue 자료구조를 활용해 스택을 구현할 것이다 (popleft 활용)&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;tree 스킬트리를 큐로 전환하고, 맨 앞인덱스가 skill에 포함되고 존재한다면 popleft로 삭제해준다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;하지만 skill에 포함되지 않는데 맨 앞 인덱스가 아니라면 선행스킬을 배우지 않고 먼저 나타난 것이기에 정답이 아니다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;이 때 위에서 설정한 is_tree를 False로 바꾸어주고,&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;그에 따라 answer 카운트업 여부를 결정해준다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;pre id=&quot;code_1702279470142&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;from collections import deque

def solution(skill, skill_trees):
    answer = 0

    for tree in skill_trees :
        is_tree = True
        q = deque(skill)
        for s in tree:
            if s not in q : continue
            if s == q[0] :
                q.popleft()

            else :
                is_tree = False

        if is_tree == True : answer += 1

    return answer
    
    
    
# ex ) solution(&quot;CBD&quot;, [&quot;BACDE&quot;, &quot;CBADF&quot;, &quot;AECB&quot;, &quot;BDA&quot;])&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category>자기개발 &amp;zwj; /코딩 알고리즘</category>
      <author>천숭이</author>
      <guid isPermaLink="true">https://ccssbb.tistory.com/940</guid>
      <comments>https://ccssbb.tistory.com/940#entry940comment</comments>
      <pubDate>Mon, 11 Dec 2023 16:29:36 +0900</pubDate>
    </item>
    <item>
      <title>[Python] 안전지대 - dfs, bfs로 풀기</title>
      <link>https://ccssbb.tistory.com/939</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;출처 : 코드트리&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;문제 :&lt;/p&gt;
&lt;p style=&quot;background-color: #ffffff; color: #24292f; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;첫 번째 줄에는&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;span&gt;&lt;span&gt;&lt;span aria-hidden=&quot;true&quot;&gt;&lt;span&gt;&lt;span&gt;N&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;과&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;span&gt;&lt;span&gt;&lt;span aria-hidden=&quot;true&quot;&gt;&lt;span&gt;&lt;span&gt;M&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;이 공백을 사이에 두고 주어지고,&lt;/p&gt;
&lt;p style=&quot;background-color: #ffffff; color: #24292f; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;두 번째 줄부터는&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;span&gt;&lt;span&gt;&lt;span aria-hidden=&quot;true&quot;&gt;&lt;span&gt;&lt;span&gt;N&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;개의 줄에 걸쳐 각 행에 위치한&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;span&gt;&lt;span&gt;&lt;span aria-hidden=&quot;true&quot;&gt;&lt;span&gt;&lt;span&gt;M&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;개의 마을의 높이 정보가 공백을 사이에 두고 주어집니다.&lt;/p&gt;
&lt;p style=&quot;background-color: #ffffff; color: #24292f; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;k이하의 집들은 모두 물에 잠긴다고 한다. 물에 잠기지 않은 덩어리(?)들을 안전지대라고 한다면, 안전지대가 최대로 될 때의 k를 구하여라.&lt;/p&gt;
&lt;p style=&quot;background-color: #ffffff; color: #24292f; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;(집의 높이는 최대100, 따라서 빗물높이 k를 1부터 100까지 올리면서 구해야 한)&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;397&quot; data-origin-height=&quot;390&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cwODn6/btsBDNqNphL/7YE9zilqlwDnD5i2CkdFe1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cwODn6/btsBDNqNphL/7YE9zilqlwDnD5i2CkdFe1/img.png&quot; data-alt=&quot;K 가 4일때 안전지대가 4로 최대인 모습&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cwODn6/btsBDNqNphL/7YE9zilqlwDnD5i2CkdFe1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcwODn6%2FbtsBDNqNphL%2F7YE9zilqlwDnD5i2CkdFe1%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;397&quot; height=&quot;390&quot; data-origin-width=&quot;397&quot; data-origin-height=&quot;390&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;K 가 4일때 안전지대가 4로 최대인 모습&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p style=&quot;background-color: #ffffff; color: #24292f; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;출력 :&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;background-color: #ffffff; color: #24292f; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;background-color: #ffffff; color: #24292f; text-align: start;&quot;&gt;&lt;span&gt;&lt;span aria-hidden=&quot;true&quot;&gt;&lt;span&gt;&lt;span&gt;1&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;background-color: #ffffff; color: #24292f; text-align: start;&quot;&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;이상의&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;background-color: #ffffff; color: #24292f; text-align: start;&quot;&gt;&lt;span&gt;&lt;span aria-hidden=&quot;true&quot;&gt;&lt;span&gt;&lt;span&gt;K&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;background-color: #ffffff; color: #24292f; text-align: start;&quot;&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;중, 안전 영역의 수가 최대가 될때의&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;background-color: #ffffff; color: #24292f; text-align: start;&quot;&gt;&lt;span&gt;&lt;span aria-hidden=&quot;true&quot;&gt;&lt;span&gt;&lt;span&gt;K&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;background-color: #ffffff; color: #24292f; text-align: start;&quot;&gt;와 그 때의 안전 영역의 수를 공백을 사이에 두고 출력합니다. 만약 안전 영역의 수가 최대가 되는&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;background-color: #ffffff; color: #24292f; text-align: start;&quot;&gt;&lt;span&gt;&lt;span aria-hidden=&quot;true&quot;&gt;&lt;span&gt;&lt;span&gt;K&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;background-color: #ffffff; color: #24292f; text-align: start;&quot;&gt;가 여러 개라면, 그 중 가장 작은&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;background-color: #ffffff; color: #24292f; text-align: start;&quot;&gt;&lt;span&gt;&lt;span aria-hidden=&quot;true&quot;&gt;&lt;span&gt;&lt;span&gt;K&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;background-color: #ffffff; color: #24292f; text-align: start;&quot;&gt;를 출력합니다.&lt;/span&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1702047194112&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;import sys
from collections import deque
sys.setrecursionlimit(2500)
n,m = map(int, sys.stdin.readline().split())

graph = [ list(map(int, sys.stdin.readline().split())) for _ in range(n) ]

def in_range(x, y):
    return 0&amp;lt;=x and x&amp;lt;n and 0&amp;lt;=y and y&amp;lt;m 

# k이하 숫자들에만 dfs 탐색 진행
def less_than_k(x,y,k):
    global K
    # 범위를 벗어남
    if not in_range(x,y) : 
        return False

    # 방문했거나 잠긴 집
    if graph[x][y] &amp;lt;= k or visited[x][y]==True : 
        return False

    return True

dx = [1,0,-1,0]
dy = [0,-1,0,1]
cnt = 0 
visited = [ [False]*m for _ in range(n) ]
def dfs(row, col, K):
    global cnt
    for i in range(4):
        new_row = row + dx[i]; new_col = col + dy[i]
        if in_range(new_row, new_col) == False : continue
        if less_than_k(new_row, new_col, K) == True :
            visited[new_row][new_col] = True
            dfs(new_row, new_col, K)


def bfs(x, y, K):
    global cnt
    q = deque()
    visited[x][y] = True
    q.append((x, y))
    while(q) :
        pop_x , pop_y = q.popleft()
        for i in range(4):
            new_row = pop_x + dx[i]; new_col = pop_y + dy[i]
            if in_range(new_row, new_col) == False : continue
            if less_than_k(new_row, new_col, K) == True :
                visited[new_row][new_col] = True
                q.append((new_row, new_col))


k_list = [0] * (101)
#모든지점에서 bfs 탐색 진행
# 잠긴곳은 False, 안잠긴 곳은 True
for KK in range(1, 101):
    visited = [ [False]*m for _ in range(n) ]
    cnt = 0

    for i in range(n):
        for j in range(m):
            if less_than_k(i,j,KK):
                visited[i][j] = True
                cnt+=1 # dfs하기 전에 cnt up
				
                #(1) bfs 방법 - 너비우선탐색
                bfs(i, j, KK)
                # (2) dfs 방법 - 깊이우선탐색
                # dfs(i,j,KK)

    k_list[KK] = cnt

visited[0][0] = True
ans = k_list.index(max(k_list))
if ans == 0 : ans = 1
print(ans, max(k_list))&lt;/code&gt;&lt;/pre&gt;</description>
      <category>자기개발 &amp;zwj; /코딩 알고리즘</category>
      <author>천숭이</author>
      <guid isPermaLink="true">https://ccssbb.tistory.com/939</guid>
      <comments>https://ccssbb.tistory.com/939#entry939comment</comments>
      <pubDate>Fri, 8 Dec 2023 23:58:30 +0900</pubDate>
    </item>
    <item>
      <title>파이썬 알면 좋은 내용!</title>
      <link>https://ccssbb.tistory.com/931</link>
      <description>&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;1. 마름모 범위 체크&lt;/span&gt;&lt;/b&gt;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR'; color: #333333; text-align: start;&quot;&gt;(&amp;darr;마름모의 크기가 1일때)&lt;/span&gt;&lt;/p&gt;
&lt;table style=&quot;border-collapse: collapse; width: 17.5581%; height: 69px;&quot; border=&quot;1&quot; data-ke-align=&quot;alignLeft&quot;&gt;
&lt;tbody&gt;
&lt;tr style=&quot;height: 23px;&quot;&gt;
&lt;td style=&quot;width: 33.3333%; text-align: center; height: 23px;&quot;&gt;&amp;nbsp;&lt;/td&gt;
&lt;td style=&quot;width: 33.3333%; text-align: center; height: 23px;&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;1&lt;/span&gt;&lt;/td&gt;
&lt;td style=&quot;width: 33.3333%; text-align: center; height: 23px;&quot;&gt;&amp;nbsp;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 23px;&quot;&gt;
&lt;td style=&quot;width: 33.3333%; text-align: center; height: 23px;&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;1&lt;/span&gt;&lt;/td&gt;
&lt;td style=&quot;width: 33.3333%; text-align: center; height: 23px;&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;1&lt;/span&gt;&lt;/td&gt;
&lt;td style=&quot;width: 33.3333%; text-align: center; height: 23px;&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;1&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 23px;&quot;&gt;
&lt;td style=&quot;width: 33.3333%; text-align: center; height: 23px;&quot;&gt;&amp;nbsp;&lt;/td&gt;
&lt;td style=&quot;width: 33.3333%; text-align: center; height: 23px;&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;1&lt;/span&gt;&lt;/td&gt;
&lt;td style=&quot;width: 33.3333%; text-align: center; height: 23px;&quot;&gt;&amp;nbsp;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;위 격자에서 1이 있는 부분만을 마름모라고 표현한다면, (정사각형이고 한 변의 크기를 n이라고 하자)&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;(0,0) ~ (n-1,n-1) 즉, 좌측 위부터 우측 아래까지 모든 영역에서 (a,b)가 마름모의 범위에 속하는지 구하는 방법!&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;중앙의 인덱스 값을 (cx, cy)라고 한다면 아래 범위 내부에 속해야 한다.&lt;/span&gt;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;span style=&quot;background-color: #dddddd; font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;&lt;b&gt;|a-cx| + |b-cy| &amp;lt;= m (마름모의크기)&lt;/b&gt;&lt;/span&gt;&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;ex )&lt;/span&gt;&lt;/p&gt;
&lt;table style=&quot;border-collapse: collapse; width: 15.1163%; height: 111px;&quot; border=&quot;1&quot; data-ke-align=&quot;alignLeft&quot;&gt;
&lt;tbody&gt;
&lt;tr style=&quot;height: 17px;&quot;&gt;
&lt;td style=&quot;width: 33.3333%; height: 17px; text-align: center;&quot;&gt;&amp;nbsp;&lt;/td&gt;
&lt;td style=&quot;width: 33.3333%; height: 17px; text-align: center;&quot;&gt;1&lt;/td&gt;
&lt;td style=&quot;width: 33.3333%; height: 17px; text-align: center;&quot;&gt;&lt;span style=&quot;color: #ee2323;&quot;&gt;?&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 17px;&quot;&gt;
&lt;td style=&quot;width: 33.3333%; height: 17px; text-align: center;&quot;&gt;1&lt;/td&gt;
&lt;td style=&quot;width: 33.3333%; height: 17px; text-align: center;&quot;&gt;1&lt;/td&gt;
&lt;td style=&quot;width: 33.3333%; height: 17px; text-align: center;&quot;&gt;1&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 17px;&quot;&gt;
&lt;td style=&quot;width: 33.3333%; height: 17px; text-align: center;&quot;&gt;&amp;nbsp;&lt;/td&gt;
&lt;td style=&quot;width: 33.3333%; height: 17px; text-align: center;&quot;&gt;1&lt;/td&gt;
&lt;td style=&quot;width: 33.3333%; height: 17px; text-align: center;&quot;&gt;&amp;nbsp;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;마름모 중앙의 인덱스는 (1, 1)이다. (0,2)가 범위 내에 있는지 체크해보자&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;|1-0| + |1-2| = 2이므로 범위 내에 없다&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;2. 다차원배열 -&amp;gt; 1차원배열&lt;/span&gt;&lt;/b&gt;&lt;/h3&gt;
&lt;pre id=&quot;code_1701319777164&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;tmp = [[1,2],[3,4]]
result = sum(tmp, []) 
# tmp 내부의 리스트와 빈 리스트를 합친다는 의미로, 결국에 tmp 내부 리스트 값만 추출돼서 1차원배열로 저장됨&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;3. 격자에서 쓰면 좋은 스킬&lt;/b&gt;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;(1) dx, dy 테크닉&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;(2) 빈 board를 만들어서 방문 체크&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;4. 사각형 시계방향으로 밀면서 회전&lt;/b&gt;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;배열을 쉬프트해야 하는데, 행과 열이 증가하는 방향으로 쉬프트 되면 역순 for문으로 코딩하기&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;temp 한 번만 백업하는 방법!&amp;nbsp;&lt;/p&gt;
&lt;pre id=&quot;code_1701355432511&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;# 직사각형 경계 숫자들 시계방향으로 회전
# 네 변 쉬프트 할 때마다 tmp 저장이 아닌, 한 번만 tmp 저장!
def rotate(start_row, start_col, end_row, end_col):
    temp = a[start_row][start_col]
    # 왼면
    for row in range(start_row, end_row):
        a[row][start_col] = a[row+1][start_col]
    
    # 아랫면
    for col in range(start_col, end_col):
        a[end_row][col] = a[end_row][col+1]

    # 오른면
    for row in rangee(end_col, start_col, -1)):
        a[start_row][col] = a[start_row][col-1]

    a[start_row][start_col+1] = temp&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;5. 파이썬 프로그램 종료 방법&lt;/b&gt;&lt;/h3&gt;
&lt;pre id=&quot;code_1701510541057&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;# 프로그램 정상 종료
sys.exit(0)

# 프로그램 비정상 종료
sys.exit(1)&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;6. 리스트내에 반복되는 수열이 존재하는지, 그리고 바로 붙어서 존재하는지 체크&lt;/b&gt;&lt;/h3&gt;
&lt;pre id=&quot;code_1701521942538&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;def is_possible_series():
    length = 1
    while True:
        # start2:end2 | start1:end1
        start1, end1 = len(series) - length, len(series) - 1
        start2, end2 = start1 - length, start1 - 1

        if start2 &amp;lt; 0:
            break

        # length만큼의 연속된 부분수열이 있는지 체크
        if series[start1:end1 + 1] == series[start2:end2 + 1]:
            return False

        length += 1
    
    return True&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;7. 문자열 받을 때 개행문자(줄바꿈 '\n') 처리 방법&amp;nbsp;&lt;/b&gt;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;readline 함수에서 strip() 처리 해주면 개행문자 제외되고 입력받을 수 있다&lt;/p&gt;
&lt;pre id=&quot;code_1701594957733&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;import sys
grid =[
    list(sys.stdin.readline().strip())
    for _ in range(n)
]&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;8. 격자 N X M 크기 헷갈릴 때&lt;/b&gt;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;행 x 열 임을 기억하자.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;통상 n은 행이고, m은 열로 표현&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;208&quot; data-origin-height=&quot;112&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/b1MyP8/btsBBWUk3qY/0kzDxJHMlo4zkvWaFjWa50/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/b1MyP8/btsBBWUk3qY/0kzDxJHMlo4zkvWaFjWa50/img.png&quot; data-alt=&quot;백준 문제 설명 중 일부&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/b1MyP8/btsBBWUk3qY/0kzDxJHMlo4zkvWaFjWa50/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fb1MyP8%2FbtsBBWUk3qY%2F0kzDxJHMlo4zkvWaFjWa50%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;208&quot; height=&quot;112&quot; data-origin-width=&quot;208&quot; data-origin-height=&quot;112&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;백준 문제 설명 중 일부&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;341&quot; data-origin-height=&quot;161&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bt2AUX/btsBx91Ice5/k3bywE0viMIaZDWz1XkSwK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bt2AUX/btsBx91Ice5/k3bywE0viMIaZDWz1XkSwK/img.png&quot; data-alt=&quot;N x M = 3 x 5&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bt2AUX/btsBx91Ice5/k3bywE0viMIaZDWz1XkSwK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fbt2AUX%2FbtsBx91Ice5%2Fk3bywE0viMIaZDWz1XkSwK%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;341&quot; height=&quot;161&quot; data-origin-width=&quot;341&quot; data-origin-height=&quot;161&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;N x M = 3 x 5&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;9. recursion 깊이 제한 해제&lt;/b&gt;&lt;/h3&gt;
&lt;pre id=&quot;code_1701935795749&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;sys.setrecursionlimit(2500)  # 2500 아닌 다른 수도 가능&lt;/code&gt;&lt;/pre&gt;</description>
      <category>자기개발 &amp;zwj; /코딩 알고리즘</category>
      <author>천숭이</author>
      <guid isPermaLink="true">https://ccssbb.tistory.com/931</guid>
      <comments>https://ccssbb.tistory.com/931#entry931comment</comments>
      <pubDate>Thu, 7 Dec 2023 16:56:39 +0900</pubDate>
    </item>
    <item>
      <title>STM32 개발 시, delay 함수 직접 구현해서 사용해보자 !</title>
      <link>https://ccssbb.tistory.com/908</link>
      <description>&lt;p style=&quot;background-color: #ffffff; color: #000000; text-align: start;&quot; data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;STM32F205RBT6 데이터시트를 참고하면&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;120 MHz 의 최대주파수로 동작하는 것을 확인 가능하다.&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1105&quot; data-origin-height=&quot;555&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/TQKGb/btsBx8UTxD0/bNdrhacIJwVqGysWkjBdo1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/TQKGb/btsBx8UTxD0/bNdrhacIJwVqGysWkjBdo1/img.png&quot; data-alt=&quot;데이터시트 첫번째 장, Feature summary를 통해 빠르게 확인 가능&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/TQKGb/btsBx8UTxD0/bNdrhacIJwVqGysWkjBdo1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FTQKGb%2FbtsBx8UTxD0%2FbNdrhacIJwVqGysWkjBdo1%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;1105&quot; height=&quot;555&quot; data-origin-width=&quot;1105&quot; data-origin-height=&quot;555&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;데이터시트 첫번째 장, Feature summary를 통해 빠르게 확인 가능&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;1us의 딜레이를 수행할 시 ,&lt;/span&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1701844105067&quot; class=&quot;cpp&quot; data-ke-language=&quot;cpp&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;asm(&quot;nop&quot;);  // CPU에게 아무런 작업도 하지 말라는 명령어&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;동작을 최대주파수만큼 실행한다&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;blob&quot; data-origin-width=&quot;846&quot; data-origin-height=&quot;232&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cbCIs9/btsByrNuzl5/ZcFiISJ9SD2NvxCmxuHMOK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cbCIs9/btsByrNuzl5/ZcFiISJ9SD2NvxCmxuHMOK/img.png&quot; data-alt=&quot;asm(&amp;quot;nop&amp;quot;)을 mcu의 주기만큼 작성하면 1us&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cbCIs9/btsByrNuzl5/ZcFiISJ9SD2NvxCmxuHMOK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcbCIs9%2FbtsByrNuzl5%2FZcFiISJ9SD2NvxCmxuHMOK%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;833&quot; height=&quot;228&quot; data-filename=&quot;blob&quot; data-origin-width=&quot;846&quot; data-origin-height=&quot;232&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;asm(&quot;nop&quot;)을 mcu의 주기만큼 작성하면 1us&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;만약 여러가지 통신과 기능이 구현되어 있다면, 스코프에서 확인하면 살짝의 오차가 발생하는 것을 확인할 수도 있다!&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;1us 를 구현했으니,&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;10us-&amp;gt;100us -&amp;gt;1ms 까지 함수를 만들어 사용이 가능하다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;stm의 내장 딜레이 함수 사용하고 싶지 않을때, 만들면 좋다 !&lt;/span&gt;&lt;/p&gt;</description>
      <category>F W/Coding</category>
      <author>천숭이</author>
      <guid isPermaLink="true">https://ccssbb.tistory.com/908</guid>
      <comments>https://ccssbb.tistory.com/908#entry908comment</comments>
      <pubDate>Wed, 6 Dec 2023 15:31:44 +0900</pubDate>
    </item>
    <item>
      <title>Atmega로 UART, SPI 통신 구현</title>
      <link>https://ccssbb.tistory.com/935</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;Atmega8A 칩을 사용해 UART, SPI 통신을 구현할 것입니다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;Atmega를 Master칩으로 설정하고, GPIO 핀을 활용해 연결된 Slave칩들의 핀들까지 컨트롤 할 것입니다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;따라서 코드를 그대로 적용할 시 작동이 안 될수도 있습니다,,!&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;그리고 데이터 시트에서 기초 통신 코드를 어셈블리코드와 C코드로 간략하게 기술되어 있습니다. 저도 그 코드를 일부 참고해서 작성했으니, 웬만하면 데이터시트를 먼저 참고해주세요 :&amp;gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style5&quot; /&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&amp;nbsp;&lt;/h3&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;&lt;b&gt;&amp;lt; 데이터시트 참고해 SPI통신과 UART통신 설정&amp;gt;&lt;/b&gt;&lt;/span&gt;&lt;/h3&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;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;&lt;b&gt;1. SPI 설정&lt;/b&gt;&lt;/span&gt;&lt;/h3&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;765&quot; data-origin-height=&quot;660&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/DX2Ff/btsBjE8hBM5/T650FGN274lbarJ5N1CJXK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/DX2Ff/btsBjE8hBM5/T650FGN274lbarJ5N1CJXK/img.png&quot; data-alt=&quot;SPI통신에 필요한 네 개의 핀 확인&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/DX2Ff/btsBjE8hBM5/T650FGN274lbarJ5N1CJXK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FDX2Ff%2FbtsBjE8hBM5%2FT650FGN274lbarJ5N1CJXK%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;438&quot; height=&quot;378&quot; data-origin-width=&quot;765&quot; data-origin-height=&quot;660&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;SPI통신에 필요한 네 개의 핀 확인&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;최소한의 기능으로 동작하기 위해서 라이브러리를 사용하지 않고, GPIO핀을 조작해 직접 SPI 구현할 것입니다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;450&quot; data-origin-height=&quot;380&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/CokG5/btsBja7uWzD/kTdZdV7apb9jtkA7nGvulk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/CokG5/btsBja7uWzD/kTdZdV7apb9jtkA7nGvulk/img.png&quot; data-alt=&quot;SCK, MOSI, MISO, NSS 핀을 위 그림처럼 조작할 것입니다&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/CokG5/btsBja7uWzD/kTdZdV7apb9jtkA7nGvulk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FCokG5%2FbtsBja7uWzD%2FkTdZdV7apb9jtkA7nGvulk%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;450&quot; height=&quot;380&quot; data-origin-width=&quot;450&quot; data-origin-height=&quot;380&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;SCK, MOSI, MISO, NSS 핀을 위 그림처럼 조작할 것입니다&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;&lt;b&gt;- SPI_MasterInit() : 핀 설정&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;SCK, MOSI, NSS를 Output으로설정하고 MISO핀만 Input으로 설정합니다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;(내장라이브러리를 사용해 SPI를 구현할 것이면, SPCR |= (1&amp;lt;&amp;lt;SPE)|(1&amp;lt;&amp;lt;MSTR); 처럼 SPI 활성화 및 마스터설정을 해줘야 합니다.)&lt;/span&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1701661089097&quot; class=&quot;cpp&quot; data-ke-language=&quot;cpp&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;void SPI_MasterInit(void)  // GPIO
{
	// InOut Pin set
	DDRB |= (1&amp;lt;&amp;lt;SCK)|(1&amp;lt;&amp;lt;MOSI)|(1&amp;lt;&amp;lt;NSS);
	DDRB &amp;amp;= ~(1&amp;lt;&amp;lt;MISO); 
}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;&lt;b&gt;- SCK 핀을 1, 0으로 만들어주기 위한 매크로 구현&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1701661534487&quot; class=&quot;cpp&quot; data-ke-language=&quot;cpp&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;#define SCK_1		PORTB |= 1&amp;lt;&amp;lt;PORTB5;
#define SCK_0		PORTB &amp;amp;= ~(1&amp;lt;&amp;lt;PORTB5);&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;&lt;b&gt;- SPI_Write() : addr 주소에 data 메모리 쓰기 구현&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1701661487545&quot; class=&quot;cpp&quot; data-ke-language=&quot;cpp&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;void SPI_WRITE(u8 addr, u8 data)
{
	u8 tmp;
	u8 mask = 0x80;  
    // MSB를 체크하며 1,0값을 핀에 실어서 보낸다
    // 왼쪽으로 쉬프트하면서 데이터를 스캔
	addr = (addr&amp;lt;&amp;lt;1)&amp;amp;0x7F;

	NSS_0  // SPI 통신 시작 - SCK핀에 따라서 동작 진행
    
    // SCK 핀을 올렸다 내렸다 8번 반복하며 MOSI 핀의 addr 데이터가 전송된다
	for (u8 i=0;i&amp;lt;8;i++)
	{
		if (addr &amp;amp; mask) {
			MOSI_1
		}
		else MOSI_0
		addr = addr&amp;lt;&amp;lt;1;
		SCK_1
		SCK_0
	}

	for (u8 i=0;i&amp;lt;8;i++)
    // SCK 핀을 올렸다 내렸다 8번 반복하며 MOSI 핀의 data 데이터가 전송된다
	{
		if (data &amp;amp; mask) {
			MOSI_1
		}
		else MOSI_0
		data = data&amp;lt;&amp;lt;1;
		SCK_1
		SCK_0
	}
    NSS_1

}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;&lt;b&gt;- SPI_READ()&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1701661595857&quot; class=&quot;cpp&quot; data-ke-language=&quot;cpp&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;u8 TRH_READ(u8 addr)
{
	u8 tmp;
    // MSB를 체크하며 1, 0값을 핀에 실어서 보낸다
    // 왼쪽으로 쉬프트하면서 데이터를 스캔
	u8 mask = 0x80;
	unsigned char result = 0;
	addr = (addr&amp;lt;&amp;lt;1)|0x80;

	NSS_0  // SPI 통신 시작 - SCK핀에 따라서 동작 진행
	for (u8 i=0;i&amp;lt;8;i++)
	{
		if (addr &amp;amp; mask) {
			MOSI_1
		}
		else {
			MOSI_0
		}
		addr = addr&amp;lt;&amp;lt;1;
		SCK_1
		SCK_0
	}
	
	for (u8 i=0;i&amp;lt;8;i++)
	{
		// 핀에 입력될때, result LSB += 1
		if(PINB &amp;amp; (0x10)) {  // INPUT = PIN!
			result += 0x01;
		}
		SCK_1
		SCK_0
		if (i != 7) result &amp;lt;&amp;lt;= 1;;
	}
	NSS_1
    
	return result;
}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size23&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;&lt;b&gt;2. UART 설정&lt;/b&gt;&lt;/span&gt;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;UART는 데이터시트를 살펴보면 관련 레지스터가 있습니다.&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1078&quot; data-origin-height=&quot;49&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/r4SKm/btsBqfzAb5C/ie2sUhVvAgdgjlTSveXlW1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/r4SKm/btsBqfzAb5C/ie2sUhVvAgdgjlTSveXlW1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/r4SKm/btsBqfzAb5C/ie2sUhVvAgdgjlTSveXlW1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fr4SKm%2FbtsBqfzAb5C%2Fie2sUhVvAgdgjlTSveXlW1%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;1078&quot; height=&quot;49&quot; data-origin-width=&quot;1078&quot; data-origin-height=&quot;49&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;- UBRRH (0x20) : Baud Rate 설정 레지스터&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;아래와 같이 설정하고자 하는 속도를 매크로로 정의했습니다.&lt;/p&gt;
&lt;pre id=&quot;code_1701662756216&quot; class=&quot;cpp&quot; data-ke-language=&quot;cpp&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;#define BAUD 9600
#define MYUBRR FOSC/16/BAUD-1&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;- USART_Init() : 통신 속도 설정&lt;/b&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;초기화할때 설정한 MYUBRR을 매개로 실행합니다.&amp;nbsp; &amp;nbsp; &amp;nbsp;-&amp;gt; USART_Init(MYUBRR);&lt;/p&gt;
&lt;pre id=&quot;code_1701662477708&quot; class=&quot;cpp&quot; data-ke-language=&quot;cpp&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;void USART_Init(unsigned long baud)
{
	UBRRH = (unsigned char)(baud&amp;gt;&amp;gt;8);
	UBRRL = (unsigned char)baud;

	/* Enable receiver and transmitter */
	UCSRB = (1&amp;lt;&amp;lt;RXEN)|(1&amp;lt;&amp;lt;TXEN);
	/* Set frame format: 8data, 2stop bit */
	UCSRC = (1&amp;lt;&amp;lt;URSEL)|(1&amp;lt;&amp;lt;USBS)|(3&amp;lt;&amp;lt;UCSZ0);	
}&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;- USART_Transmit() :&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;UCSRA라는 Status 레지스터를 통해 UDR 버퍼가 제대로 비워지고 채워졌는지 확인할 수 있습니다.&lt;/p&gt;
&lt;pre id=&quot;code_1701662613865&quot; class=&quot;cpp&quot; data-ke-language=&quot;cpp&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;void USART_Transmit( unsigned char data )
{
	/* Wait for empty transmit buffer */
	while ( !( UCSRA &amp;amp; (1&amp;lt;&amp;lt;UDRE)) )
	/* Put data into buffer, sends the data */
	UDR = data;
}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category>F W/Coding</category>
      <author>천숭이</author>
      <guid isPermaLink="true">https://ccssbb.tistory.com/935</guid>
      <comments>https://ccssbb.tistory.com/935#entry935comment</comments>
      <pubDate>Mon, 4 Dec 2023 11:31:28 +0900</pubDate>
    </item>
    <item>
      <title>Python 언어로 조합 구현! (combi함수안쓰고!)</title>
      <link>https://ccssbb.tistory.com/934</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;입력 변수 n, arr&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;arr는 n*2개의 크기를 가지고 있다고 하자.&lt;/p&gt;
&lt;pre id=&quot;code_1701606360213&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;import sys
n = 2
arr = [1,2,3,4]

numbers = []
def print_combination(arr):
    for i in arr :
        print(i, end=' ')
    print()

# curr_idx : 탐색의 정도, 배열을 모두 탐색했을 때 종료해야 하므로
# curr_idx == 배열의 크기   가 재귀함수의 종료조건. (성공/실패 모두 포함)
# 그리고 선택된 배열의 크기를 나타내는 cnt -&amp;gt; numbers 배열에 append 할 때마다 cnt+1 되고 있으므로.
# 따라서 cnt의 크기는 몇 개를 선택했느냐, 조합 선택 여부를 살펴보는 조건. (성공일때만)
def make_combination(curr_idx, cnt):
    # 종료 조건
    if curr_idx == 2*n:
        # 조합 완성되는 조건
        if cnt == 2:
            print_combination(numbers)
        return

    numbers.append(arr[curr_idx])
    make_combination(curr_idx+1, cnt+1)
    numbers.pop()
    make_combination(curr_idx+1, cnt)

make_combination(0,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;&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;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;pre id=&quot;code_1701615091809&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;n = 3
def find_min(color, cnt):
    if color == n :
        if cnt==n-1 :
            print(numbers)
        return

    numbers.append(color)
    find_min(color+1, cnt+1)
    numbers.pop()
    find_min(color+1, cnt)

find_min(0, 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;출력 :&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;[0,&amp;nbsp;1] &lt;br /&gt;[0,&amp;nbsp;2] &lt;br /&gt;[1,&amp;nbsp;2] &lt;/p&gt;</description>
      <category>자기개발 &amp;zwj; /코딩 알고리즘</category>
      <author>천숭이</author>
      <guid isPermaLink="true">https://ccssbb.tistory.com/934</guid>
      <comments>https://ccssbb.tistory.com/934#entry934comment</comments>
      <pubDate>Sun, 3 Dec 2023 21:30:11 +0900</pubDate>
    </item>
    <item>
      <title>[Python] 백준 1926 그림 - bfs알고리즘</title>
      <link>https://ccssbb.tistory.com/917</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;참고 : &lt;a href=&quot;https://www.youtube.com/watch?v=ansd5B27uJM&quot;&gt;https://www.youtube.com/watch?v=ansd5B27uJM&lt;/a&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1448&quot; data-origin-height=&quot;377&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bspA6L/btsyuczMUYD/pe2sFmlieDuxxVAUpwbir0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bspA6L/btsyuczMUYD/pe2sFmlieDuxxVAUpwbir0/img.png&quot; data-alt=&quot;예제 입출력&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bspA6L/btsyuczMUYD/pe2sFmlieDuxxVAUpwbir0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbspA6L%2FbtsyuczMUYD%2Fpe2sFmlieDuxxVAUpwbir0%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;1448&quot; height=&quot;377&quot; data-origin-width=&quot;1448&quot; data-origin-height=&quot;377&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;예제 입출력&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;pre id=&quot;code_1697381585002&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;from collections import deque
import sys

input = sys.stdin.readline

# 세로, 가로
n,m = map(int, input().split())
map = [list(map(int, input().split())) for _ in range(n)]

# 방문횟수 - 가로m개인 false리스트가 세로로 n개 있어야함
chk = [[False]*m for _ in range(n)]

# dy, dx는 그냥 외우기 - 좌표 이동에 사용됨
dy = [0,1,0,-1]
dx = [1,0,-1,0]

def bfs(y, x) :
    rs = 1
    q = deque()
    q.append((y,x))
    while q:
        ey, ex = q.popleft()
        for k in range(4):
            ny = ey + dy[k]
            nx = ex + dx[k]
            if (0&amp;lt;=ny and ny&amp;lt;n) and (0&amp;lt;=nx and nx&amp;lt;m):
                if map[ny][nx] == 1 and chk[ny][nx] == False:
                    rs += 1
                    chk[ny][nx] = True
                    q.append((ny, nx))

    return rs


cnt = 0 # result
maxv = 0 # 가장 큰 지도
for j in range(n) :
    for i in range(m):
        if map[j][i] == 1 and chk[j][i] == False:
            chk[j][i] = True
            cnt += 1
            maxv = max(maxv, bfs(j,i))
            # 전체 그림 갯수 +1
            # BFS &amp;gt; 그림 크기를 구해주고
            # 최대값 갱신

print(cnt)
print(maxv)&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style5&quot; /&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;코드 분석!&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- 큐 자료구조를 사용하므로&amp;nbsp; deque 선언&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- sys 라이브러리로 input 시간을 간소화 시킬 것임&lt;/p&gt;
&lt;pre id=&quot;code_1697381670276&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;from collections import deque
import sys&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- 세로, 가로를 입력받아주고 int 자료형으로 매핑시켜준다&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- 입력 형태를 리스트 2중 리스트 구조로 만들어 줄 것 (컴프리헨션 작성법 잘 익혀두기!)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp; - 한 행 입력받은것을 split해서 input으로 매핑시키고, 그 한 줄을 리스트로 저장하는데 이 동작을 n번 반복&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;* map의 형태 : [[1,&amp;nbsp;1,&amp;nbsp;0,&amp;nbsp;1,&amp;nbsp;1],&amp;nbsp;[0,&amp;nbsp;1,&amp;nbsp;1,&amp;nbsp;0,&amp;nbsp;0],&amp;nbsp;[0,&amp;nbsp;0,&amp;nbsp;0,&amp;nbsp;0,&amp;nbsp;0],&amp;nbsp;[1,&amp;nbsp;0,&amp;nbsp;1,&amp;nbsp;1,&amp;nbsp;1],&amp;nbsp;[0,&amp;nbsp;0,&amp;nbsp;1,&amp;nbsp;1,&amp;nbsp;1],&amp;nbsp;[0,&amp;nbsp;0,&amp;nbsp;1,&amp;nbsp;1,&amp;nbsp;1]]&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- chk도 이중 리스트구조이며, 방문체크를 위해 만든 리스트, 'False' 로 m개 채워진 리스트를 n개 만든다&lt;/p&gt;
&lt;pre id=&quot;code_1697381792812&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;# 세로, 가로
n,m = map(int, input().split())
map = [list(map(int, input().split())) for _ in range(n)]

# 방문횟수 - 가로m개인 false리스트가 세로로 n개 있어야함
chk = [[False]*m for _ in range(n)]&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- bfs 함수를 호출하는 main 부분&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- cnt 는 그림의 개수, maxv는 지도의 최대 크기&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- 이중포문은 보통 바깥 y, 내부 x포문으로 이루어져 있다 (바깥 세로, 내부 가로)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이중포문 진입&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- map의 [j][i] 인덱스가 1이고(그림영역이고) chk의 [j][i] 인덱스가 False이면(방문하지 않았다면), 지도개수 +=1&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- 이 때, 방문 체크&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- &lt;b&gt;bfs 알고리즘&lt;/b&gt;을 이용해 지도의 최대 크기도 구해보자.&lt;/p&gt;
&lt;pre id=&quot;code_1697382652674&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;cnt = 0 # result
maxv = 0 # 가장 큰 지도
for j in range(n) :
    for i in range(m):
        if map[j][i] == 1 and chk[j][i] == False:
            chk[j][i] = True
            cnt += 1
            maxv = max(maxv, bfs(j,i))
            # 전체 그림 갯수 +1
            # BFS &amp;gt; 그림 크기를 구해주고
            # 최대값 갱신

print(cnt)
print(maxv)&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;bfs 알고리즘&lt;/b&gt; 함수설명&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- 좌표를 상,하,좌,우 이동하면서 체크해야 하기에 dy와 dx 선언과 그 용법은 암기해두는 것이 편하다&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- q를 queue 자료구조로 선언해주고 매개변수 y,x를 저장해준다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- y,x를 저장해주면서 while문이 살아있&lt;/p&gt;
&lt;pre id=&quot;code_1697381997395&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;# dy, dx는 그냥 외우기 - 좌표 이동에 사용됨
dy = [0,1,0,-1]
dx = [1,0,-1,0]

def bfs(y, x) :
    rs = 1
    q = deque()
    q.append((y,x))
    while q:
        ey, ex = q.popleft()
        for k in range(4):
            ny = ey + dy[k]
            nx = ex + dx[k]
            if (0&amp;lt;=ny and ny&amp;lt;n) and (0&amp;lt;=nx and nx&amp;lt;m):
                if map[ny][nx] == 1 and chk[ny][nx] == False:
                    rs += 1
                    chk[ny][nx] = True
                    q.append((ny, nx))

    return rs&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category>자기개발 &amp;zwj; /코딩 알고리즘</category>
      <author>천숭이</author>
      <guid isPermaLink="true">https://ccssbb.tistory.com/917</guid>
      <comments>https://ccssbb.tistory.com/917#entry917comment</comments>
      <pubDate>Wed, 29 Nov 2023 00:10:47 +0900</pubDate>
    </item>
    <item>
      <title>[Python] 지그재그로 숫자 채우기 (이중배열)</title>
      <link>https://ccssbb.tistory.com/928</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;background-color: #ffffff; color: #24292f; 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;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;background-color: #ffffff; color: #24292f; text-align: start;&quot;&gt;n * m크기의 직사각형에 숫자를 0부터 순서대로 1씩 증가시키며 왼쪽 위에서부터 시작하여 다음과 같이 지그재그 모양으로 숫자들을 쭉 채우는 코드를 작성해보세요.&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;587&quot; data-origin-height=&quot;391&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bd881X/btsA5ixtFZp/Ym4GBmqR5JTqpeMXQTVHmk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bd881X/btsA5ixtFZp/Ym4GBmqR5JTqpeMXQTVHmk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bd881X/btsA5ixtFZp/Ym4GBmqR5JTqpeMXQTVHmk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fbd881X%2FbtsA5ixtFZp%2FYm4GBmqR5JTqpeMXQTVHmk%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;587&quot; height=&quot;391&quot; data-origin-width=&quot;587&quot; data-origin-height=&quot;391&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;pre id=&quot;code_1701183981459&quot; class=&quot;cpp&quot; data-ke-language=&quot;cpp&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;import sys
a, b = map(int,sys.stdin.readline().split())  # 행, 열

buf = [[0]*b for _ in range(a)]

count=0

for col in range(b):  # 열
    if col % 2 == 0:  # 짝수열이면
        for row in range(a):
            buf[row][col] = count
            count += 1
    else:             # 홀수열이면
        for row in range(a-1, -1, -1):   # 0~n-1까지 역순으로
            buf[row][col] = count
            count+=1

for row in range(a):
    for col in range(b):
        print(buf[row][col], end=' ')
    print()&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;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;그림처럼 홀수열은 밑으로 채워나가고,&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;짝수열은 밑에서 채워 올라간다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;따라서 짝수열일때만 역 for문을&amp;nbsp; 사용해서 변수를 채워주면 된다.&lt;/p&gt;</description>
      <category>자기개발 &amp;zwj; /코딩 알고리즘</category>
      <author>천숭이</author>
      <guid isPermaLink="true">https://ccssbb.tistory.com/928</guid>
      <comments>https://ccssbb.tistory.com/928#entry928comment</comments>
      <pubDate>Wed, 29 Nov 2023 00:07:52 +0900</pubDate>
    </item>
  </channel>
</rss>