파이썬

    [python3] 행렬 다루기 (zip, *, 행렬)

    [python3] 행렬 다루기 (zip, *, 행렬)

    코테를 풀다보면 [[1,2] [3,4]] 를 [[1,3] [2,4]]로 바꾸고 싶을때가 있다. 물론 코딩을 통해 하나씩 옮겨주는 방법도 있지만 문제는 이런 사소한 부분들을 신경쓰다보면 이상하게 말리는 경우가 생긴다는 것이다. python 행렬 전치를 구글링하면 numpy를 사용하여 전치하는 예시들이 나오는데, 코딩테스트에서는 이런 외부 라이브러리를 사용하지 못하는 경우가 발생한다. 이때를 대비하기 위해 행렬을 다루는 방법을 알아본다. 행렬 전치하기 a = [ [1,2] , [3,4] ] b = list(zip(*a)) for tmp in b: print(tmp) # (1,3) # (2,4) zip(*배열) 을 사용해주면 간단히 행과 열을 바꿔줄 수 있다. 행렬 회전하기 방금 우리는 zip을 통해 행렬을 ..

    [python3] 문자열 형변환 (int, float, str, chr, ord)

    [python3] 문자열 형변환 (int, float, str, chr, ord)

    코테를 하다가 갑자기 아스키코드에서 숫자로 변환하는 함수를 까먹어서 상당히 애를 먹었다. 이참에 정리를 해서 명확하게 해보자 int() int() 의 경우 문자열(숫자(정수만)), 실수, bool 을 정수로 변환해준다. float() float()의 경우 문자열(숫자), 실수, bool을 실수로 변환해준다. str() str()의 경우 모든 입력값을 문자열로 변환한다. chr() chr()의 경우 입력값을 문자로 변환시킨다. 이때 아스키 코드에 따라 변환되기 때문에 아스키 코드를 넣으면 문자로 변환된다. 주로 코테에 많이 쓰는거 같다. ord() ord()의 경우 chr()와 반대로 문자를 아스키코드값으로 반환한다. 따라서 'a'를 넣으면 아스키코드값인 97을 반환한다. 단, 아스키 코드에 존재하는 값만..

    백준 2206 파이썬 풀이 (BFS, 벽 부수고 이동하기, 이차 배열 사용)

    이 문제는 정말 나를 못살게 괴롭히는 놈이었다. 배열을 어떻게 해야할지 어떤 기준으로 visited를 하게 할지 굉장히 고민을 많이 하게 만들었다. 3차원 배열로 풀으라는데 내 방식대로 풀기 위해 상당히 고생을 했다. 우선 경우를 나누어본다. 벽을 뿌수고 이동하는 경우에는 다양하게 길이 갈리게 된다. 따라서 이미 누군가 지나간 길에 대해서 계속 갈지 말지를 정해야한다. 편의상 플레이어(경로를 가는 포인트)와 스킬(벽을 부쉈는지 아닌지)이라고 하겠다. 그렇다면 4가지 경우로 나눈다. 1. 스킬을 쓰지 않은 플레이어가 지나간 자리를 스킬을 쓰지 않은 플레이어가 마주쳤을때 => 더이상 진행할 이유가 없다. 왜냐면 앞선 플레이어가 더 효율적 2. 스킬을 쓰지 않은 플레이어가 지나간 자리를 스킬을 쓴 플레이어가 ..

    백준 1707 python 풀이 (이분 그래프, BFS)

    일단 처음에 문제를 읽고는 생각보다 쉽다고 느꼈다. 단순히 BFS로 탐색하면서 이전 값이랑 비교하면 되겠구만 했다. 그런데 구현하는데 상당히 애를 먹었고, 시간초과가 떠서 오랜 삽질 중이다. 우선 시간초과 코드는 아래와 같다. from collections import deque import sys input = sys.stdin.readline T = int(input()) def BFS(v,e,color, d,q): color[q[0]] = 1 visited = [0 for i in range(v+1)] while q: target = q.popleft() visited[target] = 1 targets = d[target] for t in targets: if visited[t] == 0: q.a..

    백준 7562 python 풀이 (나이트의 이동, BFS, 그래프)

    백준 7562 python 풀이 (나이트의 이동, BFS, 그래프)

    문제는 나이트가 위와 같이 움직일 수 있을때 몇번 움직이면 원하는 목적지에 도달하는지 구하는 문제이다. 이전에 BFS문제와 아주 유사하다. 다만 그전에는 한칸씩 상하좌우로 움직였지만 이번에는 좀더 여러방면으로 움직이는 차이가 있다. 이때 가장 적은 움직임의 수를 구해야 하기 때문에 DFS가 아닌 BFS로 풀면 된다. 1. BFS를 구현 2. 좌표의 움직임을 구현 3. 이미 움직이거나 움직일 곳은 표시하여 중복을 제거 이를 토대로 코드를 구현하면 아래와 같다. from collections import deque T = int(input()) def BFS(l, start, end): M = [[0 for i in range(l)] for i in range(l)] M[start[0]][start[1]] ..

    백준 2740 풀이 (행렬 곱셈)

    이 문제는 어렵지는 않았지만 살짝 귀찮은 문제였다. 나는 당연히 무식하게 for 돌려서 풀었다. import sys n,m = map(int, sys.stdin.readline().split()) a = [] for _ in range(n): a.append(list(map(int,sys.stdin.readline().split()))) n2,m2 = map(int, sys.stdin.readline().split()) b=[] for _ in range(n2): b.append(list(map(int,sys.stdin.readline().split()))) final = [] for i in range(n): t = a[i] total = [] for j in range(m2): tmp = [] t =..

    백준 1780 풀이 (종이의 개수, 재귀, 파이썬)

    백준 1780 풀이 (종이의 개수, 재귀, 파이썬)

    이번에는 이전보다 더 분할하는 문제를 풀어본다. 문제는 그냥 머랄까 이전에는 반을 나누었다면 이번에는 3등분하는 문제였다. 사실 코드적인 부분이 많이 달라지지 않았다. 저번에는 반으로 나누는 과정을 조금 무식하게 풀었는데, 이번에는 3등분을 해야하다보니 조금더 깔끔하게 처리하려고 노력했다. 막상 비교하려고 놓고 보니 별로 큰 차이가 없어보이네;;ㅎㅎ 여튼 이러한 방식으로 풀면 되는거라 이전 문제와 크게 다른점이 없었다. 처음 제출했을때 틀렸다고 해서 당황했는데 알고보니 0개수를 1개수랑 바꿔놓고 풀었었다. 정신 차리고 풀어야 겠다. import sys n = int(sys.stdin.readline()) nr1 = 0 n0 = 0 n1 = 0 def check(p): global nr1 global n0..

    백준 1992 풀이 (쿼드트리, 파이썬)

    백준 1992 풀이 (쿼드트리, 파이썬)

    저번에 풀었던 2630 색종이 만들기 문제랑 동일하다. 다만 조금 다른점은 스트링으로 만들어주고, 어떤 포맷을 추가해주어야한다. 백준 2630 풀이 (색종이 만들기, 쿼드트리, 분할정복, 파이썬) 이 문제는 크게 어렵지는 않았다. 예전에 재귀를 처음 다뤘을때가 생각이 났다. 약 한달전이었지 그때 정말 재귀가 너무 어려워서 마치 재귀란 도대체 왜 이렇게 어려운지 마귀의 친구인가 했던 guccin.tistory.com 위의 데이터를 "(0(0011)(0(0111)01)1)" 로 나타내야 하는데 순서는 왼쪽위, 오른쪽위, 왼쪽아래, 오른쪽 아래다. 1. 만약 통일되지 않은 배열인 경우 "(" ")"가 추가된다. 2. 만약 통일되지 않은 배열인 경우 4분면으로 나누어 통일되었는지 검사한다. 3. 만약 통일되어 ..