n,m = list(map(int,input().split()))
s = []
def dfs(start):
if len(s)==m:
print(' '.join(map(str,s)))
return
for i in range(start,n+1):
if i not in s:
s.append(i)
dfs(i+1)
s.pop()
dfs(1)
n, m = map(int, input().split())
s= []
def dfs():
if len(s) == m:
print(' '.join(map(str, s)))
return
for i in range(1, n+1):
if i not in s:
s.append(i)
dfs()
s.pop()
dfs()
# 정수 K 입력
k = int(input())
v_l = []
for i in range(k):
v = int(input())
if v == 0:
v_l.pop()
continue
else:
v_l.append(v)
try:
print(sum(v_l))
except:
print(0)
코드 설명
k = int(input())
v_l = []
> k는 K개의 줄을 입력받아야 하는 값을 입력받았다.
> v_l 변수는 결과 출력하기 위한 빈 리스트입니다.
for i in range(k):
v = int(input())
if v == 0:
v_l.pop()
continue
else:
v_l.append(v)
> for문(반복문)을 k 길이만큼 사용하여, 값을 v 변수에 담게 했습니다.
> if - else 문을 사용하여 v 값이 0이라면 v_l 변수에 값을 빼주기 위해 v_l.pop() 함수를 사용해주었습니다.
> 그리고, 바로 다음 반복문으로 넘어가기 위해 continue 를 작성했습니다.
> v 값이 0이 아니라면, v_l 변수에 v 값을 append 시켜주었습니다.
try:
print(sum(v_l))
except:
print(0)
> try - except 문을 사용하여 오류발생할 시를 대비했습니다.
> try 문에는 최종 출력값인 v_l 변수의 합을 출력하기 위해서 sum(v_l) 함수를 적용하였습니다.
> except문에는 print(0)을 해주었는데, 그 이유는 리스트가 빌 때는 sum() 함수를 적용하면 에러가 발생하지 않을까 싶어 print(0) 을 해주었습니다.
def solution(genres, plays):
album = {}
sum_l = {}
for i in range(len(genres)):
if genres[i] not in album:
album[genres[i]] = [(plays[i], i)]
sum_l[genres[i]] = plays[i]
else:
album[genres[i]].append( (plays[i], i))
sum_l[genres[i]] += plays[i]
sort_sum = sorted(sum_l.items(), key= lambda x : x[1], reverse=True)
# print('sort_sum = ', sort_sum)
for key in album.keys():
album[key].sort(key = lambda x : x[0], reverse=True)
# print('album = ', album)
result_dic = {}
for i in sort_sum:
for key in album.keys():
if i[0] == key:
result_dic[key] = album[key]
# print('result_dic = ', result_dic)
result = []
for value in result_dic.values():
if len(value) > 1:
for i in range(2):
result.append(value[i][1])
else:
result.append(value[0][1])
return result
> album 변수는 genre와 genre에 맞는 각각의 plays를 담기위한 dict 자료형이다.
> sum_l 변수는 unique한 genre의 plays 합을 담기위한 dict 자료형이다.
for i in range(len(genres)):
if genres[i] not in album:
album[genres[i]] = [(plays[i], i)]
sum_l[genres[i]] = plays[i]
else:
album[genres[i]].append( (plays[i], i))
sum_l[genres[i]] += plays[i]
> for문(반복문)을 사용하여 genres 에 길이만큼 반복을 진행해준다. 솔직히 저기서 len(genres)가 아니라 len(plays)를 해줘도 무방하다.
> 여기서 if-else문을 사용하여 album 자료형에 genres의 값들이 존재한다면 매번 값이 바뀌기 때문에 존재하지 않을때는 album[genres[i]] = [(plays[i], i)]를 해주지만, 그러지 않을때는 append 함수를 사용해야 한다.
> album 자료형에는 (plays[i], i)로 해주는 이유는 결과값이 고유번호로 출력을 해주어야 하기 때문에 고유번호에 맞는 plays 수를 같이 묶어서 넣어준 것이다.
> sum_l 자료형은 unique한 genres의 합을 구해야 하기 때문에 처음일때는 sum_l[genres[i]] = plays[i]로 하지만 나중에는 sum_l[genres[i]] += plays[i] 로 값을 더해준다.
sort_sum = sorted(sum_l.items(), key= lambda x : x[1], reverse=True)
> sort_sum 변수는 unique한 genres의 plays 합인 sum_l 변수를 plays 가 많은 순서대로 내림차순 정렬을 하기 위한 변수입니다.
> 여기서 알게된 것은 .items() 함수입니다. 이것을 이용하면 dict 형이 예를 들면 {'밥' : '한식'} 인 dict형이 items() 함수를 사용하면 ('밥', '한식) 으로 묶어질 수 있다는 것이였다!!
> 그러므로 sum_l.items() 함수를 사용하면 기존 {'genres' : 'plays'의 합} -> ('genres', 'plays'의 합) 으로 바뀌게 되고, sorted() 함수에 있는 key 값을 lambda x : x[1]로 해주면 x[1]인 plays의 합 기준으로 내림차순이 정렬되므로 원하는 plays가 많은 genres 순대로 sort_sum 변수 값을 만들수 있게 된다.
for key in album.keys():
album[key].sort(key = lambda x : x[0], reverse=True)
> 이 코드는 genre 별 고유번호와 plays 값으로 이루어진 album 변수를 genre별 고유번호의 plays가 높은 순으로 정렬하기 위한 코드입니다.
> album.keys() 를 사용하면 album의 키인 genre 가 추출되게 되고, for문을 사용하면 album의 key 가 차례대로 추출되게 된다.
> album[key]는 곧 plays 수와 고유번호의 묶음들로 이루어져있고, sort() 함수를 사용하여 key = lambda x : x]0]으로 진행하면 x[0]인 plays의 수가 많은 고유번호 순으로 내림차순을 진행한다.
> 반복문이기 때문에 각 장르별 plays의 내림차순이 진행이 된다.
result_dic = {}
for i in sort_sum:
for key in album.keys():
if i[0] == key:
result_dic[key] = album[key]
> result_dic 자료형은 genres의 plays 합계가 많은 순대로 값을 넣기 위한 변수입니다.
> 이중 for문을 사용하여 genres의 plays 합계가 높은 순으로 정렬된 sort_sum을 가장 먼저 for문을 사용하고, 그 다음 album.keys()를 반복문에 사용하여 sort_sum의 plays 가 높은 genre가 album의 key와 같다면 result_dic[key] = album[key]로 작성을 하여 값을 넣어준다.
result = []
for value in result_dic.values():
if len(value) > 1:
for i in range(2):
result.append(value[i][1])
else:
result.append(value[0][1])
> result 변수는 원하는 값 순서대로 결과를 추출하기 위한 변수입니다.
> for문을 사용하여 result_dic.values() 를 순서대로 추출해준다. result_dic.values()는 plays 합계가 높은 순인 genres의 고유번호 plays 가 저장되어 있는 변수의 고유번호와 plays가 저장된 값이다.
> if-else문을 사용하여 value 값이 1보다 크다면 최대 두개까지 추출할 수 있으므로 그 안에 for문을 한 번 더 사용하고, result.append(value[i][1]) 을 사용하여 각 value의 고유번호를 result의 추가해준다.
> len(value)가 1보다 같거나 작다면 그대로 result.append(value[0][1])로 작성을 해준다.
# 방 번호 N 입력
n = input()
n_l = [int(i) for i in n]
v = [0] * 10
for n in n_l:
if (n ==9 and v[n] > v[6]):
v[6] += 1
continue
if (n ==6 and v[n] > v[9]):
v[9] += 1
continue
v[n] += 1
print(max(v))
코드 설명
n = input()
n_l = [int(i) for i in n]
v = [0] * 10
> 숫자 n을 입력받는데, input() 함수로 입력받으면 문자로 입력된다. 그리고, n_l 변수는 list compression 을 사용하여 숫자를 하나씩 분리하여 담은 리스트입니다. 이렇게 한 이유는 각 숫자의 개수를 세기 위해서입니다.
> 어쩌면 이 방식은 계수 정렬에서 아이디어를 얻었습니다.
> v는 n_l 변수에 담은 숫자 n의 각 숫자 0~9의 개수를 각각 세기 위한 변수입니다.
for n in n_l:
if (n ==9 and v[n] > v[6]):
v[6] += 1
continue
if (n ==6 and v[n] > v[9]):
v[9] += 1
continue
v[n] += 1
> for문(반복문)을 사용하여 n_l 변수에 담겨져있는 숫자를 하나씩 추출하면서 v[n] 변수에 담아줍니다.
> 이 과정에서 6과 9는 같이 사용할 수 있기 때문에, if문을 두 번사용하여 n==9 and v[n] > v[6] 과 같은 코드를 사용하여 n이 9인데 9의 개수 v[n]과 6의 개수 v[6] 을 비교할 때 v[9]가 더 크다면 v[6]의 값을 넣어주기 위해 if 문을 사용하였습니다.
> 그리고 continue 문을 사용하여 아래의 v[n] += 1을 적용하지 않고 바로 다음 for문으로 넘어가기 위해서 적용하였습니다.
import sys
input = sys.stdin.readline
from collections import deque
# N, K 입력
n, k = map(int, input().split())
queue = deque([i for i in range(1, n +1)])
cnt = 0
result = []
while queue:
cnt += 1
if cnt == k:
result.append(queue.popleft())
else:
queue.append(queue.popleft())
> 흠... 이건 맞췄어야 됐는디... ㅜㅜ
> 화이팅!!
참고한 코드
from collections import deque
queue = deque()
answer = []
n, k = map(int, input().split())
for i in range(1, n+1):
queue.append(i)
while queue:
for i in range(k-1):
queue.append(queue.popleft())
answer.append(queue.popleft())
print("<",end='')
for i in range(len(answer)-1):
print("%d, "%answer[i], end='')
print(answer[-1], end='')
print(">")
import sys
input = sys.stdin.readline
def dfs(x, y, visited, graph):
cnt = 0
if x < 0 or y < 0 and x >= m and y >= n:
break
if visited[x][y] == False and graph[x][y] == 1:
visited[x][y] = True
for i in range(1, 5):
dfs(x + dx[i], y + dy[i], visited)
cnt += 1
return cnt
else:
for i in range(1, 5):
dfs(x + dx[i], y + dy[i], visited)
# Test CAse 수
t = int(input())
# 상, 하, 좌, 우
dx = [-1, 1, 0, 0]
dy = [0, 0, -1, 1]
for i in range(t):
# 가로길이(M), 세로길이(N), 위치의 개수(K)
m, n, k = map(int, input().split())
# 배추밭
graph = [ [0] * m for _ in range(n) ]
visited = [ [0] * m for _ in range(n) ]
for i in range(k):
m_v, n_v = map(int, input().split())
graph[m_v][n_v] = 1
print(dfs(0, 0, visited, graph))
> 저는 dfs 로 풀려고 했는데... bfs 공식 코드는 외우고 있는데 이거를 문제에 적용시키는 것은 또 다른 문제임을 깨달았습니다. ㅜㅜ
> 더 공부하자!!!
참고한 코드
from collections import deque
dx = [0,0,1,-1]
dy = [1,-1,0,0]
t = int(input())
def bfs(graph, a, b):
queue = deque()
queue.append((a,b))
graph[a][b] = 0
while queue:
x, y = queue.popleft()
for i in range(4):
nx = x+dx[i]
ny = y+dy[i]
if nx < 0 or nx >=n or ny < 0 or ny >= m:
continue
if graph[nx][ny] == 1:
graph[nx][ny] = 0
queue.append((nx, ny))
return
for i in range(t):
cnt = 0
n, m, k = map(int,input().split())
graph = [[0]*m for _ in range(n)]
for j in range(k):
x, y = map(int, input().split())
graph[x][y] = 1
for a in range(n):
for b in range(m):
if graph[a][b] == 1:
bfs(graph, a, b)
cnt += 1
print(cnt)
from collections import deque
dx = [0,0,1,-1]
dy = [1,-1,0,0]
> 위 모듈 불러오는 것은 아래 코드 작성에 있어서 bfs는 큐 함수를 필요하기 때문에 deque 모듈을 불러옵니다.
> dx, dy는 상, 하, 좌, 우 방향 이동할 때 필요로 하는 코드입니다.
t = int(input())
def bfs(graph, a, b):
queue = deque()
queue.append((a,b))
graph[a][b] = 0
while queue:
x, y = queue.popleft()
for i in range(4):
nx = x+dx[i]
ny = y+dy[i]
if nx < 0 or nx >=n or ny < 0 or ny >= m:
continue
if graph[nx][ny] == 1:
graph[nx][ny] = 0
queue.append((nx, ny))
return
> t 변수는 테스트 케이스 값을 입력받기 위한 코드입니다.
> 본격적인 bfs 코드 함수 코드입니다.
> graph는 배추밭에 배추 위치가 입력되어 있는 변수입니다. 그리고 a, b는 배추 위치 값 코드를 의미합니다.
> deque() 함수를 통해 그 위치 값을 queue 변수에 받고, graph[a][b]는 배추 위치가 있는 값으로 1인데 그 값을 0으로 바꿔줍니다. 이는 마지막 개수를 세기 위해서 주변에 존재하는 배추 위치를 제거하기 위한 코드입니다.
> while 문(반복문)을 사용하여 상,하,좌, 우로 값을 적용하여 배추 위치가 있는 곳은 0으로 바꾸고 아닌 곳은 continue로 뛰어넘게 작성한 것입니다.
for i in range(t):
cnt = 0
n, m, k = map(int,input().split())
graph = [[0]*m for _ in range(n)]
for j in range(k):
x, y = map(int, input().split())
graph[x][y] = 1
for a in range(n):
for b in range(m):
if graph[a][b] == 1:
bfs(graph, a, b)
cnt += 1
print(cnt)
> 반복문을 사용하여 test case 개수만큼 n,m,k, graph 값을 받습니다.
> 그리고 다시 한 번 이중반복문을 적용하여 주어진 행과 열만큼 일일이 graph[a][b] == 1인 개수를 세어 최종 출력하기 위한 cnt 값을 출력합니다.
> 여기서 cnt 값은 위에서 설명한 bfs 함수를 통해서 한 배추 위치 근처에 있는 배추들은 오로지 하나의 배추 위치 값만 남게 하기 때문에 정확한 값을 추출할 수 있게됩니다.
> bfs, dfs 코드를 외우는 것도 중요하지만, 문제에 맞게 적용하는게 더 중요하다!! 더 공부!!!
import sys
input = sys.stdin.readline
x, y = map(int, input().split())
z = (y * 100) // x
if z >= 99:
print(-1)
else:
answer = 0
left = 1
right = x
while left <= right:
mid = (left + right) // 2
if (y+mid)*100 // (x+mid) <= z:
left = mid + 1
else:
answer = mid
right = mid - 1
print(answer)
x, y = map(int, input().split())
z = (y * 100) // x
> 처음에 코드를 int(input().split()) 으로 작성해서 계속 error가 발생했다... map(int, input().split()) 그냥 외우자!!
> 그리고, z = int( (y / x) * 100) 으로 코드를 작성하면 결과가 틀렸다고 나온다!! 그 이유는 python에서는 부동소수점 오차가 나서 정확하지 않다고 한다고 한다. 위의 내가 참고한 블로그에서 그렇게 설명을 해주셨다.
if z >= 99:
print(-1)
else:
answer = 0
left = 1
right = x
while left <= right:
mid = (left + right) // 2
if (y+mid)*100 // (x+mid) <= z:
left = mid + 1
else:
answer = mid
right = mid - 1
print(answer)
> 처음 z >= 99 이 부분을 z == 100 으로 해야되는거 아니야?? 라고 생각을 했었다. 하지만, 처음부터 100이 아니라면, 절대 100으로 진급할 수 없다는 것을 깨닫게 되었다. 어차피 100은 무리!!
> 이분탐색을 공부해서 적용하려고 했는데, 이것은 퀵 정렬과도 유사한거 같다. 허튼, 잘 참고해서 다음 이분 탐색 문제에서는 잘 써먹어보자!!