문제 13909번: 창문 닫기 첫 번째 줄에는 창문의 개수와 사람의 수 N(1 ≤ N ≤ 2,100,000,000)이 주어진다. www.acmicpc.net 서강대학교 컴퓨터공학과 실습실 R912호에는 현재 N개의 창문이 있고 또 N명의 사람이 있다. 1번째 사람은 1의 배수 번째 창문을 열려 있으면 닫고 닫혀 있으면 연다. 2번째 사람은 2의 배수 번째 창문을 열려 있으면 닫고 닫혀 있으면 연다. 이러한 행동을 N번째 사람까지 진행한 후 열려 있는 창문의 개수를 구하라. 단, 처음에 모든 창문은 닫혀 있다. 예를 들어 현재 3개의 창문이 있고 3명의 사람이 있을 때, 1번째 사람은 1의 배수인 1,2,3번 창문을 연다. (1, 1, 1) 2번째 사람은 2의 배수인 2번 창문을 닫는다. (1, 0, 1)..
📺 시리즈 2023.10.02 - [Go/디자인 패턴] - [Go] SOLID in Go - SOLID란? 2023.10.03 - [Go/디자인 패턴] - [Go] SOLID in Go - 구조체와 메서드 2023.10.04 - [Go/디자인 패턴] - [Go] SOLID in Go - 인터페이스 2023.10.09 - [Go/디자인 패턴] - [Go] SOLID in Go - 컴포지션 🎁 패키지 Go의 패키지는 다른 프로그래밍 언어에서의 라이브러리나 모듈의 개념으로, '.go' 접미사를 가진 연관된 코드들을 디렉터리 단위로 모아 코드의 재사용성을 높이는 중요한 개념입니다. 패키지 선언 파일의 맨 위에 'package' 키워드를 사용하여 패키지를 선언합니다. 예를 들어, 'package main'은 메인..
📺 시리즈 2023.10.02 - [Go/디자인 패턴] - [Go] SOLID in Go - SOLID란? 2023.10.03 - [Go/디자인 패턴] - [Go] SOLID in Go - 구조체와 메서드 2023.10.04 - [Go/디자인 패턴] - [Go] SOLID in Go - 인터페이스 🔗 컴포지션 Go는 상속을 지원하지 않습니다. 대신 구조체 안에 구조체 또는 인터페이스를 임베딩하는 컴포지션을 사용합니다. 인터페이스 또는 구조체에 다른 타입을 임베딩할 수 있게 함으로써 임베딩된 내부 타입의 메서드를 외부 타입이 차용할 수 있습니다. 구조체 임베딩 해적단에는 먼저 선원(Crew)이 있습니다. 선원들은 저마다 이름(Name)을 가지고 있습니다. 그리고 뱃노래를 부를(SingShanty) 수도 있..
🪓 서킷 브레이커(Circuit Breaker)란? 서킷 브레이커는 실패할 가능성(likely to fail)이 있는 작업이 반복적으로 실행되는 것을 방지하기 위한 디자인 패턴의 일종입니다. 서킷 브레이커는 원격 서비스에 대한 요청을 모니터링하여 오류 수를 측정하고, 오류 수가 임계치(threshold)를 넘어가게 되면 원격 서비스로의 요청을 차단하여 장애가 발생한 부분을 격리, 빠르게 오류를 반환함으로써 불필요하게 자원이 낭비되는 것을 방지합니다.🤲 서킷 브레이커는 왜 필요한가? 사용자의 요청이 서비스 A를 거쳐서 서비스 B로 전달됩니다. 그런데 예기치 않은 문제로 인해 서비스 B가 서비스 A에게 응답을 주지 못하고 있습니다. 이 경우 서비스 B의 장애가 서비스 A로 전이되어 서비스 A는 사용..
📑 context 패키지 Go의 context 패키지는 API의 경계를 넘어, 프로세스 간의 종료 시점, 취소 신호 그리고 요청 범위 값을 전달하는 Context 타입을 정의합니다. 쉽게 말해, Context 타입을 사용하여 작업 흐름을 제어할 수 있습니다. type Context interface { // context가 취소되어야 하는 시점을 반환합니다. // 만약 취소되어야 하는 시점이 없다면, ok는 false를 반환합니다. Deadline() (deadline time.Time, ok bool) // context가 취소되었을 때 닫히는 채널을 반환합니다. // 만약 취소될 수 없는 context라면, Done은 nil을 반환합니다. Done()
📺 시리즈 2023.10.02 - [Go/디자인 패턴] - [Go] SOLID in Go - SOLID란? 2023.10.03 - [Go/디자인 패턴] - [Go] SOLID in Go - 구조체와 메서드 👾 인터페이스 인터페이스를 사용하면 구조체와 메서드를 사용해 구현한 구체화된 객체가 아닌 추상화된 객체를 통해 객체 간의 상호작용을 정의할 수 있습니다. 인터페이스는 메서드의 이름, 매개변수와 반환값의 타입을 정의하며, 이를 구현하는 것은 구조체 또는 별칭 타입과 같은 타입에 달려있습니다. type DuckInterface interface { Say() Swim() Walk(distance int) int } Go에서 인터페이스는 'implements'와 같은 구현을 위한 명시적인 키워드를 사용하지 ..
📺 시리즈 2023.10.02 - [Go/디자인 패턴] - [Go] SOLID in Go - SOLID란? 🐭 Go는 클래스와 객체 대신 값과 타입을 가지고 있다 Go는 클래스(class)와 객체(object)를 사용하는 대신 다음과 같이 구조체(struct)와 다른 타입을 기반으로 정의된 타입(type)을 사용합니다. type Gopher struct { // 구조체: 필드들의 집합체 Name string State GopherState } func (g Gopher) String() string { return fmt.Sprintf("%s is %s", g.Name, g.State) } type GopherState int8 // 별칭 타입: int8을 기반으로 새로운 타입을 정의 const ( Aw..
💧 SOLID 원칙 SOLID 원칙은 객체지향 설계 다섯 가지 원칙의 앞글자를 따서 만든 용어로, 로버트 C. 마틴(Robert C. Martin)에 의해 제시되었습니다. 단일 책임 원칙 (Single Responsibility Principle, SRP) 개방-폐쇄 원칙 (Open-Closed Principle, OCP) 리스코프 치환 원칙 (Liskov Substitution Principle, LSP) 인터페이스 분리 원칙 (Interface Segregation Principle, ISP) 의존성 역전 원칙 (Dependency Inversion Principle, DIP) 이 다섯 가지 원칙들은 반드시 지켜야 하는 의무사항은 아니지만, 좋은 설계를 위해 지향해야 하는 원칙들입니다. 💯 좋은 설계..
go를 사용하다 보면 문자열과 바이트 슬라이스를 상호 변환하여 사용해야 되는 경우가 자주 발생합니다. 특히 io.Writer 인터페이스의 Write 메서드가 인수로 바이트 슬라이스를 넘겨받기 때문에 더 그런 것 같습니다. 문자열을 바이트 슬라이스로 변환하거나 바이트 슬라이스를 문자열로 변환하는 방법은 여러 가지가 있습니다. 이번 게시물에서는 각 방법들을 살펴보고 벤치마킹을 통해 성능을 비교해 보겠습니다. 1. string -> []byte 변환 1.1 Type Conversion // 1. 타입 컨버젼을 사용하는 방법 func StringToBytesConversion(s string) []byte { return []byte(s) } 타입 컨버젼을 사용하는 방법은 문자열을 []byte()로 감싸주면 됩..
😪 잠자는 이발사 문제란? '잠자는 이발사 문제'는 운영체제의 프로세스 간 통신과 그들의 동기화 문제를 직관적으로 설명하기 위한 문제입니다. 잠자는 이발사 문제는 다음과 같이 정의됩니다. 이발사: 이발사는 고정된 개수의 대기석이 있는 바버샵으로 출근합니다. 대기 중인 손님이 있다면 손님을 이발 의자에 앉혀서 이발을 해 주고, 대기 중인 손님이 없다면 이발사는 낮잠을 잡니다. 손님: 손님은 이발을 받으러 바버샵에 갑니다. 이발사가 다른 손님을 이발하고 있다면 대기석으로 이동합니다. 대기석이 비어있으면 빈자리에 앉아서 기다리고, 그렇지 않다면 바버샵을 나갑니다. 이발을 받을 차례가 된 손님은 이발 의자로 이동하며 이발사가 자고 있다면 이발사를 깨웁니다. 문제: 이발사와 손님의 행동 시간이 확실하게 구분되어 ..