알고리즘/백준 문제풀이 83

[삼성SW역량][Python/BOJ] 백준 20058 마법사 상어와 파이어스톰(구현+BFS)

간단하게 보면 1. 얼음을 회전시키고 녹이는 함수 2. 가장 큰 얼음 덩어리의 사이즈를 구하는 함수를 만들어 해결하면 된다. 문제는 얼음을 회전시키는 코드를 생각하기 쉽지않았다는 것이다. 2^L씩 구간을 나누어 시계방향으로 90도 회전하는데 이 방법을 도저히!!! 생각이 나지 않았다. 이걸 매번 tmp로 받아서 저장하고 빼서 만드나? 너무 구차한데? 아닐것같은데 ? 만약 tmp로 안빼고 만들면 숫자가 움직이는 과정에서 원래 숫자를 덮어버려서 안될텐데? 정답은 바로 새롭게 저장할 mp배열을 만드는 거였다^-^! (정말 획기적!) 2^L 만큼의 간격으로 x,y를 넘어다니고 그 안에서는 i,j로 90도 시계방향으로 움직이도록 만든다. 4중 for문으로 나타낸 그림은 아래 그림과 같다. 코드 : from col..

[삼성SW역량][Python/BOJ] 백준 17822 원판돌리기(구현)

덱으로 이차원 리스트를 만들 수 있다는 것을 처음 알았다..!! 아직도 배울 것이 많다ㅎㅎ 이 문제를 푸는 방법은 그저-! 빡구현!! 할수있다!! 화이팅🔥🔥 1. 숫자들을 리스트 -> 덱으로 만들어 저장한다. 2. 덱으로 저장되어있으므로 rotate를 이용할 수 있다. 3-1. 양옆을 확인하여 동일한 값이 있는지 체크한다. 3-2. 위, 아래를 확인하여 동일한 값이 있는지 체크한다. 4-1. 동일한 값이 있으면 0을 넣는다. 4-2. 없다면 원판을 돌면서 평균을 구하고 원판을 돌면서 원판위 값을 조정한다. 코드 : from collections import deque if __name__=="__main__" : n,m,t = map(int,input().split()) mp = [deque(list(m..

[삼성SW역량][Python/BOJ] 백준 19238 스타트택시(BFS+구현)

드디어...! 나 혼자 골드 3 문제를 풀었다! 문제 : 백준이 태울 승객을 고를 때는 현재 위치에서 최단거리가 가장 짧은 승객을 고른다. 그런 승객이 여러 명이면 그중 행 번호가 가장 작은 승객을, 그런 승객도 여러 명이면 그중 열 번호가 가장 작은 승객을 고른다. 택시와 승객이 같은 위치에 서 있으면 그 승객까지의 최단거리는 0이다. 연료는 한 칸 이동할 때마다 1만큼 소모된다. 한 승객을 목적지로 성공적으로 이동시키면, 그 승객을 태워 이동하면서 소모한 연료 양의 두 배가 충전된다. 이동하는 도중에 연료가 바닥나면 이동에 실패하고, 그 날의 업무가 끝난다. 승객을 목적지로 이동시킨 동시에 연료가 바닥나는 경우는 실패한 것으로 간주하지 않는다. 해설 : 0. 승객만큼 반복한다. 1-1. 택시의 위치에..

[삼성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..