전체 글 692

reverse와 reversed

1. reverse() : 리스트형태에 사용가능 (string에서 사용 불가능) ex) L.reverse()하면 L이 역순으로 정렬됨. ​ ​ 2. reversed(a): 리스트 및 문자에 사용가능 (return이 reversed형태이므로(입력값이 문자든 리스트든) list나 set등 iterator형식으로 바꿔야함) (문자를 입력값으로 넣어도 자동으로 list형식으로 바꿔주는 sorted()함수와는 다름) ex) list(reversed(word)) or set(reversed(myL))

if문 속 조건문의 순서

if문속에 다양한 조건문이 들어갈 때 조건문은 앞에서부터 차례대로 판단된다. ​​ 1. 오류구문이 앞에 있을때 L=[1,2,3,4] i=4 if (L[i]==0 or i==4): print("실행?") #오류 if 조건문속 L[i]는 i가 4이므로 indexErrror이 발생함. 따라서 위 코드는 에러 1. 오류구문이 뒤에 있을때 L=[1,2,3,4] i=4 if ( i==4 or L[i]==0 ): print("실행?") #작동 i=4라는 조건문에 의해 L[i]==0 이라는 조건문은 판단되지 않고 이하 if문 이하 명령문 실행.

[SW expert]5648 원자소멸시뮬레이션 #map

1. 풀이 처음에는 격자를 이용해서 풀려고 했다. (소스코드1) 0.5초 만에 만나는것을 구현하기 힘들어서 최대범위는 +-2000으로 했고, (x,y)를 (r,c)로 바꿔주기위해 r=2*x+2000, c=2*y+2000으로 하여 4000*4000의 격자를 만들어준 후 문제를 풀었다. 하지만 이 방법으로는 메모리 초과가 났다. ​ 따라서 아래와 같이 격자를 쓰지 않는 방법으로 문제를 풀었다. (1) atomD에 현재 원자들의 상태와 상태를 저장한다 (2) 이동시킨다 - 범위 밖이면 삭제한다 (이동할 때 원자가 범위 밖에서 만나는 경우는 없으므로) - 범위 안이면 cheakD에 저장하고, 바뀐 위치를 새롭게 atomD에 저장한다 (이때 cheakD는 dictionary형태로, key값을 (행,열)과 같은 튜..

알고리즘/구현 2020.06.18

[백준]1141 접두사 #문자열

1. 풀이 (1) 다른단어의 접두사가 되는 단어는 접두사X 리스트에서 제거한다. (제거 후 남는 단어의 집합이 곧 접두사x집합) ex) h,hi,xi, hio, run, hcc, hipo, runn, runc, runni, running ​ (2) 다른단어의 접두사가 되는 단어는 항상 다른단어보다 크기가 작거나 같다. 따라서 문자열의 길이가 짧은 순서대로 정렬을 하고, 자기 위치보다 뒤에있는 단어와만 비교한다. ​ 2. 소스코드 N=int(input()) L=[] for i in range(N): word=input() L.append(word) L.sort(key=len) ans=0 for i in range(N): nowWord=L[i] isHead=False for j in range(i+1,N):..

알고리즘/구현 2020.06.18

[프로그래머스]2020카카오공채 기둥과 보 #시뮬레이션

1. 풀이 조건에 맞게 구현하면된다. 설치할때는 설치할 수 있는지 조건을 만족하는지, 삭제할때는 삭제한 후에도 모든 기둥과 보가 존립할 수 있는지를 따지면 된다. 입력이 좌표평면에서 x,y로 주어지는데, 이를 행렬로 바꾸면 x가 r, y가 c, 즉 좌표평면을 시계방향으로 90도 회전했다고 생각하면 된다. 그리고 기둥,보 설치여부를 리스트 L을 통해서 관리했다 (L[r][c][a] : r행 c열의 a가 설치되어있으면 1, 설치안되어있으면 0, 보는 해당좌표의 아래방향, 기둥은 해당좌표의 우측방향) 즉 x행,y열의 0(기둥)을 설치하면 L[x][y][0]=1, 삭제하면 L[x][y][0]=0 x행,y열의 1(보)를 설치하면 L[x][y][1]=1, 삭제하면 L[x][y][1]=0 으로 나타내준다. ​ 설치하..

알고리즘/구현 2020.06.18

[백준]프렉탈 평면 #구현

1.풀이 0으로 모두 초기화 시켜놓고, 검사해야하는 점 마다 time=1일때 부터 time=s 까지 중 언제 색칠됐전 점인지를 확인해준다. (정확히 말하면 time=1이 가장 마지막으로 색칠된 점이고, time=s가 가장 처음 색칠된 점) ​ ex) 예시 i,j가 검은점인지 아래의 순서대로 확인해준다. (색이 칠해졌음이 확인되었으면 바로 다음 점 확인) 1*1검은 점에 속해있는지 time=1일때 3*3검은 점에 속해있는지 time=2일때 5*5검은 점에 속해있는지 time=3일때 ​ 이때 짝수와 홀수일 때 범위가 달라지는것에 주의한다. ​ 2. 소스코드 import sys s,N,K,R1,R2,C1,C2=map(int,input().split()) #시간 0이면 그냥끝 if s==0: print("0")..

알고리즘/구현 2020.06.18

[백준]17135 캐슬디팬스 #시뮬레이션#BFS

1. 풀이 (1) 모든 가능한 궁수의 위치에 대한 경우의 수를 구한다. (2) 하나의 경우의 수에 대해서 아래를 수행한다 - 궁수공격 - 적이동 ​ * "(1) 궁수의 공격"에서 여러 궁수가 조건에만 만족한다면 같은 적을 동시에 쏠 수 있다는것을 주의한다. * 또한 "(1) 궁수의 공격" 은 [1. 극한의 구현]을 하거나 짧은거리부터 공격을 하고, 거리가 같으면 왼쪽부터 공격하므로 [2. bfs를이용]할 수 있다. ​ [1. 극한의 구현] from copy import deepcopy from itertools import combinations N,M,D=map(int,input().split()) L=[] for i in range(N): L.append(list(map(int,input().spli..

알고리즘/구현 2020.06.18

[백준]17281_야구_#시뮬레이션#완탐

* 베이스상태를 list의 요소로( 1루:base[0], 2루:base[1], 3루:base[2] )로 했을때는 시간초과. * 베이스상태를 1루는 a, 2루는 b, 3루는 c 로 바꿔주면 통과 ​ 1. 베이스를 리스트로(시간초과) from itertools import permutations inning=[] n=int(input()) for _ in range(n): inning.append(list(map(int,input().split()))) permu=list(permutations([i for i in range(1,9)],8)) ans=0 #각 경우 확인 for case in permu: nowCase=list(case) nowCase.insert(3,0) nowCase=tuple(nowCa..

알고리즘/구현 2020.06.18

[백준]5624 좋은수 #시뮬레이션#dp

1. 풀이 (1) i+j+k=x를 i+j=x-k로 바꿔서 생각한다. (i번째수 + j번째수 = x번째수 - k번째수) (2) x가 가능한지 확인: k가 0번째부터 x-1번째까지 한번돌면서 (x번째-k번째)가 가능(방문되었는지)한지 확인 (3) x까지 추가되서 만들수 있는 숫자 최신화 : j가 0번째부터 x번째까지 돌면서 새로운숫자 (x번째+j번째)를 방문 * Ai의 범위는 -100000~100000이므로 x-k의 범위는 -200000~200000. 따라서 이를 리스트 인덱스로 만들어주려면 0~400000아 되므로 isPossible 리스트는 400001로 초기화 (4) (2),(3)의 과정을 N번반복. O(N^2) ​ 2. 소스코드 N=int(input()) L=list(map(int,input().sp..

알고리즘/구현 2020.06.18

[백준]15685 드래곤커브 #회전

1. 풀이 행렬에서 한 점을 축으로 하고, 90도로 회전할 때, 이를 식으로 나타낼 수 있다. 축으로 하는 점을 (x,y), 90도로 회전시킬 점을 (a,b), 회전된 점을 (A,B)라고 할 때 (1) 시계방향으로 회전 A=x-y+b B=x+y-a (2) 반시계방향으로 회전​ A=x+y-b B=-x+y+a ​ 2. 소스코드 x,y를 각각 행과 열로 바꿔서 생각하면, 시계방향이 아닌 반시계 방향으로 움직여야 하고, 입력값 d도 (x는 행, y는 열로) 다르게 생각해 주어야 한다. N=int(input()) myMap=[[0 for _ in range(101)] for _ in range(101)] dR=[1,0,-1,0] dC=[0,-1,0,1] for i in range(N): r,c,d,g=map(in..

알고리즘/구현 2020.06.17

[프로그래머스] 숫자블록 #약수

https://programmers.co.kr/learn/courses/30/lessons/12923 코딩테스트 연습 - 숫자 블록 1 10 [0, 1, 1, 2, 1, 3, 1, 4, 3, 5] programmers.co.kr 1. 풀이 위와 같은 규칙으로 블록을 설치하여 1번블록부터 10,000,000번 블록까지 규칙을 모두 적용하면 최종블록은 아래와 같다. i 1 2 3 4 5 6 7 8 9 10 11 ... d[i] 0 1 1 2 1 3 1 4 3 5 1 ... 이 블럭의 규칙은 바로 [ d[i]는 i의 약수중 자기자신을 제외한 가장 큰 숫자 ] 라는 것이다. 따라서 d[i]=i/(i의 약수 중 1을 제외한 가장 작은 숫자) 가 된다. 이때 주의할점은 (1) i가 소수(약수가 1or 자기자신)밖에..

알고리즘/수학 2020.06.17

[백준]1850 최대공약수 #유클리드호제법#pypy

1. 풀이 (1) 1만으로 구성된 두 숫자 a,b의 최대공약수 c도 1만으로 구성됨. (2) 이때 a의 1의개수,b의 1의개수의 최대공약수 = c의 1의개수 (3) 속도관련(곱하기로표현, 포문쓰기, int로 출력) - 곱하기로표현(소스코드1) 포문쓰기(소스코드2) 포문+int로 출력(소스코드3) pypy 통과 시간초과 시간초과 python 통과 통과 시간초과 - 곱하기로 표현 (소스코드1) print("1"*N) -포문쓰기 (소스코드2) ans="" for i in range(N): ans+="1" print(ans) - int로 출력 (소스코드3) ans="" for i in range(N): ans+="1" print(int(ans)) 2. 소스코드 (1) 소스코드1 a,b=map(int,input(..

알고리즘/수학 2020.06.17

[백준]2812 크게만들기 #그리디#스택

1. 풀이 (1) 전체 문자열을 N번반복 (2) 전체 문자열의 i번째 반복때(i번째 숫자일때) 아래와 같은경우가 나올때까지 스택에서 숫자를 뽑음 ① 스택에 숫자가 없는경우 ② 스택에서 뽑은 숫자가 i번째 숫자보다 크거나 같을때 ③ 지울수 있는 횟수를 다 썼을때 (3) 최종적으로 나온 stack에서 왼쪽부터 N-K개까지의 숫자가 답이됨. ​ 2. 소스코드 from collections import deque N,K=map(int,input().split()) num=input() size=len(num) cut=0 stack=deque([num[0]]) isFull=False for i in range(1,size): intI=int(num[i]) # 1. 스택에 숫자가 없으면 그만 while(stack)..

알고리즘/수학 2020.06.17