본문 바로가기

728x90

IT 일기

17070 / 파이프 옮기기 1 파이썬 https://www.acmicpc.net/problem/17070 17070번: 파이프 옮기기 1 유현이가 새 집으로 이사했다. 새 집의 크기는 N×N의 격자판으로 나타낼 수 있고, 1×1크기의 정사각형 칸으로 나누어져 있다. 각각의 칸은 (r, c)로 나타낼 수 있다. 여기서 r은 행의 번호, c는 열의 www.acmicpc.net bfs, dfs, 누적합 총 세가지 방법으로 풀어봤다. 당연히 bfs, dfs는 시간초과가 났고 마지막 누적합에서 통과됐다. 시간은 bfs > dfs 이다. bfs의 경우 deque에 append, popleft()하는 과정에서 시간이 소요되는듯 하다. 1. 누적합을 이용한 코드 (성공) N = int(input()) maps=[] for _ in range(N): map.. 더보기
#3 WILT 배열 돌리기 & 괄호추가하기 https://www.acmicpc.net/problem/16637 16637번: 괄호 추가하기 길이가 N인 수식이 있다. 수식은 0보다 크거나 같고, 9보다 작거나 같은 정수와 연산자(+, -, ×)로 이루어져 있다. 연산자 우선순위는 모두 동일하기 때문에, 수식을 계산할 때는 왼쪽에서부터 순 www.acmicpc.net https://www.acmicpc.net/problem/17406 17406번: 배열 돌리기 4 크기가 N×M 크기인 배열 A가 있을때, 배열 A의 값은 각 행에 있는 모든 수의 합 중 최솟값을 의미한다. 배열 A가 아래와 같은 경우 1행의 합은 6, 2행의 합은 4, 3행의 합은 15이다. 따라서, 배열 A의 www.acmicpc.net 삼성 코테 생각보다 어려워서 큰일이다. 배열.. 더보기
16637번 / 괄호 추가하기 - 파이썬 https://www.acmicpc.net/problem/16637 16637번: 괄호 추가하기 길이가 N인 수식이 있다. 수식은 0보다 크거나 같고, 9보다 작거나 같은 정수와 연산자(+, -, ×)로 이루어져 있다. 연산자 우선순위는 모두 동일하기 때문에, 수식을 계산할 때는 왼쪽에서부터 순 www.acmicpc.net 소스코드 def calcpart(n1,n2,ex): if ex == '+': return n1+n2 elif ex == '-': return n1-n2 elif ex == '*': return n1*n2 def recursive(numQue,exQue,start): commands = [] def generate(numQue,start,init_command): if start >= .. 더보기
배열 돌리기 4 - 파이썬 def permutation2(arr, length): #조합 [1,2,3],2 => [1,2],[1,3],[2,1],[2,3],[3,1],[3,2] used = [0 for _ in range(len(arr))] returnArr = [] def generate(chosen): if len(chosen) == length: returnArr.append(chosen[:]) return for i in range(len(arr)): if used[i] == 0: #아직 사용 안됨 used[i] = 1 chosen.append(arr[i]) generate(chosen) chosen.pop() used[i] = 0 generate([]) return returnArr def rotate2(arr,case).. 더보기
마법사 상어와 비바라기 - 파이썬 N,M = map(int,input().split()) baskets = [] for i in range(N): baskets.append(list(map(int,input().split()))) # clouds = [[0 for _ in range(N)] for _ in range(N)] # clouds[N-1][0], clouds[N-1][1], clouds[N-2][0],clouds[N-2][1] = 1,1,1,1 clouds = [[N-1,0],[N-1,1],[N-2,0],[N-2,1]] dx = [0,-1,-1,-1,0,1,1,1] dy = [-1,-1,0,1,1,1,0,-1] for _ in range(M): d,s = map(int, input().split()) # print(clouds).. 더보기
n*n 2차원 배열 달팽이 알고리즘 - 파이썬 n이 홀수인 경우 그리고 n*n인 2차원 배열인 경우에만 사용할 수 있는 코드 일듯하다. 달팽이가 벽에 부딪히거나 방향을 바꿔야 하는 경우 바뀔 방향은 고정적이라는 특성을 활용했다. import copy n = int(input()) arr = [[0 for _ in range(n)] for _ in range(n)] dx = [0,-1,1,0,0] dy = [0,0,0,-1,1] check_arr = copy.deepcopy(arr) check_arr[0][0] = 1 move_path_back=[[0,0,2]] move_path_start=[[n//2,n//2,1]] while True: before = move_path_back[-1] way = before[2] curr = [before[0]+d.. 더보기
Go 컨텍스트란? Cancle, Deadline, Timeout, Value Go에서 컨텍스트는 조건과 같은 기능을 한다. 예를 들어 특정 go루틴에게 1. 내가 이 명령어를 사용하면 멈춰! 2. 이 시간까지만 작동해! 3. 이 시간동안만 작동해! 4. 이거 갖고 가! 등의 조건을 달아서 실행할 수 있다. 하나씩 예시와 함께 살펴보자 1. 멈춰!!! WithCancle() package main import ( "context" "fmt" "time" ) func longRunningTask(ctx context.Context) { fmt.Println("background long running task launched") select { case cancelFunc() 실행 => ctx.Done채널에 값 넣어짐 => longRunningTask에서 select로 ctx.Don.. 더보기
Go 채널이란? 동시성 프로그래밍에서 가장 중요한 문제는 같은 메모리 영역에 동시에 접근해서 생기는 race condition 문제이다. 이 문제를 해결하기 위해 mutex, semaphore등 특정 영역에 대한 lock과 unlock을 걸어 특정 메모리 영역에 동시에 접근하지 못하게 한다. Go에서도 mutex.lock, mutex.unlock을 사용할 수 있지만 이 경우 해당 영역을 읽고 쓰는 모든 영역에 lock, unlock을 해줘야 한다. 코드 복잡성을 늘릴 수 있다. 그렇다고 무조건적으로 channel만 사용해야 하는건 아니다. 다음 글들을 통해 channel만 사용하는 것은 좋지 않다는 것을 알 수 있다. https://blog.naver.com/PostView.naver?blogId=sjc02183&log.. 더보기

728x90