파이썬 31

[SWEA] 1249. 보급로

https://swexpertacademy.com/main/code/problem/problemDetail.do?contestProbId=AV15QRX6APsCFAYD SW Expert Academy SW 프로그래밍 역량 강화에 도움이 되는 다양한 학습 컨텐츠를 확인하세요! swexpertacademy.com 출발지부터 상하좌우 순서대로 탐방하며 각 정점으로 향하는 최단 거리를 갱신하면 되는 문제이다. 출발지를 중심으로 연결된 모든 점을 탐색하므로 DFS를 이용하였으며, 중간에 최단 거리가 갱신되어 큐에 저장된 정보를 이용할 필요가 없으면 (해당 정점을 거치는 것이 최단 거리가 아니라면) 다음 정점으로 넘어가 최단 거리를 계속 갱신하면 된다. from collections import deque dy =..

알고리즘 2021.10.17

[백준] 15686. 치킨 배달

https://www.acmicpc.net/problem/15686 15686번: 치킨 배달 크기가 N×N인 도시가 있다. 도시는 1×1크기의 칸으로 나누어져 있다. 도시의 각 칸은 빈 칸, 치킨집, 집 중 하나이다. 도시의 칸은 (r, c)와 같은 형태로 나타내고, r행 c열 또는 위에서부터 r번째 칸 www.acmicpc.net 브루트포스를 이용하여 모든 경우의 수를 다 살펴봐야 하는 문제이다. 처음에는 greedy, 혹은 bfs로 푸는 방법을 생각했는데 그냥 치킨집 위치와 집 위치를 각각 저장한 뒤, 치킨집 조합을 기준으로 집 위치를 모두 탐색하며 맨해튼 거리를 갱신해주면 되는 문제였다. 어렵게 생각하면 정말 어려운 문제다.. 조합은 itertools로도 만들 수 있으나, 재귀 연습을 위해 재귀로 ..

알고리즘 2021.10.17

[SWEA] 7465. 창용 마을 무리의 개수 (bfs, union-find)

https://swexpertacademy.com/main/code/problem/problemDetail.do?contestProbId=AWngfZVa9XwDFAQU SW Expert Academy SW 프로그래밍 역량 강화에 도움이 되는 다양한 학습 컨텐츠를 확인하세요! swexpertacademy.com 간단한 union-find를 이용해 푸는 방법과, bfs를 이용해 푸는 방법 두 가지가 있다. 1. union-find 부모를 자기 자신으로 초기화한 부모리스트를 먼저 생성한 뒤, p1 p2를 받을 때마다 부모를 찾고, 이들을 합쳐주는 (부모를 갱신) 하는 작업을 진행한다. 모든 input을 받은 뒤, 부모 리스트를 돌며 본인이 부모인 경우만 ans +를 해준다. def find_p(x): if x..

알고리즘 2021.10.15

[SWEA] 2814. 최장 경로

https://swexpertacademy.com/main/code/problem/problemDetail.do?contestProbId=AV7GOPPaAeMDFAXB SW Expert Academy SW 프로그래밍 역량 강화에 도움이 되는 다양한 학습 컨텐츠를 확인하세요! swexpertacademy.com cycle이 존재하는 그래프의 DFS 탐색 문제이다. 한 정점의 탐색이 끝나면 visited 배열을 다시 0(방문 하지 않음)으로 바꿔주어야 하는 것이 포인트이다. 위와 같이 cycle이 있는 그래프가 있을 때 아래부터 일단 탐색을 한다고 친다. 우하단의 정점부터 시작해서 오른쪽 정점들을 계속 방문하며 방문 표시를 해준다. 더이상 방문할 점이 없기 때문에 다시 첫 정점으로 돌아간다. 새롭게 탐색을 ..

알고리즘 2021.10.14

[SWEA] 5656. 벽돌 깨기

https://swexpertacademy.com/main/code/problem/problemDetail.do?contestProbId=AWXRQm6qfL0DFAUo SW Expert Academy SW 프로그래밍 역량 강화에 도움이 되는 다양한 학습 컨텐츠를 확인하세요! swexpertacademy.com 작년에 이 문제를 봤을 때는 못 풀고 넘어갔는데 이번에는 1시간도 안 걸려서 풀었다! 최적화는 제대로 못하긴 했지만.. 모든 기능을 여러 함수로 쪼개 구현해서 overhead가 심하고 메모리 사용이 많다. 풀었다는 것.... 성장했다는 것에 의의를 두는 문제.. deepcopy 없어도 풀 수 있을 것 같긴한데 나중에 더 생각해 봐야겠다. solve() 함수는 구슬을 쏘는 모든 경우의 수를 재귀로 탐..

알고리즘 2021.10.12

[SWEA] 2105. 디저트 카페

https://swexpertacademy.com/main/code/problem/problemDetail.do?contestProbId=AV5VwAr6APYDFAWu#;return%20false; SW Expert Academy SW 프로그래밍 역량 강화에 도움이 되는 다양한 학습 컨텐츠를 확인하세요! swexpertacademy.com 일단은 까만색으로 표시한 사각형을 돌 때, 시계방향으로 돌든 시계 반대방향으로 돌든 답은 똑같다. 따라서 방향은 무조건 하나로 고정시키고 돈다. 방향을 전하기 전에 짚고 넘어가야 할 것이 있는데, 위 그림의 사각형은 네 꼭짓점 모두에서 만들 수 있기 때문에 중복이 생길 수 있게 된다. 이를 방지하기 위해서 위에서 아래로 차례대로 탐색하며, 순회하는 순서도 하나로 정해주..

알고리즘 2021.10.12

[백준] 21610. 마법사 상어와 비바라기

https://www.acmicpc.net/problem/21610 21610번: 마법사 상어와 비바라기 마법사 상어는 파이어볼, 토네이도, 파이어스톰, 물복사버그 마법을 할 수 있다. 오늘 새로 배운 마법은 비바라기이다. 비바라기를 시전하면 하늘에 비구름을 만들 수 있다. 오늘은 비바라기 www.acmicpc.net 2021 상반기 삼성 SW역량테스트 오후 기출문제이다. 크게 어려운 건 없는 문제다. 각 기능을 모두 함수로 구현했다. move_clouds는 구름이동, fall_rain은 비 뿌리기, copy_water은 물복사버그 마법, make_clouds는 구름 새로 생성, solve는 총 비의 양 계산이다. move_clouds 에서 새로운 list를 return 해주었는데, 직접 원소에 접근해서..

알고리즘 2021.10.11

[백준] 16235. 나무 재테크

https://www.acmicpc.net/problem/16235 16235번: 나무 재테크 부동산 투자로 억대의 돈을 번 상도는 최근 N×N 크기의 땅을 구매했다. 상도는 손쉬운 땅 관리를 위해 땅을 1×1 크기의 칸으로 나누어 놓았다. 각각의 칸은 (r, c)로 나타내며, r은 가장 위에서부터 www.acmicpc.net pypy3로 돌렸다. 문제만 이해하면 어렵지 않은 문제다. 그냥 시키는 대로 구현하면 된다. 나는 봄, 여름, 가을, 겨울 모두 함수를 만들어 주었다. 기본 밭 리스트, 살아 있는 나무 리스트, 겨울마다 추가될 양분 리스트, 죽은 나무 리스트를 각각 다 만들어 주었다. 이렇게 안 만들어도 될 것 같은데 생각나는 게 이거밖에 없어서.. 나중에 효율적으로 다시 풀어보긴 해야할 것 같다..

알고리즘 2021.10.07

[백준] 21609. 상어 중학교

https://www.acmicpc.net/problem/21609 21609번: 상어 중학교 상어 중학교의 코딩 동아리에서 게임을 만들었다. 이 게임은 크기가 N×N인 격자에서 진행되고, 초기에 격자의 모든 칸에는 블록이 하나씩 들어있고, 블록은 검은색 블록, 무지개 블록, 일반 블록 www.acmicpc.net 삼성 2021 상반기 문제다.. bfs를 이용해서 빡구현하는 문제다. 그냥 시키는 대로 구현하면 된다. 뭐 설명할 것도 없는 문제.. 중력 구현이 너무 헷갈렸다. 중력 관련 문제를 더 풀어야겠다는 생각이 든다. find_big_block 과 count_block를 합치고, delete를 줄일 수 있을 듯 한데.. 귀찮다.. 중간에 find_bing_block 에서 변수 이름하나 잘못 적어서 계..

알고리즘 2021.10.05

[백준] 21608. 상어 초등학교

21608번: 상어 초등학교 상어 초등학교에는 교실이 하나 있고, 교실은 N×N 크기의 격자로 나타낼 수 있다. 학교에 다니는 학생의 수는 N2명이다. 오늘은 모든 학생의 자리를 정하는 날이다. 학생은 1번부터 N2번까지 번호 www.acmicpc.net 삼성전자 2021 상반기 문제이다. input data를 리스트로 한 번에 받아 준 뒤, for 문으로 리스트를 순회하며 {학생:(좋아하는 친구)} 형식으로 dictionary에 저장하고 find_desk() 함수를 돌아가며 자리를 정해줬다. dictionary에 자료를 저장한 이유는 뒤에 만족도 조사 시에 편리하게 확인하기 위해서 이다. find_desk() 함수는 완전 탐색으로 모든 곳을 확인하며, 비어있는 책상에서 delta 변수로 상하좌우를 확인..

알고리즘 2021.10.05