목록코팅테스트/백준 문제 모음 (296)
For Programmer
https://swexpertacademy.com/main/code/problem/problemDetail.do?contestProbId=AV15FZuqAL4CFAYD SW Expert Academy SW 프로그래밍 역량 강화에 도움이 되는 다양한 학습 컨텐츠를 확인하세요! swexpertacademy.com 문제 설명이 참으로 이해하기 어렵다.. 또한 히든 케이스 예를들어) 암호코드가 처음7개가 일치하는 데도 불구하고 그 다음7개가 일치하지 않는 경우 다시 처음으로 돌아가 인덱스를 한개 증가시켜서 그다음 7개 부터 검사해야하는 방식으로 코드를 짜야하는 경우가 케이스에 있다. 이러한 예외케이스를 설명을 안해주니 찾기가 참으로 힘들었다.. 나머지는 쉽게 구현할 수 있었고 주석으로 달아놨다. import s..
![](http://i1.daumcdn.net/thumb/C150x150/?fname=https://blog.kakaocdn.net/dn/pJN6d/btrwMHiK51r/KpaD5Ad9UVr2DLBpOZX4u0/img.png)
간단히 dfs 나 bfs로 노드를 타고 들어가면서 그전의 노드를 부모로 설정해주는 부모를 가리키는 리스트하나만 만들면 된다. 두개 모두 코드를 올려놨다. import sys from collections import deque sys.setrecursionlimit(5000) input = sys.stdin.readline def dfs(cur): visited[cur] = True for nxt in graph[cur]: if not visited[nxt]: parent[nxt] = cur dfs(nxt) def bfs(start): queue = deque([start]) visited[start] = True while queue: v = queue.popleft() for i in graph[v]..
![](http://i1.daumcdn.net/thumb/C150x150/?fname=https://blog.kakaocdn.net/dn/RqSIY/btrwTw1e9oE/kliywgshhE6nAhOWwYkPMk/img.png)
이 문제... 방문처리 때문에 2시간을 소비했다. 반드시 큐에 넣기전에 방문처리를 해주고 넣자.!!!!!!!!! 문제 해결법은 간단하다. BFS가 조금 복잡하다 싶으면 3차원 방문처리를 생각하면된다. 어느 좌표 r,c가 있으면 visited[r][c][방향] 으로 처리하여 r,c 좌표에 대하여 4가지방향 동 서 남 북의 방문처리를 각각해주면 된다. 자세한 설명은 주석으로 달아 놨다. import sys from collections import deque input = sys.stdin.readline M, N = map(int, input().split()) miro = [list(map(int, input().split())) for _ in range(M)] start_r, start_c, star..
https://swexpertacademy.com/main/code/problem/problemDetail.do?contestProbId=AV5PpFQaAQMDFAUq SW Expert Academy SW 프로그래밍 역량 강화에 도움이 되는 다양한 학습 컨텐츠를 확인하세요! swexpertacademy.com 해당 문제 처음에는 일반적인 구현문제인줄 알았으나 풀다보니 dfs라는것을 알게 되었다. 전체 풀이방식은 다음과 같다. 1. 각 달마다 일 가격 * 수영장에 가야하는 해당 달의 일수 와 달가격중 싼것을 저장해준다. 2. 1에서 구해진 값들을 기준으로 한달가격으로 적용하거나 일부 달을 3달가격으로 적용하는 것 중 어떤 값이 모든 경우를 계산하여 어느 값이 더 적은지 구해준다.(dfs를 이용) 3. 2에..
![](http://i1.daumcdn.net/thumb/C150x150/?fname=https://blog.kakaocdn.net/dn/y2pMs/btrwJv2Ensm/RYWFiiKNzQB7WDyY2MfiQ1/img.png)
위 문제는 정답률이 22%에 해당하는 괴랄한 문제이다. 골드4치고는 어려운데 그 이유는 벽을 부술때 방문처리와 부수지 않을때 방문처리를 따로 해주어 검사해야하기 때문이다.(3차원 리스트로 처리해주어야함) 또한 벽을 1번 부쉈으면 2번이상 못부수게 처리도 해주어야 하기 때문에 쉽지않았다. (다풀어놓고 자꾸 틀리길래 무엇이 잘못됐나 한참봤는데 큐에서 꺼낸 값을 직접 바꾸면 그 꺼낸 방향에서 이동하는 상하좌우의 모든 방향에 영향을 준다.... 이걸 못찾아서 40분 정도 걸렸다... 꼭 실수하지 마시길.. 주석으로 해당 부분 설명해놨다.) from collections import deque N, M = map(int, input().split()) miro = [list(map(int, input())) fo..
![](http://i1.daumcdn.net/thumb/C150x150/?fname=https://blog.kakaocdn.net/dn/dV1yqs/btrwMGvg6U2/DPJuvo2NEBK5MARvKLvclk/img.png)
해당 문제 처음에 문제이해하기가 힘들어서 조금 해맸다. 문제에서 결국 구하라는 것은 육지에서 가장 멀리갈 수 있는 길의 거리를 찾으라는 문제이다. 그냥 육지 지점을 모두 좌표로 저장해서 모든 육지지점에서 부터 출발해서 거리를 계산해서 가장큰 값을 찾는방식으로 했는데 파이썬으로 풀면 시간초과가 난다. 그래서 찾아보니 가운데에 껴있는 육지들 즉, 위아래로 그리고 양옆으로 모두 육지인 애들은 어차피 최대의 거리가 나올수 없기 때문에 그냥 검사하지 않고 넘어가는 식으로 코드를 구성했다. 굳이 따로 구현은 하지 않았지만 관심있으면 찾아보기 바란다. import sys from collections import deque input = sys.stdin.readline N, M = map(int, input().s..
![](http://i1.daumcdn.net/thumb/C150x150/?fname=https://blog.kakaocdn.net/dn/W2wNw/btrwMF398s0/I1qIIovcjFDuZwfsPeej11/img.png)
간단히 각 점에서 부터 bfs돌면서 각각 노드마다 거리를 계산해서 계속 더해주면 된다. 단, 이문제는 dfs로는 풀 수 없고 bfs로 풀어야하는 문제라는 것만 유의하면 된다. 또한 한가지 더 유의할 점이 관계가 중복돼서 제공될 수 있기 때문에 관계를 저장할 때 리스트가 아닌 셋으로 저장했다. from collections import deque N, M = map(int, input().split()) graph = [set() for _ in range(N + 1)] for i in range(M): a, b = map(int, input().split()) graph[a].add(b) graph[b].add(a) bacon = [] # 베이컨 수 저장 def bfs(v): global result v..
![](http://i1.daumcdn.net/thumb/C150x150/?fname=https://blog.kakaocdn.net/dn/cmPKlR/btrwzcBBJcZ/6kO26j1a6Iqk0XRQEVAWGK/img.png)
해당문제는 그래프문제이다. 사실 이것이 그래프 문제라는 것을 발견하지 못한다면 굉장히 어렵게 풀 수도 있다. 위아래의 숫자중 위의 숫자가 부모 아래숫자가 자식 노드라고 생각하면 되며 싸이클을 도는 집합이 몇개 있는지를 찾는 문제이다. 그리고 그 집합의 원소들을 오름차순으로 출력하는 문제이다. 즉, 여기서 말하는 싸이클이란 1이란 숫자를 뽑았을 때 자식의 숫자를 쭉쭉 따라가다가 결국 1이 나오면 싸이클이라고 할 수 있다. 즉 처음에 뽑은 숫자가 나와야한다. 해당 문제를 2가지 방법으로 구현해봤다. 1. visited 배열을 한번만 만들어서 처리하기(즉, 싸이클이 된 집합의 원소들만 True로 방문처리를 설정하여 검색해야하는 탐색의 수를 줄이는 방법) N = int(input()) graph = [[] fo..