공부하고 기록하는, 경제학과 출신 개발자의 노트

백준 77

[Python] 백준 4195. 친구 네트워크

https://www.acmicpc.net/problem/4195 4195번: 친구 네트워크 문제 민혁이는 소셜 네트워크 사이트에서 친구를 만드는 것을 좋아하는 친구이다. 우표를 모으는 취미가 있듯이, 민혁이는 소셜 네트워크 사이트에서 친구를 모으는 것이 취미이다. 어떤 사이트의 친구 관계가 생긴 순서대로 주어졌을 때, 두 사람의 친구 네트워크에 몇 명이 있는지 구하는 프로그램을 작성하시오. 친구 네트워크란 친구 관계만으로 이동할 수 있는 사이를 말한다. 입력 첫째 줄에 테스트 케이스의 개수가 주어진다. 각 테스트 케이스의 첫째 줄에는 친구 관계 www.acmicpc.net Union Find의 응용문제. 친구 네트워크의 숫자를 구하기 위해, 하나의 거대한 union network의 parent에 '얼마..

[Python] 백준 2206. 벽 부수고 이동하기

https://www.acmicpc.net/problem/2206 2206번: 벽 부수고 이동하기 N×M의 행렬로 표현되는 맵이 있다. 맵에서 0은 이동할 수 있는 곳을 나타내고, 1은 이동할 수 없는 벽이 있는 곳을 나타낸다. 당신은 (1, 1)에서 (N, M)의 위치까지 이동하려 하는데, 이때 최단 경로로 이동하려 한다. 최단경로는 맵에서 가장 적은 개수의 칸을 지나는 경로를 말하는데, 이때 시작하는 칸과 끝나는 칸도 포함해서 센다. 만약에 이동하는 도중에 한 개의 벽을 부수고 이동하는 것이 좀 더 경로가 짧아진다면, 벽을 한 개 까지 부수고 이동 www.acmicpc.net BFS이면서 heapq 라이브러리를 활용하는 방식에서 실마리를 찾았고, 방문여부를 확인하는 visited배열에 하나의 dime..

[Python] 백준 3055. 탈출

https://www.acmicpc.net/problem/3055 3055번: 탈출 문제 사악한 암흑의 군주 이민혁은 드디어 마법 구슬을 손에 넣었고, 그 능력을 실험해보기 위해 근처의 티떱숲에 홍수를 일으키려고 한다. 이 숲에는 고슴도치가 한 마리 살고 있다. 고슴도치는 제일 친한 친구인 비버의 굴로 가능한 빨리 도망가 홍수를 피하려고 한다. 티떱숲의 지도는 R행 C열로 이루어져 있다. 비어있는 곳은 '.'로 표시되어 있고, 물이 차있는 지역은 '*', 돌은 'X'로 표시되어 있다. 비버의 굴은 'D'로, 고슴도치의 위치는 'S'로 나 www.acmicpc.net BFS 문제. '고슴도치 S가 먼저 이동하고, 고슴도치가 이미 이동한 공간이라 해도 물이 해당 공간을 잠식하도록' 코드를 구성했다. 고슴도치..

[Python] 백준 1261. 알고스팟

https://www.acmicpc.net/problem/1261 1261번: 알고스팟 첫째 줄에 미로의 크기를 나타내는 가로 크기 M, 세로 크기 N (1 ≤ N, M ≤ 100)이 주어진다. 다음 N개의 줄에는 미로의 상태를 나타내는 숫자 0과 1이 주어진다. 0은 빈 방을 의미하고, 1은 벽을 의미한다. (1, 1)과 (N, M)은 항상 뚫려있다. www.acmicpc.net BFS를 사용하지만, BFS에서 사용하는 queue를 heap 자료구조로 활용해야 하는 독특한 문제. heap을 사용하는 이유는 '벽을 가장 적게 부수고 이동하는 경우'가 항상 우선순위에 위치한 채 BFS로 순회해야 하기 때문. 이 개념을 생각 못해서 문제를 푸는 데 정말 오래 걸렸다.

[Python] 백준 3190. 뱀

https://www.acmicpc.net/problem/3190 3190번: 뱀 문제 'Dummy' 라는 도스게임이 있다. 이 게임에는 뱀이 나와서 기어다니는데, 사과를 먹으면 뱀 길이가 늘어난다. 뱀이 이리저리 기어다니다가 벽 또는 자기자신의 몸과 부딪히면 게임이 끝난다. 게임은 NxN 정사각 보드위에서 진행되고, 몇몇 칸에는 사과가 놓여져 있다. 보드의 상하좌우 끝에 벽이 있다. 게임이 시작할때 뱀은 맨위 맨좌측에 위치하고 뱀의 길이는 1 이다. 뱀은 처음에 오른쪽을 향한다. 뱀은 매 초마다 이동을 하는데 다음과 같은 규칙을 따 www.acmicpc.net 시뮬레이션 문제. 주어진 조건대로 프로그램을 짜면 충분히 해결할 수 있다. '방향을 바꾸는 경우'를 계산하기 위한 함수를 만들고, 뱀의 좌표를 ..

[Python] 백준 14890. 경사로

https://www.acmicpc.net/problem/14890 14890번: 경사로 첫째 줄에 N (2 ≤ N ≤ 100)과 L (1 ≤ L ≤ N)이 주어진다. 둘째 줄부터 N개의 줄에 지도가 주어진다. 각 칸의 높이는 10보다 작거나 같은 자연수이다. www.acmicpc.net 조건에 맞게 식을 만들어야 하는 시뮬레이션 문제. [1,1,1,2,2,2] 처럼 왼쪽 -> 오른쪽으로 갈수록 경사가 상승할 경우는 쉽게 해결이 가능하지만, [2,2,2,1,1,1] 처럼 경사가 하강하는 경우의 조건을 만들어내는 게 아주 번거로웠다. 코드 로직은 현재 값 start = arr[0]으로 저장하고, index 1부터 끝까지 iteration하면서 아래 조건으로 구분한다. temp = 연속된 값이 몇 개 있는지..

[Python] 백준 14499. 주사위 굴리기

https://www.acmicpc.net/problem/14499 14499번: 주사위 굴리기 첫째 줄에 지도의 세로 크기 N, 가로 크기 M (1 ≤ N, M ≤ 20), 주사위를 놓은 곳의 좌표 x y(0 ≤ x ≤ N-1, 0 ≤ y ≤ M-1), 그리고 명령의 개수 K (1 ≤ K ≤ 1,000)가 주어진다. 둘째 줄부터 N개의 줄에 지도에 쓰여 있는 수가 북쪽부터 남쪽으로, 각 줄은 서쪽부터 동쪽 순서대로 주어진다. 주사위를 놓은 칸에 쓰여 있는 수는 항상 0이다. 지도의 각 칸에 쓰여 있는 수는 10을 넘지 않는 자연수 또는 0이다. 마 www.acmicpc.net 삼성SW역량평가 시뮬레이션 문제. 코드가 어렵다기보다는 문제를 이해하는 게 고통스러웠다. 문제를 풀기 위해서는 1. 주사위라는 ..

[Python] 백준 14888. 연산자 끼워넣기

https://www.acmicpc.net/problem/14888 14888번: 연산자 끼워넣기 첫째 줄에 수의 개수 N(2 ≤ N ≤ 11)가 주어진다. 둘째 줄에는 A1, A2, ..., AN이 주어진다. (1 ≤ Ai ≤ 100) 셋째 줄에는 합이 N-1인 4개의 정수가 주어지는데, 차례대로 덧셈(+)의 개수, 뺄셈(-)의 개수, 곱셈(×)의 개수, 나눗셈(÷)의 개수이다. www.acmicpc.net 삼성SW역량테스트 기출문제. 연산자를 만들어낼 수 있는 경우의 수를 생성해야 하는데, combinations를 쓰면 (+,*)와 (*,+)가 같은 경우로 인식된다. 모든 경우의 수를 제대로 반영하려면 permutations를 쓸 수 있고, permutations에서 만들어지는 중복 문제는 set()..

[Python] 백준 16234. 인구 이동

https://www.acmicpc.net/problem/16234 16234번: 인구 이동 N×N크기의 땅이 있고, 땅은 1×1개의 칸으로 나누어져 있다. 각각의 땅에는 나라가 하나씩 존재하며, r행 c열에 있는 나라에는 A[r][c]명이 살고 있다. 인접한 나라 사이에는 국경선이 존재한다. 모든 나라는 1×1 크기이기 때문에, 모든 국경선은 정사각형 형태이다. 오늘부터 인구 이동이 시작되는 날이다. 인구 이동은 다음과 같이 진행되고, 더 이상 아래 방법에 의해 인구 이동이 없을 때까지 지속된다. 국경선을 공유하는 두 나라의 인구 차이가 L명 www.acmicpc.net 삼성SW역량테스트 기출문제. 조건대로 코드를 만들었는데, Python으로는 78%에서 시간초과가 뜨고 PyPy3으로 실행하면 통과한다..

[Python] 백준 13458. 시험 감독

https://www.acmicpc.net/problem/13458 13458번: 시험 감독 첫째 줄에 시험장의 개수 N(1 ≤ N ≤ 1,000,000)이 주어진다. 둘째 줄에는 각 시험장에 있는 응시자의 수 Ai (1 ≤ Ai ≤ 1,000,000)가 주어진다. 셋째 줄에는 B와 C가 주어진다. (1 ≤ B, C ≤ 1,000,000) www.acmicpc.net 삼성A형 기출문제는 지금까지 거의 다 Brute Force + DFS / BFS 형태였는데, 별다른 고민없이 그냥 풀었던 문제. 모든 시험방에는 최소 한 명의 총감독관이 필요하고, (각 방에 남은 응시자 수 / 부감독관 1인당 처리할 수 있는 사람 수) 값을 소수점 이하 올림하면 각 방에 들어갈 수 있는 부감독관의 최소 숫자가 나온다.