
백준 풀기를 시작해야 겠다고 마음 먹은 지 1일차..백준 문제 푼 것을 깃허브에 푸쉬할까 벨로그에 올릴까 고민하던 중 백준 허브라는 기깔난 확장 프로그램을 알게 되어서 깃허브에 정리하기로 결정!백준허브는 Leetcode의 제출 코드를 자동 푸시해주는 LeetHub라는

매우 간단한 문제이지만 배열과 BufferedReader를 쓰냐 안 쓰냐 여부에 따른 성능 차이가 궁금하여 비교해 보았다여기서 StringBuilder란?String자바의 String 클래스는 인스턴스를 생성할 때 지정된 문자열을 변경할 수 없다! 문자열을 합칠 때마다

이번에도 쉬운 문제이지만, 1차원 배열이 아닌 HashSet을 사용하여 풀 수도 있어서 java를 공부할 겸 정리해보려고 한다.HashSet은 Set 인터페이스를 구현한 가장 대표적인 컬렉션으로, Set 인터페이스의 특징대로 중복된 요소를 저장하지 않는다.새로운 요소를

배열에서 max를 구하는 방법을 여러가지로 해보았다. 물론, 배열을 사용하지 않고도 풀어 보았다.모두 Scanner가 아닌 BufferedReader를 사용했다.double형으로 다 맞추기 주의...성능 차이는 별로 없고, Math 함수 쓰는 게 가장 좋구만역시 배열

우선 그냥 내가 떠올린 노가다 방법이다. if문 대신 switch문을 사용했고 인덱스 범위 안에 있는지 꼭 확인하고, and과 or 연산자 사이에서 괄호에 주의하자!!(엄청난 런타임 에러를 겪음ㅎ)분명 다른 간단한 방법이 있을 것 같아서 구글링해서 찾은 방법이다.크로아

해당 알파벳이 나온 적이 있는지 검사하는 배열은 int로 하느냐, boolean으로 하느냐에 차이를 두어보았다.연속된 배열인지 확인하는 거 첨에 놓쳤고, 배열을 for문 안에 두어서 항상 초기화하기 놓치지 말자!아주 근소하게 코드가 간결해진 거지 역시나 거의 차이 없당

switch문은 너무 일차원적이라서 등급과 평점을 다른 배열에 저장해두고, 해당 등급을 갖는 인덱스 값을 이용해서 평점 배열에서 평점을 찾는 식으로 코드를 짜 보았다.그런데, 2차원 배열로도 할 수 있지 아늘까?🤔🟣 grade.equals("P")➡️ 처음에 gra

2차원 배열을 2개 생성해서 더하는 것보다 1개의 2차원 배열에서 바로 값을 더하는 게 효율적이라고 생각해서 그렇게 풀어보았다.2차원 배열의 값을 2번 받기 때문에, 반복분에서의 코드를 조금 다른 방식들로 해보았다.(거기서 거기지만ㅎ)2차원 배열에 값을 넣는 반복문과

겹치는 부분을 어떻게 할까,,하다가 boolean타입의 2차원 배열을 만들어서 겹치는 부분을 100\*n에서 빼려고 했는데 넘 이상한 것 같아서... 결국 구글링을 했다.너무나도 간단하게 겹치지 않으면 count++를 하면 된다니...!! 왜 그걸 못 떠올렸을까

문제 자체를 이해하지 못해 끙끙대다가 구글링해서 이해했다 ㅎㅎ 근데 문제는! 이제 java에 익숙해져서 파이썬으로 풀려고 했더니 코드 구현을 못 하겠는 거다 ㅎㅎㅎ 이것만 풀고 다시 처음부터 파이썬으로 풀어야겠다.. 조급해 하지 말기!

이번에는 10진수를 2진수로 변환하는 방법을 생각해보자.전 포스트에서 살펴본 1010은 10진법으로 나타내면 10이었다. 10에서 어떻게 1010으로 바꾸는 방법은 아래와 같다. (폰 메모장으로 그려서 진짜 볼품없네)이렇게 몫을 계속 나누고, 나머지의 역순이 2진법으로

구글링하면 가장 많이 나왔던 방법으로, EOF를 만나면 input을 받아들일 수 없으므로 error가 발생하여 예외처리를 하는 코드이다.구글링을 통해 새롭게 알게 된 방법이다.stdin을 이용하여 애초에 모든 입력을 받아버리는 코드이다.sys.stdin은 파일 객체처럼

그냥 for문으로 푸는 방식을 떠올렸는데, 분명 파이썬에는 좋은 방법이 있을 것 같아서 찾아보았다. remove를 쓰는 방법이 가장 좋은 방법인 것 같았고, 추가로 if not을 쓰는 방법도 있어서 정리해 보았당참고로 다 예쁘게 정렬되어 있는 리스트이기에 정렬을 하거나

다른 풀이 방법이 있는지 찾아보는 중, set 함수라는 걸 알게 되어서 포스팅해보았다 방법1

인덱스 조심하여 짱구를 굴려서 코드를 작성해보았는데 분명히분명히 더 좋은 방법이 있을 것 같아 찾아보았다. 역시 reverse라는 멋진 메소드가 있더라ㅎ배열에 인덱스 0~4까지 1~5의 숫자를 넣었고, a~b(문제에서는 i~j)의 범위에서 딱 반만 끊고 양 끝 바구니의

내가 직접 반복문을 돌리지 않고 내장함수를 사용함으로써 코드가 아주 간단해졌다.문제 의도에 맞게 정직하게 새로운 리스트를 생성해서 달라진 점수를 담았다. 그리고 그 배열의 평균을 반환했다.아래서부터 1~3 코드이다. 놀랍게도 메모리와 시간이 모두 완전히 동일하다.그래서

split()을 사용하지 않았기 때문에 입력된 문자열을 개별 문자로 변환했고, 이를 int로 변환한 후 리스트로 저장하였다.그리고 sum을 이용하면 반복문을 쓰지 않고도 리스트의 합을 바로 구할 수 있다니,, 역시 파이썬은 최고다.추가로, sum(nums, 1000)하

1번은 내가 떠올린 코드이고, 분명 다른 방법이 있을 것 같아서 검색해보니 재밌는 아이디어가 있어서 정리해 보았다.파이썬은 알파벳의 자리를 찾을 때 이런 식으로 알파벳을 나열한 리스트를 자주 사용하는 것 같다.for문을 직접 작성하지 않고 해당 알파벳이 S에 있으면 바

문제를 딱 보고, 파이썬의 장점을 이용할 수 있는 두 가지 방법이 떠올랐다. reverse와 슬라이싱이었고, 이런 방법으로 푸는 방법을 전에 포스팅한 적이 있지만, reverse에서 자잘한 실수가 있었어서 정리를 또다시 해보았다.A = list(A): reverse는

여기서 주의할 점은1\. 한 줄이 아닌 전체를 받아와야 하므로 readline()이 아닌 readlines()여야 한다.2\. readlines()으로 받아왔기 때문에 개행문자도 포함되어 이를 제거해주어야 한다. rstrip이든 strip이든 둘 중 하나 써주면 된다.

1부터 2\*n-1까지의 범위를 한 반복문에 쓰는 방법과 두 반복문에 나눠서 쓰는 방법으로 2가지를 작성해 보았다.개인적으로 두 번째 방법이 더 나은 것 같당ㅎ

또또 슬라이싱과 reverse를 사용하는 문제인데, 이번에는 reverse가 아닌 reversed를 사용했다. 그런데, reversed와 reverse의 차이점이 보여서 정리해보려고 글을 작성한당reverse는 반환한 리스트를 반환해주지 않기 때문에 reversed를

예전에 자바로 풀었던 풀이 방식과 동일하게 문제를 풀어보았고, 분명 더 좋은 방법이 있을 것 같아서 풀이를 찾아보았다. 파이썬의 내장함수를 제대로 알고 있어야 활용가능한 코드가 있어서 정리해보려고 한당출력할 때 대문자로 해야 하고, 나는 각 알파벳이 나온 횟수를 저장하

파이썬에는 switch문이 없어 if는 너무 일차원적이고 지저분할 것 같아서 쓰기 싫었다.. in을 생각했으나 같은 크로아티아 알파벳이 여러 개 존재가능하지만 쟤는 여부만 판단하기에 X. find도 dz=와 z= 같은 경우 모두 셀 수 있고 in처럼 여러 개 카운팅 불

여태 가장 오래 걸렸던 문제,,, 코드의 위치에 따라 초기화에 따라 결과가 바뀌어서 고민하고 디버깅 해보며 결국 풀어내었다!전 단어와 비교하기 위해 char를 두고 전 단어를 계속 저장해 나갔다.이미 나왔던 단어가 연속하지 않은 위치에 다시 나오면 그룹 단어가 아니므로

find는 오직 문자열에서만 쓰일 수 있다는 걸 다시 한번 배울 수 있는 문제였당.map()을 사용하지 않고==와 conitnue를 !=로 바꾸었다.엥 진짜 사소하게 바꾼 건데 시간이 더 빨라졌다..,, 모징 map 때문인가?

나는 두 행렬을 더한 값을 행렬에 저장한 후 출력하는 방식으로 풀었다. 이것이 2번의 방식이다. 다른 풀이를 보니 굳이 더하지 않고 같은 리스트에 저장한 다음 더해서 출력했다. 나는 전자가 더 성능이 좋을 것이라고 생각하고 풀었는데 후자가 훠얼씬 좋다!처음에 첫번째 f

리스트의 끝을 어떻게 하면 좋을까 생각하다가, 해당 인덱스가 null이면 출력을 안하게 하려고 했다. 그런데 애초에 없는 인덱스이기에 접근이 불가능해 검사조차 할 수 없다. 고민하다가 결국 검색을 했는데 길이를 사용하더라! 다음에는 검색하지 말고 끝까지 생각해내겠당,,

어떻게 풀까 고민하다가.. 자바로 풀었었던 방식을 기억해냈고 그걸 파이썬으로 풀어보았다. 아이디어가 재밌어서 이해한 걸 글로 풀어내려고 한당먼저 100 \* 100의 boolean 형식의 2차원 배열을 선언한다.핵심 아이디어는 입력에 적힌 (x,y) 점을 기준으로 위

다시 쓰는 2745번 ㅎ 전에는 파이썬으로 백준을 처음 풀어본 거였는데 이해했다고 생각했지만 하나도 이해하지 못했던 것 같다 ㅎㅎ 다시 풀어보았고, 전의 풀이가 이제야 완전 이해되어서 다시 정리해본당조심해야 할 건 len(N)-i-1!0인덱스부터 0의 거듭제곱을 구하는

전 글과 마찬가지로 백준을 파이썬으로 어느정도 풀어본 뒤 다시 풀어본 문제이당. 구글링해서 찾은 코드가 내가 쓴 것보다 더 깔끔해서 정리해본다.전에 그린 그림이 너무 발이고.. 이게 더 이해하기 편해서 다시 그려보았다. 이 원리를 가지고 문제를 풀어보자.핵심은1\. 0

나는 정말 너무 초짜같이 풀었다....... 이게 모야...첫 for문 돌리고 print() 써줘야 함!

예제를 보고 결과가 제곱수인 것 같았고, 5번째까지 세어보니까 3, 5, 9, 17, 33 이것들의 제곱이 맞더랑. 3, 5, 9, 17, 33에서 전의 값에서 -1을 한 값을 더하면 다음 값이 나오는 규칙을 찾아냈고, 이걸 코드로 구현했다. 그런데 검색하니 더 멋진
그냥 간단하게 풀었을 때 시간초과가 나버렸다 ㅎㅎ 아직 머리가 코테식으로 될려면 멀었다.. 생각이 날랑말랑해서 그냥.. 구글링을 해버렸고.. 전에 이해하지 못했었는데 드디어 이해를 했다. 1. 시간초과 2. 정답 처음에 왜 V-B를 하지? 이해가 안됐는데, 우리가 구하고자 하는 것은 며칠인지이고 이를 구하고자 생각하면 답이 나오더라. 이를 x라고 하면...

규칙을 찾으려고 이틀째 생각했다 물론 잠깐씩이긴 했지만ㅎ이틀째에 드디어 규칙이 보이기 시작했고, 달팽이 문제처럼 x를 이항해서 풀려고 했는데 규칙이 2차방정식이라 실패.. 규칙을 어캐 적용할까 고민하다가 구글링으로 사알짝만 참고! 규칙을 세는 방법만 적용했고 나머진 내

바로 규칙이 안 보여서 다른 날로 넘겼는데, 오래 걸릴 줄 알았는데 웬걸 규칙이 바로 보여서 코드가 술술 쳐졌다.(물론 정답 맞춰야 하니까 좀 생각하긴 했지ㅎ) 시간도 적게 걸려서 오 이게 맞는 방법?! 했는데 구글링해보니 아이디어는 정답이더랑ㅎㅅㅎ 뿌듯 😋그래도 내

문제 자체는 어렵지 않다. 그런데 print문을 작성하는 여러 가지 방법이 있어서 정리해본당join은 리스트의 요소들을 합쳐서 문자열로 만드는 함수이므로 aliquot에 들어있는 int형 요소들을 string으로 바꾸어주는 과정이 필요하다!아래서부터 1~3 코드이다.

문제를 풀고 구글에 코드를 검색해보니 for문을 처음부터 끝까지 다 돌아서 나누어 떨어지는 게 있는지 없는지를 확인하고 count를 더하더라. 그렇게 하면 시간이 좀 오래 걸릴 것 같아서 나는 나누어 떨어지자마자 for문을 나가버리고 count를 빼주는 방식으로 풀었다

시간 차이가 궁금해서 append를 하는 방법과 remove를 하는 방법 2가지로 코드를 짜보았다.num이 1일 때는 소수가 아님을 명심하자!! 처음에 1 제외 안 해줘서 틀렸당찾아보니 remove는 리스트에서 해당 숫자를 찾고 제거해야 하므로 시간이 더 오래 걸린다고

이번에도 시간 차이를 보고 싶어 2가지 방법으로 풀어보았다.나는 1번 방법이 for문을 한 번 더 쓰기 때문에 시간이 더 오래 걸릴 거라고 생각했는데 웬걸.. 2가 훨씬 오래 걸렸다.gpt한테 물어봤지만 제대로 이해하지 못했다... 코드 구조는 거의 똑같아 보이는데 왜

직사각형의 4점 중 같은 x,y점은 무조건 2쌍이 나온다는 점을 이용했다. 이미 똑같은 점이 나왔는지 확인하기 위해 remove를 사용하는 방법과 count를 사용하는 방법으로 코드를 짜보았다.remove를 사용해서 시간 차이가 나지 않을까 싶었는데 너무 작은 list

이젠 파이썬스럽게(?) 코드를 잘 짤 수 있게 된 것 같다. 구글링하지 않았지만 금방 구글링하면 나오는 코드를 뚝딱 생각해냈다. 아 쉬운 문제였나?ㅎ문제의 그림을 보고 코드를 금방 떠올렸다. x,y 축 각각에서 가장 큰 점에서 작은 점의 길이를 뺀 게 각 변의 길이더라

바로 전 포스팅에서 파이썬스럽게 코딩한다는 말 백번 취소......... 파이썬 함수만을 활용하려다가 돌아갔다....개행문자로 분리되어 입력받을 때 리스트로 저장하고 싶을 땐 저렇게!처음에는 for문을 돌면서 index를 하나하나 찾아서 count를 해야 하나.. 했는

열심히 고민하며 짠 코드가 정답이긴 했다. 그런데 sorted를 활용하면 훨씬 더 간결하게 짤 수 있더라! 가장 긴 변의 길이가 나머지 두 변의 길이의 합보다 크지 않는다는 성질을 이용했다.그래서 받은 세 변이 처음부터 삼각형의 조건을 만족하면 끝.아닐 때는 둘레가 가

중첩 for문을 통해 sum의 합을 구하는 코드는 2~n번, 3~n번, ... n-1~n번, n~n번 수행된다.즉, 1 + 2 + ... + n-1번 수행되는 것이다.그래서 나는 이걸 식으로 세우지 못하고 for문으로 구했는데.. 그래서 최고차항의 차수를 구하지 못했다

와 이건 도저히 수식으로 구할 수가 없는 거다.. 결국 구글링을 했는데 시그마로 풀거나 조합으로 풀더라. 근데 솔직히 조합은... 실제로 떠올리기 힘들 것 같아서 패스하고 시그마를 이해해보려 했는데 풀이를 찾아볼 수가 없어서 ㅎㅎ.. 오랜만에 샤프를 들고 끄적이면서 시

문제 너무 쉬운데 왜 실버지? 생각했는데 역시나.. 100% 다 와 갈 때쯤 실패하더라... 왜인지 모르겠어서 구글링을 했는데, 너무 눈에 보이는 것만 생각하고 시간복잡도의 성질을 그냥.. 무시한 것이었다,,ㅎ\*1을 한 이유는 0 혹은 1로 출력하기 위해서이다.파이썬

나는 간단히 삼중 반복문으로 풀었는데, 구글링을 해보니까 파이썬의 itertools라는 라이브러리를 이용해서 푸는 방법도 있길래 정리해본당combinations는 말 그대로 확통 때 배운 조합이다.그래서 순서를 고려하지 않고(AB = BA) 개수만큼 뽑는다.ex) 다음

내가 푼 코드는 걸리는 시간이 너무 길어서 줄일 수 있을 것 같아 찾아봤더니 중간에 break하면 되더랑우선 나는 i의 분해합을 구하기 위해 리스트로 바꾸고 for문을 돌면서 각 자리의 수를 더했다.가장 작은 생성자를 구하기 위해 여러 개 중 min을 구했다.N이 10

나는 처음에 아래와 같이 풀었더니 런타임 에러가 나더라.왜인고 찾아봤더니.. b가 0이 될 수 있기 때문이다! 분모는 0으로 나눌 수 없기에 에러가 발생한 것이다.늘 예외를 조심하쟈

문제는 이해했지만 놓친 포인트가 있어서 제대로 된 코드를 짜는 데 애먹었다..먼저 입력받는 각 줄을 리스트로 바꿔주고 저장한다.가능한 8\*8 체스판을 모두 검사하기 위해 i와 j를 나눠 for문을 돌린다.이제 만들어진 8\*8 체스판에서 모든 칸을 검사해서 다시 칠해

단순히 666에 1부터 9까지를 붙이면 되는 게 아니라, 작은 순서대로이기에 5666 다음은 6666이 아닌 6660이 된다. 그래서 이 방법으로 푸는 건 말이 안되는 것 같구.. 문제의도에 맞게 브루트포스로 푸는 게 맞겠다 싶었다.'브루트 포스'라는 문제에 맞게 숫자

나는 처음에 max5와 max3을 모두 받고 모든 경우의 수를 다 따져서 가장 적은 봉지를 갖도록 코드를 짰었다. 그런데 런타임에러도 아니구 걍 실패가 떴다..생각해보니 최대한 5kg의 봉지를 많이 이용하는 것이 가장 적은 봉지를 사용하는 것이므로 굳이 모든 경우의 수

첨에 걍 아무 생각 없이 풀면서 이게 왜 실버지? 했는데 역시 시간초과가 떴다. 전에 sys를 썼던 게 생각나서 이걸로 풀었더니 맞았당처음에는 이렇게 안 하구이렇게 했더니 틀렸습니다가 떴다..ㅎㅎ이유인 즉슨, 문자열을 int로 변환하지 않았기 때문이다.한 번에 받아오지

전 문제랑 똑같은데? 했는데 자세히 보니 메모리 제한이 매우 작았다. 그래서 전과 같은 코드를 넣으면 메모리초과가 난다. sort를 사용하는 과정에서 너무 큰 입력값을 받았을 때 메모리 초과가 나는 것 같아. 역시 전에 거 풀면서 썩 좋지 않은 방법이라고 생각하긴 했는

input을 받아서 바로 리스트로 만든다.메모리 제한이 넉넉하기 때문에 sorted와 reverse를 이용해서 내림차순으로 정렬하여 출력한다.왜 실버지?

끙끙 대며 내 머리로 푼 문제! 여러 가지 시행착오를 정리해 보고자 글을 쓴당처음에 나는 2차원 리스트를 만들려고 했다. 그런데 200001개의 인덱스를 만드니 당연히 메모리 초과(런타임 에러인가? 제출 안 해봐서 모르겠다)가 나기 때문에 다음 아이디어를 떠올렸다..그

어떤 로직을 사용하느냐에 따라 걸리는 시간이 달라져서 어떤 게 가장 빠른지 테스트해 보았다.input()을 사용하느냐 sys.stdin.readline()를 사용하느냐.2가지 조건을 정렬할 때 sort() 한 번에 정렬하느냐, 두 번의 sort로 나누어 정렬하느냐.중복

앞의 문제들 덕분에 코드는 금방 짰다. 한 가지 실수가 있어서 기억하고자 쓰는 글!속도를 위해 sys를 사용했다.나이와 이름을 리스트에 담아 members 리스트에 저장했다.나이순으로만 정렬하면 되어서 람다를 이용해서 정렬했다.⚠️ 처음에 append에서 int(age

당연히 시간 초과가 안 나게 풀어보라고 낸 문제 같았다. 그런데 도저히 떠올리지 못했고... 다른 코드들을 참고했다. 이진 탐색으로 푸는 방법과 시간초과 방법과 똑같이 풀지만 N개의 카드들을 set 혹은 dictionary로 저장하는 방법이 있다.이게 가능한 이유는 해

처음에 set으로 풀었는데 sort(), sorted() 모두 안 먹히더라.sort()는 리스트 전용 함수니까 안 되는 거!!sorted()는 set()은 안 되나보다..dictionary는 가능하단 걸 알게 됨!!딕셔너리는 key를 기준으로 정렬한다고 한다. 여기선

이번에도 딕셔너리를 이용해서 푸는 문제이다. 구글링해보면 대부분 처음부터 2개의 딕셔너리를 만들어서 풀었던데, 나는 values로 key를 찾는 방법으로 많이 쓰이는 방법을 이용하였다.나도 처음부터 2개의 딕셔너리를 만들거나, 1개의 딕셔너리와 1개의 리스트를 만들까


생각보다 둘 사이의 메모리와 시간 차이가 크다. 특히, 메모리가 엄청나게 차이가 난다. 새로 set을 만듦으로써 메모리를 줄이고자한 게 의도한 게 아니어서 더 놀라웠다 ㅎㅎ구글링하면 쉽게 볼 수 있는 코드이다.나는 슬라이싱하는 개수를 i로 두고 set을 i개수만큼 앞에

최소공배수를 구하는 여러가지 방법에 대해 정리해 보았다. 사실, 최소공배수를 구하는 여러 방법이 아닌 최대공약수를 구하는 여러 방법이 되겠다. 최소공배수는 두 수의 곱에서 최대공약수를 나눈 수이기 때문이다. 1. 최소공약수 직접 구하기 우선, 입력받은 수 중 더 큰

문제를 이해해보자 처음엔 문제조차 이해하지 못했다.. 좌표 압축이라는 거창한 말을 써서 그렇지 문제 의도는 입력받은 수를 하나하나 돌면서 해당 수보다 작은 수의 개수를 출력하라는 것이다. 어떻게 풀어야할지 감이 안 잡혀서 다음 순서인 집합과 맵을 모두 풀고 넘어왔더니

나는 속도를 위해 sys와 dictionary를 사용하였다.가로수끼리의 간격을 dic에 value값으로 저장하였다.저장한 가로수 간격들의 최대공약수를 구한다.이때 최대공약수를 갱신할 때 이전의 gcd 값과 최대공약수를 구해야 할지 해당 가로수 간격값과 구해야 할지 고

처음에 소수를 저장하는 리스트(set)을 만들까 했는데 n이 4\*10^9까지 가능해서 이건 아니라는 걸 알게 됐다.시간을 줄이는 방법이 뭐가 있을까 고민했지만,, 실패했고 구글링으로...약수를 구할 때처럼 나누어지는 수를 찾는 개수를 줄인다!약수는 항상 대칭이다. 예

이번 문제는 저번과 다르게 시간 제한이 2초에서 1초로 줄었다.당연히 시간 초과가 나겠거니 했지만 그냥 입력 받는 대로 소수 개수를 쌩으로 구하는 코드를 써봤는데 역시나 시간 초과가 났다.전에 시도하려고 했던 대로 소수인 애들을 미리 저장하자고 생각했다.구글링하면 대부

소수의 합을 저장해야 하나 에반데.. 생각하다가 못 참고 구글링을 해봤는데 소수의 합이니까 입력받은 값에서 소수를 빼면 소수가 나올 때 카운팅을 해주더라. 이 쉬운 걸 왜 생각을 못 했지..! 다음부턴 내 힘으로 푸리라,,🙂↕️속도를 가장 빠르게 하기 위해 1000

문제에서 예시로 준 것을 사람 기준이 아닌 창문 기준으로 바꾸어 보자.그러면 1번째 창문은 1번째 사람만, 2번째 창문은 1&2째 사람, 3번째 창문은 1&3, 4번째 창문은 1&2&4째 사람이 열고 닫는다는 것을 알 수 있다.즉, 각 창문은 약수의 개수만큼 열고 닫힌

분명 스택을 이용해서 푸는 걸 어디서 봤던 것 같은데... 기억이 안 나서 처음에는 (면 count를 +1을 하고 )면 -1을 하는 코드를 짰다. 그런데 그렇게 하면 ))((처럼 VPS가 아닌 입력도 YES로 출력한다. 그래서 스택을 이용하는 코드를 열심히 생각했고,

아무리봐도 맞는 것 같은데 출력초과가 떠서 구글링해보니 sys.stdin.readline이 문제라더라. 시간 단축을 위해선 무조건 readline을 써야 한다고 생각했는데 아니었다. 그 이유를 추측해봤을 땐 아래와 같다.readline과 input의 가장 큰 차이는 개

문제 의도대로 큐를 이용해서 풀면서 분명히 규칙을 찾으면 시간을 엄청나게 단축시킬 수 있을 거라는 생각이 들었다. 그래서 큐로 푼 버전, 규칙을 찾아서 푼 버전 2개로 풀어보았다.규칙을 찾기 위해 1~16까지 출력값을 나열해 보았다.1:1 2:2 3:2 4:4 5:2

먼저 예제를 보면서 각 사람이 이동하는 방식을 이해하려고 노력했다.앞으로 편의상 현재 줄 서있는 곳을 now, 한 명씩 설 수 있는 공간을 stack으로 쓰겠다.해당 번호표는 간식받는 곳으로 이동해야 되는데, 해당 번호표는 now와 stack 모두에 존재할 수 있다.번

스택이나 큐로는 어떻게 풀어야 할지 감이 안 잡혀서 나는 첨에 규칙을 찾아서 스택을 간단하기 이용해서 풀었다. 그 후, 구글링으로 큐를 이용해 푸는 방법을 대충 이해하고 내 손으로 코드를 짜봤다. 1. 규칙 이용 규칙을 찾기 위해 예제 문제를 이용해서 출력되는 요소

다른 사람들 코드를 보면 enumerate와 deque의 rotate를 활용했다. 하지만 나는 enumerate는 떠올리지 못했고.. rotate라는 함수도 알지 못했기에 요세푸스 문제처럼 풀었다. 그리고 enumerate와 rotote도 활용해 보았다.나는 enume

위의 팩토리얼을 함수로 구현하지 않고 반복문으로 직접 구하는 방식이다.combinations(객체, k) 형식으로 쓰면 객체 안에서 순서를 신경쓰지 않고 k개씩 묶어 튜플 형태로 반환해 준다.순서를 신경쓰지 않기 때문에 중복되는 것을 걸러준다. 즉, 'A', 'B'와

팰린드롬인지 찾는 방법은 문제에서 힌트로 다 줬다. recursion의 횟수만 구하면 되는 문제이다. 이 방법을 2가지로 풀어보았다.전역변수를 recursion함수에 선언해주고 recursion이 호출될 때마다 전역변수를 +1 해준다.각 테스트케이스마다 전역변수는 초기

문제 이해 문제를 이해하는 데 시간이 좀 걸렸다ㅎ 그치만 손으로 적자마자 바로 이해완. queuestack은 큐와 스택이 섞여있지만 각 자료구조에는 한 개의 원소만 들어있다. 그래서 원소를 하나 집어넣을 때 큐냐 스택이냐에 따라 새로 들어온 원소가 pop될지 기존의 원

mCn으로 조합을 구하면 되는 문제이다. 팩토리얼을 부르는 게 오래 걸릴 거라고 생각해서 collentions의 길이를 구하는 걸로 했더니 시간 초과! 그래서 팩토리얼로 했더니 굉장히 빠르다. 처음 알았넹위 코드는 팩토리얼 함수를 직접 작성했다.그런데 파이썬의 math

set과 dictionary는 순서가 없기에 조금 고민했다. 시간을 위해 set을 사용하려다가 중앙값 때문에 리스트로 바꾸었다. 빈도를 저장하기 위해 dict도 사용하기로 했다.(다행히 다른 분들 코드도 딕셔너리다)round는 반올림해주는 함수로 두 번째 인자가 없으면

정렬의 우선순위에 대해 공부할 수 있는 문제다.단어가 등장하는 빈도를 저장하기 위해 딕셔너리를 떠올렸다.알파벳 순으로 정렬하는 게 가장 마지막이다. 그래서 빈도와 길이로 정렬하기 전에 오름차순으로 정렬을 먼저 해주었다. 그래야 빈도와 길이로 정렬하고 나서도 알파벳순으로

수도코드를 이해하는 게 관건이었던 문제,,

예시를 보자마자 N일 때는 N-1일 때의 칸토어 집합의 근사에 공백을 붙이고, N-1일 때의 칸토어 집합의 근사를 붙이면 되는 것을 알았다. 그래서 재귀함수로 풀면 되겠다고 생각했다.공백은 0, 1=3^0, 3=3^2/3=3^1, 9=3^3/3=3^2, 27=3^4/2

처음에 이렇게 리스트 각 줄을 순회하는 게 아니라 그냥 star(1)\*3 이런 식으로 했더니 커서(?)의 위치가 바뀌기 때문에 이상하게 출력되었다.그래서 아이디어가 안 떠올라.. 구글링해서 대부분 이렇게 리스트에 저장한다는 것을 알게 되어 코드를 작성했다.물론 마지막

파이썬 내장함수인 조합을 쓰면 되겠다고 바로 떠올렸다. 문제는 출력 방법! permutations의 형식을 잘 알지 못해 출력해가며 올바른 정답 코드를 찾았다.print(nPr)하면 <itertools.permutations object at 0x105574040

15649 문제를 통해 백트래킹을 이해한 덕분에 중복만 허용하지 않도록 바꾸면 되어서 바로 풀 수 있었다.당연히 문제의도는 이게 아니지만 내장함수를 이용해서도 풀 수 있다.bractracking안에서 또다시 backtracking을 호출해서 이를 시행할 때 for문을
도전 중..

처음에 의사코드를 그냥 그대로 옮겨서 적었더니 시간초과가 났다. 어쩐지 문제가 너무 쉽더라니... fib(n)에서 재귀를 너무 많이 호출하다보니 시간초과가 난 것 같아서 이 코드 대신 fib(1)과 fib(2)를 호출하는 경우를 구해서 반환하는 것으로 코드를 다시 짰다. 시간초과 코드 풀이 fib(1)이나 fib(2)를 호출하는 경우는 재귀의 끝이다. ...

N을 2a + 1b꼴로 만들어서 조합을 사용해서 수를 구하면 된다고 생각했는데 시간초과가 나왔다.. 겹치는 친구들이 있어서 점화식을 불가능하다고 생각했는데 검색해보니까 점화식이 되더라..? 왜 되는지 고민해 보았다.시간초과라 설명할 필요는 없지만..,, 전에 문제에서

당연히 i부터 j까지 for문을 돌리는 건 시간초과가 날 것이고 문제의도에 맞지 않을 것이라 생각했다. 중딩? 때 배운 수열의 합 S를 잘 활용하면 되겠다 생각은 했는데,,, 또 찬찬히 생각하지 않고 손은 검색을 향했다...중학교? 때 배운 수열의 합 Sn을 떠올렸다.

며칠째 규칙을 못 찾겠어서 검색을 해버렸다.. 그런데 매우 간단하더라. 동적이니까 그냥 저장을 미리 해버리는 방식이다. 최대한 재귀호출을 줄이는 것이다.w(a, b, c) 값을 저장할 21x21x21 3차원 배열을 만든다. (인덱스는 0부터이지만 주어진 문제의 a, b

처음에는 그냥 음수가 나오면 계산을 중단해서 합을 리스트에 저장하고, 다시 0부터 계산하는 식으로 했는데 모두 음수일 때도 문제가 되지만 음수가 있어도 누적합이 더 클 수도 있기 때문에 틀린 방법이었다.그래서 연속합을 구했을 때 이전까지의 누적합보다 크지 않을 때 계산

동적 계획법을 여러 문제 풀면서 파이썬에서 DP의 가장 중요한 건 계산한 걸 다시 계산하지 않기 위해 전까지의 결과를 저장해놓는 것이다.근데 RGB로 칠할 수 있는 가짓수는 2^(N-1)... 그래서 최솟값을 구하라고 했던 것이다.전의 문제랑 비슷하게 입력으로 받은 다

우헤헤 드디어 처음부터 내 머리로 직접 푼 DP 문제. 물론 앞에 문제랑 거의 똑같아서 가능했던 것 같음ㅎㅎ

많은 걸 고려해야 하는 문제로 꽤 많은 시행착오를 겪었다 ㅎ이 문제는 점화식을 찾아야 하는 문제이다! 전에 문제에 갇혀 그냥 앞에 애들의 max를 구하려고 했더니 규칙을 만족시키면서 풀 수가 없더라,,이럴 때 규칙을 찾아 점화식을 찾아보자!! 이제 점화식이 어떨 때 떠

이번에도 오로지 내 머리로 푼 문제!! 드디어 DP의 방법을 깨우친 것인가🥹 100000도 되나?? 너무 오래 걸리는 거 아닌가??? 했는데 102로 딱 찍히는 쾌감이란 ㅎㅎㅎ여러 개의 숫자를 직접 써보면서 규칙을 찾았다.1을 빼는 건 무조건 가능하다.2로 나누어지거

저번 구간합 문제처럼 수열의 합 공식을 이용해서 푸는 문제이다. 그런데 리스트가 2개고 이번엔 K라는 하나의 변수가 추가되면서 조심해야 할 부분이 많아졌다. 그래서 범위지옥에서 허우적거리다가 손으로 열심히 끄적여서 벗어날 수 있었다.for문의 범위와 그에 따른 temp

점화식도 규칙도 막 찾으려고 애썼는데 결국 못 찾구.. 구글링을 했다.. 아이디어는 2차원 배열! DP자릿수 형식으로 리스트를 만드는 것이다. 2차원 리스트를 활용해서 열심히 끄적이며 풀어보았다.겹치는 것 때문에 앞뒤로 붙이는 것 모두 고려하는 게 아니라 앞/뒤에 붙이

현재 상황에서 지금 당장 좋은 것만 고르는 방법이며 탐욕법이라고도 한다.가장 좋아 보이는 것을 선택하는 것이기 때문에 항상 최적의 해결책을 제공하지는 않는다.그렇기에 코테에서는 탐욕법으로 얻은 해가 최적의 해가 되는 상황을 주고 이를 추론할 수 있어야 풀리도록 출제가

시행착오 예제에 갇히지 말자 계단 오르기 문제랑 비슷해서 분명 똑같을 리가 없는데.. 하며 문제를 계속 다시 읽고 DP를 다 출력해보니까 무조건 마지막이 max가 아니더라. 그래서 처음에 단순히 print(max(DP))로 작성.. 예제는 맞겠지만 당연히 다른 문제에는

도저히 모르겠어서 구글링한 문제.. 안 봤으면 못 풀었겠는데 싶었던 문제..처음에는 그냥 증가하는 수열의 마지막 수만 기억해놓고, 더 큰 수를 만날 때마다 해당 마지막 수를 업데이트해주고 count에 1을 더했다.이건 내가 문제를 잘못 이해한 탓이다. 우리가 구해야 하

앞에서 계속 DP를 풀었어서 앞에까지 구한 걸 이용해서 더했다.구글링을 통해서 간단하게 슬라이싱을 이용한 코드도 있어서 작성해보았다.작성하면서 실수한 것! lst:i라고 적으면 0~i-1까지를 더하는 거다. 그래서 range(N)이 아니라 range(N-1)라고 한다!

우리는 회의를 최대한 많이 하도록 해야 하므로 회의의 끝나는 시간이 빠를 수록 좋다.그래서 먼저 회의가 끝나는 시간을 시간순 즉 오름차순으로 정렬한다.그리고 모든 회의 시간을 돌면서 다음 회의의 시작하는 시간이 전 회의의 끝나는 시간보다 같거나 크면 count해주면 된

나는 처음에 괄호를 적절히 쳐서 최소로 만들라기에 숫자들 사이에 괄호를 쳐서 0으로 만들 생각을 했다.. 그렇게 하면 첫 번째 예제의 정답은 -185여야 하는데 -35...?다시 생각해보니까 문제 의도는 숫자들 사이에 괄호를 넣으면 안 되고 숫자 끝과 끝에 괄호를 넣으

문제는 길지만 이해하면 간단하다.for문으로 모든 오일값들을 돌면서 가장 작은 오일값(min)을 저장해두고, min보다 작은 값을 가지면 min을 갱신한다.그리고 지나온 도로에 최소 오일값을 곱해서 결과값에 더해주면 끝이다.for문의 range에 주의하자. oil의 마

절댓값을 이용해서 힙을 만들고, 같은 절댓값을 갖는 수가 여러 개일 경우 가장 작은 수를 출력하라는 문제를 보고 바로 튜플로 저장하는 방법을 떠올렸다. 최대 힙 만들 때 이용하는 코드를 봤기 때문!그걸 이용해서 코드를 잘 짰는데 문제는 절댓값이 같을 때 어떻게 더 작은

구간합 문제라는 걸 몰랐으면 못 풀었을 문제..문자열 S의 각 원소를 돌면서 해당 알파벳에 해당하는 인덱스를 count해준다.그러기 위해서 행은 S의 길이, 열은 알파벳수(26개) 크기의 2차원 배열을 만들어준다. (cnt = \[0 \* 26 for in range

결과

paper를 초기화하는 동시에 값을 저장할 수 있다니! 구글링을 통해 알게 되었다. 매우 간편한 것 같다. 앞으로 저렇게 써야징나누어진 색종이들을 모두 돌면서 첫 색깔과 달라지는 순간 4등분으로 나눈다. 또다시 나누어진 색종이도 모두 색깔이 같아야 하므로 재귀를 호출해

앞 문제랑 거의 똑같아서 어렵지 않게 풀었다입력이 공백으로 주어지지 않아서 split을 쓰지 않았고, 그래서 strip을 사용했다.괄호를 추가해야 되기 때문에 4분할로 나누어지기 시작하는 부분에 (를 넣고, 끝나는 부분에 )를 넣었다.결과값을 \*연산자로 간편히 출력했