분류 전체보기


운영체제는 다양한 프로세스를 관리하며, 프로세스 실행 중 예기치 않은 문제가 발생할 수 있다. 이러한 문제를 해결하는 핵심 개념이 인터럽트(Interrupt)이며, 효율적인 작업 처리를 위해 스레드(Thread)가 활용된다. 이번 포스터에서는 인터럽트의 개념과 처리 과정, 그리고 스레드의 정의와 유형에 대해 알아보도록 하겠다. 1. 인터럽트(Interrupt)1.1 인터럽트란?인터럽트는 실행 중인 프로그램을 일시적으로 중단시키고, 운영체제가 특정 작업을 수행하도록 하는 신호이다. 이는 예상치 못한 이벤트가 발생할 때 시스템이 적절히 대응할 수 있도록 한다. 인터럽트는 시스템 성능을 향상시키는 중요한 기법이지만, 과도한 인터럽트는 성능 저하를 초래할 수 있다. 1.2 인터럽트의 종류인터럽트는 발생 원인..


소프트웨어 개발을 시작할 때, 가장 먼저 시스템 도메인을 정의하고 시나리오를 작성해야 한다. 이후 요구사항을 분석한 뒤, 본격적인 개발에 앞서 설계를 진행하는데, 이를 UML(Unified Modeling Language)을 활용하여 시각화한다. UML 작성 과정에서 가장 먼저 수행해야 할 작업은 유스케이스 다이어그램을 작성하는 것이다. 이를 통해 시스템의 주요 기능과 사용자 간의 상호작용을 정의한 후, 클래스 다이어그램을 설계한다. 이후, 객체 간의 동적인 상호작용을 모델링하기위해 인터랙션 다이어그램을 작성하는데, 여기에는 순차 다이어그램과 통신 다이어그램이 포함된다. 실제 소프트웨어 개발 과정에서는 모든 UML 다이어그램을 작성할 필요는 없으며, 프로젝트의 특성과 필요에 따라 핵심적인 부분만 선택하여..


운영체제는 컴퓨터 자원을 관리하는 중요한 소프트웨어다. 그 중에서도 프로세스와 스레드는 효율적인 자원 관리를 위해 핵심적인 역할을 한다. 먼저 프로세스란 실행 중인 프로그램을 의미한다. 프로그램이 실행되면 운영체제는 이를 프로세스로 관리하게 된다. 각 프로세스는 독립적인 자원(메모리, CPU 시간 등)을 할당받으며 이를 통해 컴퓨터 자원이 효율적으로 분배된다. 프로세스 관리를 통해 운영체제는 각 프로세스가 공정하게 자원을 사용할 수 있도록 조정한다. 스레드는 프로세스 내에서 실제로 작업을 수행하는 최소 실행 단위다. 하나의 프로세스는 여러 개의 스레드를 가질 수 있으며 각 스레드는 프로세스의 자원을 공유하면서 독립적으로 실행된다. 프로세스와 스레드는 함께 관리되어야 하며 스레드를 잘 활용하면 여러 작업을..


운영체제는 한마디로 시스템들을 관리하는 시스템을 모두 모아서 이야기하는 것으로 컴퓨터의 구성요소를 다루는데에는 필수적으로 알아야하는 것이 아니지만 알게 된다면 컴퓨터의 시스템에 대해서 더 자세하게 알 수 있다. 이번 포스터에서는 운영체제가 어떻게 구조되어있고 운영체제가 어떤 기능을 가지고 있는지 자세하게 알아보도록 하겠다. 1. 운영체제의 구조 컴퓨터는 여러 계층으로 구성되어 있으며, 그중 운영체제(OS)는 커널(Kernel), 시스템 호출(System Calls), 유틸리티(Utilities)로 이루어져 있다고 볼 수 있다. 가장 먼저, 커널(Kernel)은 운영체제의 핵심 요소로, 시스템에서 가장 중요한 역할을 수행한다. 프로세서 관리, 메모리 관리 등 시스템 자원을 효율적으로 운영하며, 가장 빈번..


소프트웨어 개발에서 팀 프로젝트를 진행할 때는 먼저 시스템 도메인을 정의하고, 이를 기반으로 시나리오를 작성한다. 이 시나리오를 바탕으로 유스케이스(Use Case) 를 도출하며, 이후 클래스 설계(Class Design), 상호 작용 다이어그램(Interaction Diagram), 배포 다이어그램(Deployment Diagram) 등의 다양한 설계 산출물로 발전한다. 다이어그램(Diagram)이란 쉽게 말해 시스템을 시각적으로 표현한 그림이다. 이러한 다이어그램을 활용하면 시스템의 구조와 동작 방식을 직관적으로 이해하고, 효과적으로 문제를 해결할 수 있다. 특히, 유스케이스 도출 단계는 프로젝트의 방향과 결과에 결정적인 영향을 미치는 핵심 과정이다. 이번 글에서는 UML 유스케이스 다이어그램에 대해..


운영체제는 컴퓨터 시스템에서 핵심적인 역할을 담당하는 소프트웨어로, 하드웨어와 응용 프로그램 사이에서 중재자 역할을 하며 시스템 자원을 효율적으로 관리한다. 오늘은 운영체제의 주요 개념과 역할, 그리고 그 발전 과정을 살펴보겠다. 1. 운영체제의 역할운영체제라는 개념이 다소 낯설게 느껴질 수도 있다. 간단히 말해, 운영체제는 컴퓨터 시스템의 자원을 효율적으로 관리하고 활용할 수 있도록 돕는 핵심적인 소프트웨어다. 또한, 응용 프로그램과 하드웨어 간의 중재자 역할을 수행하여 원활한 상호 작용을 가능하게 한다. 운영체제는 크게 사용자 인터페이스(편리성), 자원 관리(효율성), 시스템 관리(보안 및 안정성) 등의 역할을 수행한다. 즉,사용자에게 직관적인 환경을 제공하고, 시스템 자원을 효과적으로 분배하며, 보..


2000년대 이전까지 소프트웨어 개발은 전문가들의 영역이었지만, 점차 일반인들도 소프트웨어를 개발할 수 있는 환경이 조성되었다. 이에 따라 많은 소프트웨어 기업이 등장했으나, 변화하는 기술을 따라가지 못하거나 비효율적인 개발 방식(예: 폭포수 모델)으로 인해 경쟁에서 밀려났다. 반면, 일부 기업은 새로운 방식을 도입하며 생존했다. 구글, 애플, 아마존과 같은 빅테크 기업들은 기존의 통합 프로세스를 따르지 않고, 빠른 개발과 유연한 조직 문화를 구축했다. 특히 구글은 긴 회의를 지양하고, ‘스크럼(Scrum)’을 활용해 신속한 개발을 진행했다. 이러한 방법론은 이후 ‘애자일(Agile)’로 정착되었으며, 빠르게 개발하고 테스트하는 반복적인 접근 방식을 통해 기존보다 훨씬 효율적인 개발이 가능해졌다. 대표적..

안녕하세요! 이번에 평소와는 다른 방식으로 글을 작성하는 이유는, 제가 목표로 했던 UNIST의 원하는 분야에 성공적으로 컨택을 하게 되었기 때문입니다. 이 기회를 통해 인터뷰를 준비 중이며 너무 기쁜 마음에 이렇게 글을 남기게 되었습니다. 사실, 저는 특별한 배경을 가진 사람은 아닙니다. 평범한 대학에서 공부하고 있지만, 제 관심 분야는 항상 AI와 생물학의 융합이었고, 이 분야에 대한 열정은 계속해서 커져만 갔습니다. 최근 유튜버 김책임 선생님 덕분에 '바이오인재육성연구소'라는 프로그램을 알게 되었고, 그분의 도움으로 논문 읽는 법, 내 세부분야를 찾는 방법, 연구실 선택에 대한 이야기 등을 배울 수 있었습니다. 이 프로그램은 제게 큰 도움이 되었으며, 특히 논문을 읽을 때 핀트를 잡지 못했던 저에게..


소프트웨어 개발은 상당한 시간과 비용이 요구되는 작업이다. 효과적인 개발을 위해 단계적이고 체계적인 계획을 수립하는 것은 분명히 도움이 되지만 현실적으로는 다양한 도전 과제에 직면하게 된다. 개발 과정에서 사람은 실수를 저지를 수 있으며, 요구사항은 지속적으로 변화하기 때문에 개발이 완료되었다고 해서 모든 작업이 끝난 것이 아니다. 이후에도 유지보수와 수정이 필요하며, 새로운 요구사항에 따라 기능을 확장하거나 수정해야 할 수도 있다. 그러나 전통적인 폭포수 모델과 같은 소프트웨어 개발 방법론은 이러한 변화에 유연하게 대응하기 어렵다는 한계를 지닌다. 따라서 오늘은 이러한 문제를 해결하기 위해 제안된 여러 소프트웨어 개발 모델들에 대해 살펴보겠다. 1. 진화적 프로세스 모델 가장 먼저 소개할 모델은 진화적..


네트워크는 데이터를 효율적으로 전송하기 위해 설계된다. 단순히 무작위 방식으로 데이터를 주고받을 수도 있지만, 이는 확장성과 관리 측면에서 비효율적이다. 따라서 네트워크 구조를 여러 계층으로 분리하여 각 계층이 독립적으로 동작하도록 설계하면 확장성을 확보하고 복잡도를 줄일 수 있다. 이러한 계층 구조를 정의하는 대표적인 표준 모델이 OSI(Open Systems Interconnection) 모델이다. OSI 모델을 따르는 것은 필수 사항은 아니지만, 이를 준수하면 데이터 통신을 보다 체계적이고 효율적으로 수행할 수 있다. 또한, 일부 계층을 통합하는 것도 가능하지만, 이 경우에도 각 계층이 제공해야 하는 필수 기능이 유지되어야 하며, 계층 통합은 확장성을 제한할 수 있다는 점을 고려해야 한다. 이번 포..


과거의 컴퓨터 시스템은 하나의 연산을 수행하기 위해 매우 복잡하고 비효율적인 절차를 거쳤다. 예를 들어, 단순한 계산을 실행하기 위해 데이터를 입력한 후 최소 6시간이 소요되었으며, 사용 언어가 다르면 언어 변환 과정에서 추가 시간이 필요했다.이러한 비효율성을 극복하기 위해 현대의 컴퓨터 시스템은 연산을 분할하고 최적화하는 기법을 도입하였으며, 그 중심에는 운영체제(OS, Operating System)가 자리잡고 있다. 운영체제는 하드웨어 자원의 효율적 관리와 프로그램 실행의 조율을 통해 전체 시스템의 성능을 극대화한다. 이번 포스터는 이에 대해 운영체제와 컴퓨터 시스템에 관해서 자세하게 설명하도록 하겠다. 1. 컴퓨터 시스템의 개요현대 컴퓨터 시스템은 크게 세 가지 구성 요소로 이루어진다.응용 프로..


빅데이터 처리는 단순한 데이터 처리와 달리 복잡한 과정을 포함한다. 일반 데이터보다 더 많은 시간과 다양한 고려사항이 필요하며, 이로 인해 데이터의 생성부터 수집, 저장, 처리, 분석, 표현까지 전체 과정에서 특화된 기술들이 사용된다. 본 포스터에서는 이러한 전체적인 처리 과정을 단계별로 살펴보고, 빅데이터의 종류 및 수집 방법 등 세부 항목에 대해 구체적으로 이야기하고자 다.1. 빅데이터 전체 처리 과정 빅데이터 처리의 기본 흐름은 데이터 소스 → 수집 → 저장 → 처리 → 분석 → 표현의 순서를 따릅니다. 각 단계에서는 다음과 같은 기술과 방법이 활용된다.과정영역개요생성내부 데이터데이터베이스(Database), 파일 관리 시스템(File Management System)외부 데이터인터넷으로 연결된 파..


빅데이터는 단순히 방대한 정보 집합이 아니라, 그 활용 여부에 따라 엄청난 가치를 발휘할 수 있는 중요한 자원이다. 효과적인 빅데이터 처리를 위해서는 빅데이터 자체에 대한 깊이 있는 이해가 필수적이며, 이를 기반으로 상황에 능동적으로 대응하거나 미래 변화를 예측할 수 있다. 이번 포스터에서는 빅데이터 처리와 관련된 핵심 개념 및 최신 동향을 다음과 같이 살펴보고자 한다. 1. 데이터 변화 최근 몇 년간 데이터의 양과 접근성은 눈부신 발전을 이루었다. 과거 PC 중심의 시대를 지나, 인터넷과 모바일 환경이 보편화됨에 따라 데이터는 언제 어디서나 손쉽게 생성되고 소비되고 있다. 실제로 2025년과 불과 5년 전을 비교할 때, 데이터 증가는 지수함수적 성장을 보이고 있다. 특히, 2007년부터 전 세계에서 생..


문제유형브루트 포스 알고리즘풀이 방법 도출 과정1. 몸무게가 x 키가 y라고 하면 (x,y)가 있는데 몸집을 대고 등수를 구하는 문제2. 하지만 x보다 크고 y보다 크면 몸집이 크다고 할 수 있음, 하지만 x보다 크지만 y보다는 작으면 그건 몸집이 크다고 할 수 없음 그 반대도 마찬가지임. 3. 이를 구현하고자 하는데 브루트포스적으로 풀어보도록 하겠다.시간 복잡도시간 복잡도는 a와 b를 구분하기 위해 for문을 중첩으로 쓰였기 때문에 O(N^2)이다. 그러나 N이 최악의 경우 50을 넘지 않기 때문에 시간복잡도에서 아무런 문제가 없다. 코드 및 간단설명브루트 포스 알고리즘을 사용하여 풀었다. N = int(input()) # 사람 수 입력people = [list(map(int, input().spli..


소프트웨어 개발은 체계적인 접근 없이는 성공하기 어렵다. 무계획적이고 즉흥적인 방식으로 개발하는 대신, 명확한 계획과 절차에 따라 진행되어야 한다. 이를 위해 테스트(test)를 포함한 다양한 관리 기법이 필요하며, 그 중에서도 가장 중요한 것은 모듈(Moduel)화다. 모듈화는 시스템을 개별 단위(unit)로 분리하여 개발과 유지보수를 용이하게 만들고, 확장성 및 재사용성을 높이는 데 기여한다. 또한, 소프트웨어 품질을 확보하기 위해서는 validation(유효성 검사)과 verification(검증)과 같은 절차가 필수적이다. 이러한 체계적인 개발 및 관리 방법을 대표하는 모델 중 하나가 바로 V모델이다. V모델은 순차적인 개발 프로세스를 따르면서도 각 단계에서 테스트와 검증을 철저히 수행하여, 전체..


네트워크 모델의 대표적인 예로 OSI 모델이 있다. 이 모델은 데이터 통신을 이해하고 설계할 때 유용한 참조 모델이다. 반면, 5계층 모델도 존재하는데, 이는 7계층을 단순화한 형태로 실용적인 사용이 가능하기 때문이다. 데이터 통신에서 계층 구조는 매우 중요한 개념이며, 이를 통해 전체적인 통신 과정을 체계적으로 설명할 수 있다. 이번 포스터에서는 OSI 모델에 대한 전반적인 내용을 이야기해보도록 하겠다. 1. 계층화된 임무 데이터 통신은 계층적으로 이루어진다. 이는 우리가 우체국을 통해 편지를 보내는 과정과 유사하다. 예를 들어, 편지를 작성하고, 이를 봉투에 넣고, 우체국을 통해 발송하면, 수신자는 편지를 개봉하고 내용을 확인하는 과정을 거친다. 마찬가지로, 네트워크에서도 데이터는 특정한 절차를 거쳐..


소프트웨어는 단순히 프로그래밍 코드의 집합이 아니다. 소프트웨어에는 원시 코드뿐 아니라, 자료구조, 데이터베이스 설계, 테스트 결과와 같이 개발 과정에서 산출되는 다양한 결과물은 물론, 각 단계에서 작성되는 문서와 사용자 매뉴얼 등도 포함된다. 이와 같이 소프트웨어 개발 전반에 공학적 접근법을 적용하여 체계적으로 관리하고 최적화하는 학문 분야가 바로 소프트웨어 공학(Software Engineering)이다. 소프트웨어 공학은 기획, 요구사항 분석, 설계, 구현, 테스트, 배포 등 전체 개발 과정을 효율적으로 수행할 수 있도록 연구하고 있으며, 그 중에서도 이번 글에서는 계획(Planning) 단계에 초점을 맞추어 살펴보고자 한다.1. 소프트웨어의 이해 소프트웨어는 단순한 프로그래밍 언어로 작성된 원시 ..


문제유형브루트 포스 알고리즘풀이 방법 도출 과정1. 영화 제목을 짓는데 순서가 666, 1666, 2666이렇게 짓는 다는 것이다. 6이 적어도 3이상 연속으로 들어가는 수를 찾는 다는 것이다.2. 일반화해서 생각하면 N번째 영화의 제목은 세상의 종말(N번째로 작은 종말의 수)와 같다. 3. 처음에는 단순히 (N-1) 뒤에 666을 붙이면 영화 제목이 나온다고 생각할 수 있다. 예로 들어 500번째 영화 제목은 499666이라고 예상할 수 있다.4. 하지만 실제로는 모든 종말의 수를 작은 수부터 정렬했을 때 500번째는 166699가 된다. 이는 단순히 (N-1)666형태가 아니다. '666'을 포함하는 모든 수를 오름차순으로 나열했을 떄의 순서이기 때문이다.5. 예로 들어서 순서는 다음과 같다. 666..


1. 데이터 표현데이터는 문자, 숫자, 이미지, 음성, 동영상 등 다양한 형태로 표현될 수 있다. 이러한 데이터는 디지털 환경에서 0과 1의 비트 패턴으로 부호화되어 전송된다.문자 데이터: 문자는 비트 패턴을 이용해 부호화되며, 이를 표준화하기 위해 아스키(ASCII) 코드가 개발되었다. 그러나 아스키 코드만으로는 다양한 언어와 기호를 표현하기 어렵기 때문에, 보다 확장된 문자 인코딩 방식인 유니코드(Unicode)가 도입되었다.이미지 데이터: 이미지는 픽셀(pixel) 단위로 표현되며, 각 픽셀은 특정한 색상 값을 가진다.음성 및 동영상 데이터: 음성과 동영상은 아날로그 신호를 디지털 데이터로 변환한 후, 특정 압축 알고리즘을 사용하여저장 및 전송된다.2. 네트워크네트워크는 데이터를 주고받을 수 있도록..


문제유형정렬풀이 방법 도출 과정1. 알파벳 소문자로 이루어진 N개의 단어가 들어오면 "길이가 짧은 것부터", "길이가 같으면 사전 순으로" 우선순위 대로 정렬하는 것이 문제이다.2. 입력은 첫째줄에 얼마정도 나타나는 지(N) 나머지는 정렬할 대상이 온다. N은 20000만 이하, 문자열의 길이는 50을 넘지 않음3. sort 알고리즘을 쓰며, lambda함수를 사용하여 정렬을 해보도록 하겠다.시간 복잡도시간 복잡도는 O(N)이다. 시간복잡도가 최악이 될 경우 2만이기에 시간복잡도 부분에서 안정하다. 코드 및 간단설명정렬을 사용하여 고쳐보았다. N = int(input())result = set() # 중복 제거를 위해 set 사용for i in range(N): A = input() resu..


문제유형문자열풀이 방법 도출 과정1. 주어진 문제는 특정 규칙을 기반으로 문자열을 예측하는 문제이다.2. 문자열이 연속적으로 주어지며, 그 깅리은 최대 8 이하이다. 특정 패턴이 전용되며 이를 기반으로 다음에 올 문자열을 예측해야한다.2. 이 문제는 게임 "369"와 유사하지만 다른 규칙을 따른다.3. 적용되는 규칮은 이와 같다. 숫자가 3의 배수이면서 5의 배수이면 "FizzBuzz"를 출력한다. 3의 배수이기만 하면 "Fizz" 5의 배수이기만 하면 "Buzz"를 출력한다. 둘다 해당하지 않는다면 숫자 그대로 출력한다. 4. 이를 해결하기 위해 문자열이 연속되다가 숫자가 등장하는 경우 해당 숫자를 활용하여 이후 문자열을 결정하는 방식을 적용한다.5. 특정 숫자가 주어지면, 이를 기반으로 문자열을 생성..


문제유형조합풀이 방법 도출 과정1. 간단한 이항계수를 구하면 되는 문제.2. 이를 위해서 itertools를 쓰면 된다. 이를 사용하여 이항계수를 구하면 간단하게 할 수 있다. 시간 복잡도시간 복잡도는 range(1, N +1) C K다. 최악의 경우 N이 10일 경우를 생각하면 1~10C1이라고 가정해도 1억은 넘지 않는다.코드 및 간단설명조합 알고리즘을 사용하였다. from itertools import combinationsresult = []N, K = map(int, input().split())# range(N)로 1부터 N까지의 숫자를 iterable로 만든 후, 그로부터 K개의 조합을 구함result.extend(combinations(range(1, N + 1), K))print(len..


1. 데이터통신과 네트워크 개요 데이터통신과 네트워크는 이미 구축된 시스템이 어떻게 동작하는지 분석하고, 이를 효율적으로 활용하는 방법을 학습하는 과정이다. 주요 내용은 프로토콜의 개념과 필요 요소를 이해하는 것이며, 이를 기반으로 통신 기법을 프로그래밍에 적용하는 방법을 생각할 수 있다.2. 데이터통신 개념 - 데이터 통신(Data Communication): 최소 두 명 이상의 정보 송·수신자가 존재하며, 데이터를 공유하는 과정.- 데이터(Data): 정보 생성자와 소비자 간의 공유를 위해 만들어진 것. 3. 정보 전달의 신뢰성 요소 - 전달(Delivery): 데이터가 목적지까지 도달해야 함. - 정확성(Accuracy): 송신된 데이터와 수신된 데이터가 동일해야 함. - 적시성(Timeline..


문제유형수학풀이 방법 도출 과정1. 땅 위의 달팽이가 V미터인 나무 막대를 올라간다. 달팽이는 낮에 A미터 올라가는데 밤에는 B미터 떨어진다. 달팽이가 나무 막대를 모두 올라가려면, 몇일 걸리는지 구하는 문제2. 입력: A, B, V 3. 예제 분석1일차: (A - B)2일차: (A - B) + (A - B) 3일차: (A - B) + (A - B) + (A - B) 일반화 하면 (A - B) x (n - 1) + A 4. 이식을 변형하면 (A - B) x (n - 1) + A >= V이것을 n에 관하여 정리하면 다음과 같아진다. n >= V-A/A-B + 1 그런데 이가 마지막 날에는 미끌어지지 않기 때문에 +1를 삭제한다.시간 복잡도시간 복잡도는 O(1)이다. 코드 및 간단설명수학을 사용하였다. ..


문제유형다이나믹 프로그래밍(동적 계획법)풀이 방법 도출 과정1. 물건 N개의 물건이 있다. 각 물건은 무개W와 가치 V를 가지는데 최대 K만큼의 무개만큼 넣는다고 가정했을 때, 가치V가 가장 높을 때의 값을 구하는 문제이다.2. 첫 줄에 입력은 N, K 나머지는 W, V이다. 3. 가장 먼저 일단 가장 W가 채워질 가능성을 찾고 그 뒤로 그 가능성 중에 가장 나은 것을 고르는 방법이 있다. 이 방법은 최악의 경우 100C50이 나오는데 이는 1억을 넘는 것이기에 사용하지 않겠다. 4. 두번째로 그리디 알고리즘을 사용하는 방법이 있는데 이를 위해 가치 대비 무개 비율이 높은 순서대로 정렬한 다음 가능한 한 많은 물건을 선택한다고 해서 정확한 최적해를 보장하기에는 적절하지 않다. 5. 그러므로 동적 계획법을..


문제유형다이나믹 프로그래밍(동적 계획법)풀이 방법 도출 과정1. 아파트의 거주 인원을 계산하는 문제이다. 특정 층(k)와 호(n)에 몇 명이 살고 있는지 구해야한다.2. 거주 규칙은 다음과 같다. 3. 0층의 i호에는 i명이 거주한다.4. k층의 n호에 살려면, 바로 아래층(k-1)의 1호부터 n호까지 거주하는 사람들의 합만큼 데려와야 한다. 5. 예를 등러 1틍과 2층의 3호까지를 살펴보자1층1호: 0호 1호(1명) -> 1명2호: 0층 1호(1명) + 0층 2호(2명) -> 3명3호: 0층 1호(1명) + 0층 2호(2명) + 0층 3호(3명) -> 6명따라서 1층 3호 (n호)거주 인원은 총 6명이다. 2층1호: 1호 1호(1명) -> 1명2호: 1층 1호(1명) + 1층 2호(3명) -> 4명3..


문제유형수학(최대 공약수, 최소 공배수)풀이 방법 도출 과정1. 두개의 자연수의 최대공약수와 최소공배수를 구하는 문제이다.2. 최대공약수와 최소공배수를 곱한 것이 두개의 자연수를 곱한 것이 된다.3. 최대공약수를 먼저 구한 후, 이를 이용해 최소공배수를 구하는 방식으로 문제를 해결할 수 있다. 시간 복잡도시간 복잡도는 N(M + M_list)인데 그냥 O(N)으로 표현할 수 있다. 코드 및 간단설명문자열의 특성을 활용하였다. M, N = map(int, input().split())M_list = []N_list = []for i in range(1, M + 1): if M % i == 0: M_list.append(i)# M의 약수 중 N의 약수인 것 찾기 (공약수)for j in r..


문제유형문자열풀이 방법 도출 과정1. 앞에서 읽어도 같고 뒤에서 읽어도 같은 수를 찾는 문제2. 그냥 숫자를 뒤집어 놓고 맞는 것을 고르면 된다. 단, 문자열로 사용해야한다. 시간 복잡도시간 복잡도는 N(A)이다. 코드 및 간단설명문자열의 특성을 활용하였다. while True: A = list(map(int, input().strip())) # 입력을 문자열로 받아서 리스트 변환 if A == [0]: # 종료 조건 break if A == A[::-1]: # 리스트를 뒤집어 비교 print('yes') else: print('no')다른 풀이1) 문자열의 앞뒤를 한 번에 비교 아래 코드는 리스트 전체를 뒤집어 비교하는 대신 문자열의 앞..


문제유형동적 계획법풀이 방법 도출 과정1. 두 개의 부분 수열이 주어졌을 때, 두 수열 모두에 공통으로 등장하는 부분 수열의 개수를 구하는 문제이다.2. 각 수열의 가능한 부분 수열의 수는 길이가 n일때 약 2에 n 개이다. 에를 들어 길이가 1000인 수열은 2에 1000개의 부분 수열을 갖게 되므로, 모든 경우를 생성해 비교하는 방식은 계산량이 기하급수적으로 증가해 실제로는 불가능하다.3. 그렇다면 그리디 알고리즘으로 접근해보도록 하면 한 수열을 순회하며 특정 패턴(예: 'A', 그 다음 'AC' 등)을 차례로 찾아 나가는 그리디 방식은 일부 경우에는 효과적일 수 있으나. 항상 최적의 해답을 도출하지 못할 뿐 아니라, 최악의 경우 불필요한 중복 연산이 많아져 시간 복잡도가 크게 증가할 수 있다.4...