백준 78

[삼성SW역량][Python/BOJ] 백준 21610 마법사 상어와 비바라기(구현)

그저 빡구현!! 삼성 문제 풀다보니까 익숙해진다. 문제 : 모든 구름이 di 방향으로 si칸 이동한다. 각 구름에서 비가 내려 구름이 있는 칸의 바구니에 저장된 물의 양이 1 증가한다. 구름이 모두 사라진다. 2에서 물이 증가한 칸 (r, c)에 물복사버그 마법을 시전한다. 물복사버그 마법을 사용하면, 대각선 방향으로 거리가 1인 칸에 물이 있는 바구니의 수만큼 (r, c)에 있는 바구니의 물이 양이 증가한다. 이때는 이동과 다르게 경계를 넘어가는 칸은 대각선 방향으로 거리가 1인 칸이 아니다. 예를 들어, (N, 2)에서 인접한 대각선 칸은 (N-1, 1), (N-1, 3)이고, (N, N)에서 인접한 대각선 칸은 (N-1, N-1)뿐이다. 바구니에 저장된 물의 양이 2 이상인 모든 칸에 구름이 생기고..

[삼성SW역량][Python/BOJ] 백준 21608 상어초등학교(구현)

내 힘으로 풀었다..!! 확실히 구현 문제만 풀다보니 조금씩 실력이 늘고있다. 1-index로 했다가 계속 틀려서 0-index로 변경했더니 풀렸다. 정말 그냥 구현해주면 된다. 딕셔너리를 이용해 좋아하는 친구의 리스트를 만들어주었다. 문제 풀이 : 1. 딕셔너리를 돌면서 앉을 수 있는 자리를 찾는다. 2. 좋아하는 친구와 인접한 개수, 비어있는 자리의 개수를 정렬한다. 3. 가장 적절한 자리를 찾아 해당 상어를 놓는다. 4. 인접한 곳에 친한 친구의 수를 구해 만족도를 구한다. 코드 : dx = [1,0,-1,0] dy = [0,1,0,-1] if __name__=="__main__" : n = int(input()) dic = {} for i in range(n**2) : a,b,c,d,e = map..

[삼성SW역량][Python/BOJ] 백준 16236 마법사 상어와 파이어볼(구현)

처음 문제를 풀때 for문으로만 주구장창 풀었다. 코드는 더러워지고 길어졌다. 게다가 답도 제대로 나오지않았다. 처음부터 mp에 넣고 결과를 구했기 때문이다. fireball이라는 리스트를 만들어 이용하면 더 간편하고 깔끔하게 풀이할 수 있다. 문제에는 아래와 같은 문구가 있다. 1번 행과열이 n번 행과열과 붙어있다는 의미이므로 nr과 nc를 구해도 다시 안으로 돌아도록 %n을 해주면된다. nr = (cr+(cs*dx[cd])) % n nc = (cc+(cs*dy[cd])) % n dx와 dy는 문제의 0,1,2,....7 방향대로 맞추어서 설정해준다. 문제 풀이 : 1. fireball 리스트에 입력받는다. 2. k번 반복한다. 2-1. fireball들을 리스트에서 꺼내서 이동시킨후 mp에 넣는다. ..

[삼성SW역량][Python/BOJ] 백준 16236 아기상어(BFS,구현)

주의해야할 점은 list를 pop()하면 뒤의 원소(마지막원소)부터 반환된다는 것이다. 그래서 먹을 수 있는 물고기의 리스트를 역순으로 정렬해야한다. 이렇게 ! return sorted(tmp, key = lambda x : (-x[2],-x[0],-x[1])) 또는 reverse = True를 뒤에 달아줘도 된다. return sorted(tmp, key = lambda x : (x[2],x[0],x[1]), reverse = True) 또는 pop(0)로 바꾸면 된다. 아래 코드는 pop(0)로 만들었다. BFS는 항상 최단거리만을 나타낸다는 점을 이용한다. 1. 아기상어의 위치를 구한다. 2. biteFish라는 함수를 수행한다.(인수로는 상어의 위치와 상어의 길이를 준다.) 2-1. 인수로 들어온..

[삼성SW역량][Python/BOJ] 백준 16235 나무재테크(구현)

삼성...그저 구현...! 한 자리에 나무가 여러개가 있을 수 있으므로 각각의 값을 리스트로 설정해주어야한다. tree = [[[] for _ in range(n)] for i in range(n)] 이런 식으로 코드를 만들어 주어야한다. dx = [-1,-1,-1,0,0,1,1,1] dy = [-1,0,1,-1,1,-1,0,1] if __name__=="__main__" : n,m,k = map(int,input().split()) # 매년 겨울 추가되는 영양분 plus_nutri = [list(map(int,input().split())) for i in range(n)] # 영양분 ground = [[5]*n for i in range(n)] # 트리의 나이 tree = [[[] for _ in r..

[삼성SW역량][Python/BOJ] 백준 17779 게리맨더링2(구현)

처음 문제를 봤을 때 조건이 너무 많아서 어질했다. 어떤 방법을 써야할지 모르겠어서 답을 봤더니 정말 그 많은 조건들을 다 구현하면 되는 문제였다. 두려워하지말고 하나하나 구현해야겠다는 생각을 했다. 1. 4중 for문을 돌면서 조건에 맞는 x, y, d1, d2를 선택하여 cal 함수를 돌린다. 2. cal 함수 2-1. 경계면을 5번으로 할당 2-2. 경계면 내부를 5번으로 할당 2-3. 전체 구역을 돌면서 1,2,3,4,5의 인구를 구한다. 2-4. 각 인구의 최대값, 최소값을 구해 뺀 수를 반환한다. 경계면 내부를 5로 만들 때 행을 x+1 부터 x+d1+d2까지 돌린다는 것을 잊지말아야한다. 경계면 가장 위의 행이 x이고 가장 아래 행은 x+d1+d2이기 때문이다. 경계면 내부를 5로 만들기 위..

[삼성SW역량][Python/BOJ] 백준 17142 연구소3(BFS)

벽의 개수와 바이러스의 공간을 list로 저장한다. combinations를 이용해 활성화시킬 m개의 바이러스를 선택한다. bfs를 이용해 모든 빈곳을 감염시키는 시간을 반환하도록 한다. 0. time 변수 생성 1. vis 배열을 만든다. 2. 바이러스를 deque에 넣고 바이러스의 위치는 vis의 값을 0으로 설정한다. 3. 바이러스가 퍼진다. 3-1. 퍼지는 곳이 빈곳이라면 퍼지고, time 을 갱신 3-2. 퍼지는 곳이 비활성화된 바이러스라면 활성화시킨다. 4. 미리 구해놓은 벽의 개수화 현재 벽의 개수를 비교한다. 5. 만약 다르면 모든 빈곳을 채우지 못한것이므로 무한대를 반환, 아니라면 time 을 반환 코드 : from collections import deque f..

[삼성SW역량][Python/BOJ] 백준 17140 이차원 배열과 연산(구현)

🐾 20220927 이 문제는 정말 구현만 하면 된다. 근데 이런 생각을 대체 어떻게 하지.... 이차원 배열에서 전치된 배열을 구하고 싶다면 (*mp)를 하면 된다. 다만 배열 형태로 나오는 것이 아니기에 zip(*mp)를 해주면 된다. 해당 숫자와 개수를 구하기 위해서는 set을 이용해서 중복을 제거한다는 것이 신기했다. 그리고 0 이 아니라면 해당 숫자와 개수를 넣는다. for i in set(row) : if i : tmp.append([i, row.count(i)]) def sor(A,clen) : for idx , row in enumerate(A) : tmp = [] for i in set(row) : if i : # 0은 무시 tmp.append([i,row.count(i)]) tmp.so..

[삼성SW역량][Python/BOJ] 백준 20055 컨베이어 벨트 위의 로봇(구현)

언제든지 로봇이 내리는 위치에 도달하면 그 즉시 내린다 이 부분을 코드에 넣지않아서 계속 틀렸었다. 변화가 있을 때마다 언제든지 , 즉 [n-1]자리에 로봇이 있다면 0으로 변경해준다. 코드 : from collections import deque if __name__=="__main__" : n,k = map(int,input().split()) durability = deque(map(int,input().split())) robot = deque([0]*(n*2)) ans = 0 while True : ans +=1 # 한 칸 회전 durability.rotate() robot.rotate() if robot[n-1] :# 내리는 자리에 로봇이 있다면 내림 robot[n-1] = 0 #로봇 이동 f..

[삼성SW역량][Python/BOJ] 백준 17144 미세먼지 안녕!(시뮬레이션)

와 생각보다 정말 시뮬레이션이 생각해야할게 많고 어렵구나...!!!! 코드 : dx = [1,0,-1,0] dy = [0,-1,0,1] if __name__=="__main__" : r,c,t = map(int,input().split()) mp =[list(map(int,input().split())) for i in range(r)] for i in range(r) : # 공기청정기가 있는 행 알아내기 if mp[i][0] == -1 and mp[i+1][0] == -1 : now = (i,i+1) break for _ in range(t) : # 확산 # 새롭게 확산된 값을 저장할 배열 new = [[0]*c for i in range(r)] for i in range(r) : for j in ra..