알고리즘 97

[Python/BOJ] 백준 1027 고층 건물(구현)

기울기를 사용한다는 건 생각도 못했다. 그림으로 그려보았다. 건물의 왼쪽은 건물이 보이기 위해서는 기울기가 작아져야하고 건물의 오른쪽은 건물이 보이기 위해서는 기울기가 커져야한다. 이걸 생각만 할 수 있다면 그렇게 어려운 문제는 아니다ㅎㅎ 코드 : # 원점이 (x1,y1) def slope(x1,y1,x2,y2) : return (y2-y1) / (x2-x1) # 기울기가 작아져야 볼 수 있다. def count_left(idx) : min_scope = int(1e9) cnt= 0 for i in range(idx-1,-1,-1) : s = slope(idx, mp[idx], i, mp[i]) if min_scope > s : min_scope = s cnt+=1 return cnt # 기울기가 커야 ..

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

으렵다!! 그래도 계속 풀다보면 익숙해지겠지 이차원 배열을 뒤집어야하는데 이 문제를 풀면서 포스팅을 작성했다. 참고 : https://what-am-i.tistory.com/330?category=1000199 [python]이차원 배열을 뒤집는 방법_zip(*list) 알고리즘을 풀다보면 이차원 배열을 뒤집어야하는 문제가 가끔 나온다. 그럴때마다 그때 그때 이해해서 적었지만 이것을 정리하고 싶어서 글을 쓴다. 1. " * " python에서 아스트리크(*)은 unpack역할 what-am-i.tistory.com 크기가 가장 큰 블록을 찾을 때 여러 개라면 무지개 블록의 수가 많은 그룹, 무지개 블록의 수도 동일하다면 기준 블록의 행과 열이 가장 큰것을 찾는다. (즉, 1. 크기, 2. 무지개 블록의 ..

[삼성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] 백준 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로 만들기 위..