본문 바로가기
  • 시 쓰는 개발자

전체 글176

11/14 스터디 9461 파도반 수열 DP문제의 핵심은 점화식 만들기인 것 같고 그걸 얼마나 그럴싸하게 만들어내느냐가 관건인듯하다. 이 문제는 점화식을 만들기 쉬워서 풀 수 있었다. 단순히 f(n) = f(n-1) + f(n-5)만 찾아내면 풀 수 있었는데 f(n)이 정말 여러 형태로 나올 수 있었기 때문에 어렵지않게 해결할 수 있었다. n = int(input()) tri = [0] * 101 # 여기 100으로 한거때문에 런타임에러 .... tri[1] = 1 tri[2] = 1 tri[3] = 1 tri[4] = 2 tri[5] = 2 for i in range(n): t = int(input()) for j in range(6, t+1): if tri[j] == 0: tri[j] = tri[j-1] + tri[j.. 2022. 11. 14.
11/09 스터디 1931 회의실 배정 정말 막막했던 문제였는데, key point는 2가지 정도였다고 본다. 1) 회의 시간이 짧은 게 중요 2) 회의가 끝나는 시간이 서로 같다면, 회의 시작 시간으로 정렬. 왜냐하면 1~2와 2~2도 가능하기 때문. 그래서 일단 회의 시작 시간으로 정렬하고, 끝나는 시간에 대해 한번 더 정렬을 하면 2번조건을 만족하면서 회의 시간이 짧은 게 위로 올라온다고 생각했다. 이를 lambda함수로 정렬했고 가장 위로 정렬된 회의를 일단 한다고 가정해 cnt를 1로 놓고 시작했다. 그래서 처음 회의가 끝나는 시간이 다음회의가 시작되는 시간보다 "작거나 같을 때" 회의를 할 수 있으므로 cnt를 1 늘려주고, 새로운 회의로 다시 비교를 하기 위해 end에 넣어주었다. 이를 반복한다. n = in.. 2022. 11. 9.
11/07 스터디 11047 동전 0 정렬을 하면 시간초과, 안하면 통과되는 문제였다. 그래서 오름차순으로 입력된다는 조건을 이용해서, money_list[n-i]로 입력받아서 내림차순으로 저장되게 하였다. 그렇게 하면 정렬할 필요가 없어서 통과할 수 있었다. 그 뒤로는 전형적인 동전 문제처럼, 5만원을 최대한 넣어보고(몫으로 반환), 그다음은 1만원, 다음 5천원 .... 을 계속 반복해서 동전의 개수를 세어서 반환하였다. import sys n, money, = map(int, input().split()) money_list = [0] * n for i in range(1, n+1): money_list[n-i] = int(sys.stdin.readline().strip()) cnt = 0 i = 0 while mo.. 2022. 11. 7.
11/02 스터디 10816 숫자카드2 핵심 Counter import sys from collections import Counter # 해당 원소들이 몇번 등장했는지 카운팅해서 dict로 반환 n = int(input()) # 숫자카드 n개 cardlist = list(map(int, sys.stdin.readline().strip().split())) m = int(input()) # 정수 m개 numlist = list(map(int, sys.stdin.readline().strip().split())) count = Counter(cardlist) for i in range(m): if numlist[i] in count: print(count[numlist[i]], end = ' ') else: print(0,.. 2022. 11. 7.
코딩테스트 시간초과 해결법 (백준) 1. 코드를 PYPY3로 돌려본다. pypy3도 파이썬으로 만든거지만 속도도 빠르고 문법이 동일해서 pypy3로 바꿔주기만 하면 된다. 2. 입력을 받을 때 input()대신에 sys.stdin.readline()을 사용하자. 거의 2배는 빠르다고 한다. input()은 rstrip()을 적용해 반환하기 때문에 느리다. ※ 주의) sys.stdin.readline()는 \n도 받아오기 때문에 항상 .strip()을 해줘야한다. 3. 반복문 줄이기, 특히 중첩 for문 4. 재귀함수를 쓰는 경우, 메모이제이션 기법을 활용해보자. ▶ 이전에 계산한 값을 중복 계산하지 않기 위해 저장해놓는 기법. 팩토리얼이나 피보나치수열 처럼 기존에 한번 계산을 했던 것이 나중에 반복적으로 다시 나올 때 사용하면 효율적이다... 2022. 10. 28.
5장 배열 JAVA의 정석 책을 참고하였습니다. 까먹었을 법한 내용만 정리. 배열 “같은 타입”의 여러 변수를 하나의 묶음으로 다루는 것 배열의 각 요소들은 서로 연속적이다. 배열 선언방법 2가지 타입[ ] 변수이름; : int [ ] score; String[ ] name; 타입 변수이름[ ]; : int score [ ]; String name[ ]; ※ 주의점 배열의 선언만으로 공간이 할당되는 것은 아니다. int [ ] score;처럼 선언만으로 끝나는게 아니고, score = new int[5]처럼 배열을 “생성” 해줘야한다. 이를 한줄로 줄이면 다음과 같다. ex. int [ ] score = new int [5]; 다차원 배열의 선언과 생성 [ ]의 개수가 차원의 수를 의미한다. ex. int [ 행 .. 2022. 10. 28.
4장 조건문과 반복문 JAVA의 정석 책을 참고하였습니다. 까먹었을 법한 내용만 정리. 조건문 – if, switch + Math.random() 참고 if if (조건) { 결과 } 조건식의 결과는 반드시 true or false이다. switch switch (조건) { case A: ~~ break; case B: ~~ break; default: ~~ ... } 조건식의 결과는 정수나 문자열만 가능. ★ 이때 case문의 값인 A, B 자리에는 변수를 사용할 수 없다. switch문도 if문처럼 중첩 가능. Math.random() - 난수 발생 함수 ★★★ 0 이상 1.0 미만 double 값을 반환한다. ★★★ ex. 1~10 사이의 임의 정수를 얻기 int score = (int)(Math.random() * 1.. 2022. 10. 28.
3장 연산자 JAVA의 정석 책을 참고하였습니다. 까먹었을 법한 내용만 정리. 연산자 종류 우선순위가 높은 순서대로 쓰면 단항, 산술, 비교, 논리, 삼항, 대입 무엇보다도 괄호가 우선순위가 제일 높고, 단항 이항 삼항 순서대로 높다. 연산자 우선순위는 거의 다 상식적으로 생각하면 된다. 단, 주의할 점이 있다. 쉬프트연산자 > >>>(2를 곱하거나 2로 나눠줌)들은 덧셈연산자보다 우선순위가 낮다. ex. x 3 && x < 5) 이항 연산자의 특징 이항 연산자는 연산을 수행하기 전에 피연산자의 타입을 일치시킨다. 두 개의 타입 중 “표현범위”가 더 넓은 쪽으로 통일돼서 계산된다. ex. char + int = int + int float + int = float + float long + float = float .. 2022. 10. 28.
2장 변수 JAVA의 정석 책을 참고하였습니다. 까먹었을 법한 내용만 정리하려 합니다. 변수 타입 기본형 : boolean, char, byte, short, int, long, float, double ▶ 실제 값을 저장함, 사용하려면 0 등으로 초기화를 해줘야함. 참조형 : String, System 등 ▶ "객체의 주소"를 저장함 명명규칙과 권장사항 대소문자가 구분되고, 길이제한 X // True와 true(예약어)는 서로 다르다. 특수문자는 언더바(_)와 달러사인($)만 허용된다. 클래스 이름의 첫글자는 항상 대문자로, 변수와 메소드 이름의 첫글자는 항상 소문자로 여러 단어는 첫글자가 대문자 상수는 대문자로 쓰고, final을 붙여줌 문자와 문자열 문자는 문자가 딱 1개만 있는 char, 문자열은 문자 2개.. 2022. 10. 28.