여니의 취준 준비/코딩테스트 (Python) 193

[n16935] 배열 돌리기 3 in python

전형적인 구현 문제! 3번 , 4번 연산에서 연산 후 바뀐 행과 열의 값을 바꿔주지 않아서 오류가 났었다! 1,2번 연산에서는 단순히 상하좌우 대칭만 하는거라 굳이 이 과정이 필요 없다 하지만 회전하는 부분에서는 이 과정이 필수 +_+ def func(num): global array, n,m # 1번 연산 -> 배열을 상하반전 if num == 1: temp = [] for i in range(n): temp.append(array[n - 1 - i]) array = temp del temp return # 2번 연산 -> 배열 좌우반전 if num == 2: temp = [] for i in range(n): temp.append(array[i][::-1]) array = temp del temp r..

[n8394] 악수 in python

예제문제를 보다보니 점화식이 보였다 n=1일땐 1 n=2일땐 2 n=3일땐 3(1+2) n=4일땐 5 (2+3) n=5일땐 8 (3+5) 수가 매우 커질 수 있기 때문에, 마지막 자리만 출력한다. > dp[-1]%10을 해줘야 올바른 출력값이 나오게 된다. n = int(input()) dp = [0 for _ in range(n + 1)] dp[1] = 1 dp[2] = 2 for i in range(3, n + 1): dp[i] = dp[i - 1] % 10 + dp[i - 2] % 10 print(dp[-1]%10) 시간이 오래 걸려서 더 좋은 코드를 찾아보았다. dp 배열을 쓰지 않아도 변수 2개로 충분히 구할 수 있었다. (스왑) 그리고 %60을 왜 써주는 지 아직 잘 모르겠지만.. 좀 더 연구..

[n9742] 순열 in python

재귀함수 너무 어렵다 ㅠㅠ.. 매번 풀어도 헷갈리고 적응 안되는 것들 중 하나가 재귀함수 :( 너무 지저분하게 코드를 짠 것 같아서 좀 더 고민해보고 찾아봐야겠다 ㅠㅠ 일단은 for문 안에서 1차적으로 첫번째 숫자를 고른 뒤 permu 함수를 실행한다. permu 함수 내에서 for문을 또 따로 돌려주고 그 안에서 재귀함수를 호출하여 순열을 찾아나가면 된다. 만약 현재 값이 입력값과 개수가 똑같고 answer_num이 n과 같다면? 답을 찾은것이다! answer_num = 0 answer = '' def permu(n, cnt): global answer_num global answer if len(answer) == len(word): answer_num += 1 if answer_num == n: r..

[n1855] 암호 in python

처음엔 주어진 문자열을 암호화하는 줄 알고 구현을 해서 시간이 좀 걸렸다. 그러나 암호화되어 있는 문자열을 원래의 문자열로 출력하는 문제였던 것..! 열은 입력값으로 주어졌다 행은 전체 문자열을 열로 나눈 값으로 정했다. aei | jfb | cgk | lhd 1번째(aei) , 3번째(cgk)는 왼쪽 -> 오른쪽으로 판별해서 a는 array[0]에 넣고 e는 array[1]에 넣고 i는 array[2]에 넣는식으로 cgk도 넣어준다. 2번째 (jfb), 4번째(lhd)는 오른쪽->왼쪽순으로 각각의 값을 array 배열에 넣어준다. j는 array[2]에 넣고 f는 array[1]에 b는 array[0]에 그러면 array=[ [a,b,c,d], [e,f,g,i], [i,j,k,l], ] 이런식으로 자리..

[n9372] 상근이의 여행 in python

dfs로 풀었던 문제! 모든 관광지가 연결되어 있으므로 양방향 그래프를 그려준다. 양방향 그래프를 구현하는 건 아래와 같이 구현해주면 된다. a와 b가 양방향으로 연결되어 있다는걸 구현하고자 한다면, a 인덱스에 b값을 넣고 b 인덱스에 a값을 넣어주면 된다. for _ in range(m): a, b = map(int, input().split()) # 양방향 그래프 array[a].append(b) array[b].append(a) 함수 fs 부분에서는 idx와 ans를 인자로 넘겨준다. 이때 visited 배열도 사용해서 방문했는지 체크한다. 만약 방문한 곳이 아니라면 dfs 호출! 방문한 곳이라면 아무런 작업 x import sys input=sys.stdin.readline t = int(inp..

[n10546] 배부른 마라토너 in python

이렇게 하니까 시간초과 ㅠ ㅠ 리스트의 경우에는 시간이 자료의 크기에 비례하여 늘어나지만 딕셔너리는 거의 일정한 시간으로 탐색을 완료한다. 따라서 리스트 대신 딕셔너리로 다시 구현을 해보았다. n=int(input()) array=[] for _ in range(2*n-1): person=input() if person not in array: array.append(person) else: array.remove(person) print(*array) person이 dic에 이미 이름을 올린 경우? -> dic에서 정보를 지운다 (마라톤 완주 성공한 사람이니까) dic에는 완주를 못한 사람만 남아있다. dic={key:value} key가 dic에 있는 걸 알고자한다면 if key in dic 조건문으..

[n2628] 종이 자르기 in python

뚜렷한 방법이 떠오르지 않아서 구하는 풀이를 직접 적어보고 찾아내었다. 위 예제로 생각해보았다. 행 = 8, 열 = 10 1번 상자 : 2 X 4 2번 상자 : 2 X (10-6) 3번 상자 : (3-2) X 4 4번 상자 : (3-2) X (10-6) 5번 상자 : (8-3) X 4 6번 상자 : (8-3) X (10-4) 행과 열을 각각 리스트로 받으면 행 = [0,2,3,8] 열 = [0,4,10] 행[i+1]-행[i] || 열[j+1]-열[j] 위 식을 이용하면 방금 풀었던 풀이대로 프로그램 구현이 가능해진다. sort() 과정은 필수 col, row = map(int, input().split()) rows = [0, row] # 행 cols = [0, col] # 열 for _ in range..

[n15722] 빙글빙글 스네일 in python

빙글빙글 움직일 때 위 1칸, 오른쪽 1칸, 아래 2칸, 왼쪽 2칸, 위 3칸, 오른쪽 3칸 ... 이동하는 걸 보면 규칙을 찾을 수 있다. 그래서 위, 오른쪽 처리는 upRight() 함수가 해주고 아래, 왼쪽 이동 처리는 downLeft() 함수가 처리해준다. 여기서는 dx,dy의 값을 반대로 뒤집어줘야함! 위로 올라가면 y의 값이 +1 되어야하고 아래로 내려가면 y의 값이 -1이 되어야하기 때문이다. n=int(input()) # 위, 오른쪽, 아래, 왼쪽 dx=[0,1,0,-1] dy=[1,0,-1,0] x=0 y=0 num=0 def upRight(): global x,y,n,num num+=1 for _ in range(num): # 위 x += dx[0] y += dy[0] n -= 1 if..