programming language/Algorithm 82

[백준] 11000 강의실 배정 (python)

https://www.acmicpc.net/problem/11000 11000번: 강의실 배정 첫 번째 줄에 N이 주어진다. (1 ≤ N ≤ 200,000) 이후 N개의 줄에 Si, Ti가 주어진다. (0 ≤ Si < Ti ≤ 109) www.acmicpc.net 문제 수강신청의 마스터 김종혜 선생님에게 새로운 과제가 주어졌다. 김종혜 선생님한테는 Si에 시작해서 Ti에 끝나는 N개의 수업이 주어지는데, 최소의 강의실을 사용해서 모든 수업을 가능하게 해야 한다. 참고로, 수업이 끝난 직후에 다음 수업을 시작할 수 있다. (즉, Ti ≤ Sj 일 경우 i 수업과 j 수업은 같이 들을 수 있다.) 수강신청 대충한 게 찔리면, 선생님을 도와드리자! 첫번째 문제 풀이 - 시간초과 1. [시작시간, 끝나는 시간]..

[백준] 13164 행복 유치원 (python, Greedy)

https://www.acmicpc.net/problem/13164 13164번: 행복 유치원 행복 유치원 원장인 태양이는 어느 날 N명의 원생들을 키 순서대로 일렬로 줄 세우고, 총 K개의 조로 나누려고 한다. 각 조에는 원생이 적어도 한 명 있어야 하며, 같은 조에 속한 원생들은 서로 www.acmicpc.net 문제 풀이 1. 아이들 키 차이에 대한 리스트를 만든다. 2. 이를 sorting한다. 3. n-k 개 만큼 선택한다. 결과를 보면 차이가 적은 것을 n-k 만큼 선택하면 최솟값으로 차이를 가진 아이들의 조가 만들어진다. n, k = map(int, input().split()) graph = list(map(int, input().split())) lenGraph = [] for i in ..

[백준] 2212번 센서 (python, Greedy)

https://www.acmicpc.net/problem/2212 2212번: 센서 첫째 줄에 센서의 개수 N(1 ≤ N ≤ 10,000), 둘째 줄에 집중국의 개수 K(1 ≤ K ≤ 1000)가 주어진다. 셋째 줄에는 N개의 센서의 좌표가 한 개의 정수로 N개 주어진다. 각 좌표 사이에는 빈 칸이 하나 있 www.acmicpc.net 문제 한국도로공사는 고속도로의 유비쿼터스화를 위해 고속도로 위에 N개의 센서를 설치하였다. 문제는 이 센서들이 수집한 자료들을 모으고 분석할 몇 개의 집중국을 세우는 일인데, 예산상의 문제로, 고속도로 위에 최대 K개의 집중국을 세울 수 있다고 한다. 각 집중국은 센서의 수신 가능 영역을 조절할 수 있다. 집중국의 수신 가능 영역은 고속도로 상에서 연결된 구간으로 나타나게..

[이코테 그리디 예제] 큰 수의 법칙 (python)

문제 동빈이의 큰 수의 법칙은 다양한 수로 이루어진 배열이 있을 때 주어진 수들을 M번 더하여 가장 큰 수를 만드는 법칙이다. 단, 배열의 특정한 인덱스(번호)에 해당하는 수가 연속해서 K번을 초과하여 더해질 수 없다. 예를 들어 순서대로 2, 4, 5, 4, 6으로 이루어진 배열이 있을 때 M이 8이고, K가 3이라고 가정한다. 예를 들어 순선대로 2, 4, 5, 6으로 이루어진 배열이 있을 때 M이 8이고, K가 3이라고 가정하자. 이 경우 특정한 인덱스의 수가 연속해서 세번까지만 더해질 수 있으므로 큰 수의 법칙에 따른 결과는 6 + 6 + 6 + 5 + 6 + 6 +6 +5인 46이 된다. 단, 서로 다른 인덱스에 해당하는 수가 같은 경우에도 서로 다른 것으로 간주한다. 예를 들어 순서대로 3, ..

[프로그래머스] PCCP 기출문제 2번 - 석유 시추 (python, bfs)

https://school.programmers.co.kr/learn/courses/30/lessons/250136 프로그래머스 코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요. programmers.co.kr 문제 설명 2차원 배열의 땅에 석유있는 곳은 1이고 없는 곳은 0이다. 석유 시추할 때 하나의 열씩 시추관을 넣고, 모든 열에 다 넣는 값들의 최대 값을 출력하는 것이다 문제 풀이 첫번째 풀이 1. 각 열에서 가져올 수 있는 값들을 1차원 배열에 넣고 max 값 출력 2. putSituSum 함수 : 하나의 열에서 가져올 수 있는 모든 석유 크기의 합 - 고정된 열에서 행별로 bfs를 돌린다. ..

Softeer Level2 회의실 예약 (python)

나의 풀이 구현문제이지만 어려웠다. 일단, 입력받을 때 하나의 배열로 받고 싶었으나, 어떻게 비교해야할지를 몰랐다. 1. dict()을 이용해서 key = 이름 그리고 value에 [start, end]를 넣는다. 시간 범위는 9부터 18까지이니, 함수에서 check = 9로 한 뒤, start와 check 비교로 -> check 와 start 사이 공백이 있는 것을 확인한다 (= 두 수의 값 크기비교에서 start가 더 크면 공백이 있는 거니까) 있으면 result.append하고 check = end로 한다. 2. dict 관련 문법 정리 (1) for문 for key, value in testDict.items() (2) 정렬 sorted(testDict.items()) 항상 list로 변환해서 사..

Softeer Level2 전광판 (python)

나의 풀이 전광판 숫자를 나타내는 거를 배열로 만들었다. 근데.. 공백을 생각 못해서 틀렸고 dict을 사용하지 않아서 애먹었다. 1. str에 공백 넣기 type(A) = 'str'인 A가 있을 때, 공백을 넣고 싶은 경우 : A = ' ' * n + A 원하는 공백 개수만큼 넣을 수 있다. 2. 전광판에 표시되는 경우의 수는 0부터 9 그리고 공백이다. 이거를 이차원배열이 아닌 key, value값을 가진 dict()으로 만들면 편하다. 그리고 dict 값 가져올 때 list처럼 [] 사용한다. ()아님 import sys t = int(input()) testcase = [] for _ in range(t): a, b = input().split() a = ' ' * (5 - len(a)) + a ..

Softeer Level2 비밀 메뉴 (python)

나의 풀이 python 문자열 slice 문법을 활용하여 비밀배열을 일일이 확인했다. import sys m, n, k = map(int, input().split())#버튼의 번호 1 이상 k 이하 secert = list(map(int, input().split())) #m개의 조작법 user = list(map(int, input().split())) # 사용자의 버튼조작 existS = False secertLen = len(secert) # print(secert) for i in range(n-m+1): if (user[i:i+secertLen] == secert): existS = True break if existS: print("secret") else: print("normal")

Softeer Level2 GBC (python)

나의 풀이 처음에 비교를 어떻게 해야하는거지, 수직선이 없는데 어떻게 비교해야할까 고민하는 시간이 길어졌다. 제약조건이 100인 것을 확인하고 그래, 그냥 수직선을 만들어도 100이다 생각하고 100개의 원소를 가진 수직선을 만들었다. import sys n, m = map(int, input().split()) line = [] user = [] # 기존 배열 line for _ in range(n): length, speed = map(int, input().split()) line.append([length, speed]) # 광우의 입력 for _ in range(m): length, speed = map(int, input().split()) user.append([length, speed]) ..

Softeer Level2 지도 자동 구축 (python)

나의 풀이 수학문제와 재귀함수 문제다. 규칙이 피보나치 수열처럼 존재하는 것을 확인했다. 2의 n승만큼 더해진다. 먼저 한줄을 만드는 함수를 생성하고 결과를 제곱하면 줄의 개수가 나오도록 작성했다 import sys n = int(input()) # 0 = 4, 1 def line(n): oneLine = 2 index = 0 while (True): if n==0: break oneLine += 2 ** index # print(oneLine,"oneLine") n -= 1 index += 1 return oneLine*oneLine print(line(n))