본문 바로가기

Tech

(580)
[인프런] 역수열 문제설명 1부터 n까지의 수를 한 번씩만 사용하여 이루어진 수열이 있을 때, 1부터 n까지 각각의 수 앞에 놓여 있는 자신보다 큰 수들의 개수를 수열로 표현한 것을 역수열이라고 한다. 예를 들어, 다음과 같은 수열이 있다고 가정하자. [4, 8, 6, 2, 5, 1, 3, 7] 이 때, 1 앞에 놓여있으면서 1보다 큰 수는 4,8,6,2,5로 5개이고, 2 앞에 놓여있으면서 2보다 큰 수는 4,8,6 이렇게 3개, 3 앞에 놓여있으면서 3보다 큰 수는 4,8,6,5 총 4개이다. 따라서 [4, 8, 6, 2, 5, 1, 3, 7] 의 역수열은 [5, 3, 4, 0, 2, 1, 1, 0]이 된다. n과 1부터 n까지의 수를 사용하여 이루어진 수열의 역수열이 주어질 때, 원래의 수열을 출력하라. 입력조건 첫..
[인프런] 증가수열 만들기 문제설명 1부터 N까지의 모든 자연수로 구성된 길이 N의 수열이 주어진다. 이 수열의 왼쪽 맨 끝 숫자 또는 오른쪽 맨 끝 숫자 중 하나를 가져와 나열해 가장 긴 증가수열을 만든다. 이 때 수열에서 가져온 숫자는 그 수열에서 제거된다. 예를 들어, 2 4 5 1 3 이 주어지면 만들 수 있는 가장 긴 증가수열의 길이는 4이다. 맨 처음 왼쪽 끝에서 2를 가져오고, 그 다음 오른쪽 끝에서 3을 가져오고, 왼쪽 끝에서 4, 왼쪽 끝에서 5를 가져와 2 3 4 5 증가수열을 만들 수 있다. 입력조건 첫째 줄에 자연수 N(3
[인프런] 침몰하는 타이타닉 문제설명 타이타닉 유람선이 침몰하고 있다. 유람선에는 N명의 승객이 타고 있다. 구명보트를 타고 탈출해야 하는데 타이타닉에 있는 구명보트는 2명 이하로만 탈 수 있으며, 보트 한 개에 탈 수 있는 총 무게도 M kg 이하로 제한되어 있다. N명의 승객 몸무게가 주어졌을 때 승객 모두가 탈출하기 위한 구명보트의 최소개수를 출력하는 프로그램을 작성해라. 입력조건 첫째 줄에 자연수 N(5
[인프런] 창고 정리 문제설명 창고에 상자가 가로방향으로 일렬로 쌓여 있다. 만약 가로의 길이가 7이라면 아래와 같이 되어 있다고 해보자. 1열은 높이가 6으로 6개의 상자가 쌓여 있고, 2열은 3개의 상자, 3열은 9개의 상자가 쌓여 있으며 높이는 9라고 읽는다. 창고 높이 조정은 가장 높은 곳에 있는 사장 1개를 가장 낮은 곳으로 이동하는 것을 말한다. 가장 높은 곳이나 가장 낮은 곳이 여러곳이라면 그 중 아무거나 선택하면 된다. 위에 그림을 1회 높이 조정을 하면 아래와 같아진다. 창고의 가로 길이와 각 열의 상자 높이가 주어진다. m회의 높이 조정을 한 후 가장 높은 곳과 가장 낮은 곳의 차이를 출력하는 프로그램을 작성하라. 입력조건 첫째 줄에 창고 가로의 길이긴 자연수 L(1
[인프런] 씨름 선수 문제설명 현수는 씨름 감독이다. 현수는 씨름 선수를 선발공고를 냈고, N명의 지원자가 지원을 했다. 현수는 각 지원자의 키와 몸무게 정보를 알고 있다. 현수는 씨름 선수 선발 원칙을 다음과 같이 정했다. "다른 모든 지원자와 일대일 비교하여 키와 몸무게 중 적어도 하나는 크거나, 무거운 지원자만 뽑기로 했다." 만약 A라는 지원자보다 키도 크고 몸구게도 무거운 지원자가 존재한다면 A지원자는 탈락이다. 입력조건 첫째 줄에 지원자의 수 N(5
[인프런] 회의실 배정 문제설명 한 개의 회의실이 있는데 이를 사용하고자 하는 n개의 회의들에 대하여 회의실 사용표를 만들려고 한다. 각 회의에 대해 시작시간과 끝나는 시간이 주어져 있고, 각 회의가 겹치지 않게 하면서 회의실을 사용할 수 있는 최대수의 회의를 찾아라. 단, 회의는 한 번 시작하면 중간에 중단될 수 없으며 한 회의가 끝나는 것과 동시에 다음 회의가 시작될 수 있다. 입력조건 첫째 줄에 회의의 수 n(1
[인프런] 마구간 정하기 문제설명 N개의 마구간이 수직선 상에 있다. 각 마구간은 $x_1, x_2, x_3, \ ..., \ x_N$의 좌표를 가지며 마구간 간에 좌표가 중복되는 일은 없다. 현수는 C마리의 말을 가지고 있는데, 이 말들은 서로 가까이 있는 것을 좋아하지 않는다. 각 마구간에는 한 마리의 말만 넣을 수 있고, 가장 가까운 두 말의 거리가 최대가 되게 말을 마구간에 배치하고 싶어한다. C마리의 말을 N개의 마구간에 배치했을 때 가장 가까운 두 말의 거리가 최대가 되는 그 최대값을 출력하는 프로그램을 작성해라. 입력조건 첫 줄에 자연수 N(3
[인프런] 랜선자르기 문제설명 엘리트 학원은 자체적으로 K개의 랜선을 가지고 있다. 그러나 K개의 랜선은 길이가 제각각이다. 선생님은 랜선을 모두 N개의 같은 길이의 랜선으로 만들고 싶었기 때문에 K개의 랜선을 잘라서 만들어야 한다. 예를 들어, 300cm 짜리 랜선에서 140cm 짜리 랜선 두 개를 잘라내면 20cm는 버려야 한다.(이미 자른 랜선을 붙일 수 없다.) 편의를 위해 랜선을 자를 때 손실되는 길이는 없다고 가정하며, 기존의 K개의 랜선으로 N개의 랜선을 만들 수 없는 경우는 없다고 가정하자. 그리고 자를 때는 항상 센티미터 단위로 정수 길이만큼 자른다고 가정하자. N개보다 많이 만드는 것도 N개를 만드는 것에 포함된다. 이 때 만들 수 잇는 최대 랜선의 길이를 구하는 프로그램을 작성해라. 입력조건 첫째 줄에는 ..
[밑시딥] 오직! Numpy로 오차역전파를 사용한 신경망 학습 구현하기 🔊 해당 포스팅은 밑바닥부터 시작하는 딥러닝 1권의 교재 내용을 기반으로 딥러닝 신경망을 Tensorflow, Pytorch와 같은 딥러닝 프레임워크를 사용하지 않고 순수한 Numpy로 구현하면서 딥러닝의 기초를 탄탄히 하고자 하는 목적 하에 게시되는 포스팅입니다. 내용은 주로 필자가 중요하다고 생각되는 내용 위주로 작성되었음을 알려드립니다. 저번 포스팅에서 행렬 곱을 연산하는 계층과 활성화 함수가 적용된 계층의 역전파 방법까지 알아보면서 신경망 학습의 오차역전파 방법을 모두 이해해보았다. 이번 포스팅에서는 그동안 배운 내용들을 기반으로 오직 넘파이를 활용한 오차역전파 신경망 학습을 구현해보자. 먼저 복습 차원에서 활성화 함수와 손실 함수를 넘파이로 구현하는 소스코드를 보고 가자. 1. 활성화 함수(Si..
[인프런] 격자판 회문수 문제설명 1부터 9까지의 자연수로 채워진 7 by 7 격자판이 주어지면 격자판 위에서 가로방향 또는 세로방향으로 길이 5자리 회문수가 몇 개 있는지 구하는 프로그램을 작성해라. 회문수란 121과 같이 앞에서부터 읽으나 뒤에서부터 읽으나 같은 수를 말한다. 단, 빨간색 처럼 구부러진 경우(87178)는 회문수로 간주하지 않는다. 입력조건 1부터 9까지의 자연수로 채워진 7 by 7 격자판이 주어진다. 출력조건 5자리 회문수의 개수를 출력한다. 사고과정 우선 데이터 범위가 7로 정해져있기도 하고 5자리이기 때문에 객 행, 열 방향으로 1칸씩 최대 2번 이동할 수 있다. 행에서는 구현하기 쉬웠지만 열 방향으로는 구현하는 데 고민을 했다. 리스트는 넘파이와 달리 열 방향으로 슬라이싱이 불가능하기 때문이다. 그래..
[인프런] 스도쿠 검사 문제설명 스도쿠는 9 by 9 크기의 보드가 있을 때, 각 행과 각 열, 그리고 9개의 3 by 3 크기의 보드에 1부터 9까지의 숫자가 중복 없이 나타나도록 보드를 채우면 된다. 예를 들어 다음을 보자. 위 그림은 스도쿠를 정확하게 푼 경우이다. 각 행에 1~9까지의 숫자가 중복 없이 나오고, 각 열에 1~9까지의 숫자가 중복 없이 나오고, 각 3 by 3짜리 사각형(9개이며, 위에서 색깔로 표시되었다)에 1~9까지의 숫자가 중복 없이 나오기 때문이다. 완성된 9 by 9 크기의 스도쿠가 주어지면 정확하게 풀었으면 'YES', 잘 못 풀었으면 'NO'를 출력해라. 입력조건 첫 줄에 완성된 9 by 9 스도쿠가 주어진다. 출력조건 첫 줄에 'YES' 또는 'NO'를 출력한다. 사고과정 중복되지 않고 1~..
[인프런] 봉우리 문제설명 지도 정보가 N by N 격자판에 주어진다. 각 격자에는 그 지역의 높이가 쓰여있다. 각 격자판의 숫자 중 자신의 상,하,좌,우 숫자보다 큰 숫자는 봉우리 지역이다. 봉우리 지역이 몇 개 있는지 알아내는 프로그램을 작성해라. 격자의 가장자리는 0으로 초기화 되었다고 가정한다. 만약 N=5 이고, 격자판의 숫자가 다음과 같다면 봉우리의 개수는 10개이다. 입력조건 첫 줄에 자연수 N(1 arr[x+1][y] and tmp > arr[x][y-1] and tmp > arr[x][y+1]: return True return False n = int(input()) arr = [[0] * (n+2) for _ in range(n+2)] for i in range(n): data = list(map(in..
[인프런] 곳감(모래시계) 문제설명 현수는 곳감을 만들기 위해 감을 깎아 마당에 말리고 있다. 현수의 마당은 N by N 격자판으로 이루어져 있으며, 현수는 각 격자단위로 말리는 감의 수를 정한다. 그런데 해의 위치에 따라 특정 위치의 감은 잘 마르지 않는다. 그래서 현수는 격자의 행을 기준으로 왼쪽, 또는 오른쪽으로 회전시켜 위치를 변경해 모든 감이 잘 마르게 한다. 만약 회전명령 정보가 2, 0, 3 이면 2번째 행을 왼쪽(0)으로 3만큼 아래 그림처럼 회전시키는 명령이다. 첫 번째 수는 행번호, 두 번째 수는 방향인데, 0이면 왼쪽, 1은 오른쪽이고, 세 번째 수는 회전하는 격자의 수이다. M개의 회전명령을 실행하고 난 후 아래와 같이 마당의 모래시계 모양의 영역에는 감이 총 몇개가 있는지 출력하는 프로그램을 작성해라. 입력..
[인프런] 사과나무(다이아몬드) 문제설명 위 그림과 같이 N*N처럼 5*5로 사과나무가 존재할 때, 색깔로 칠해진 사과나무에 존재하는 사과들의 개수 합을 구하여라. 사과들의 개수는 한 칸 내에 있는 값을 의미한다. 사고과정 처음에 어떻게 구현해야 할지 몰랐다... 행을 하나씩 돌면서 시작점, 끝점 인덱스인 s와 e를 변수로 정의해서 풀어야 했다. 이 때, s, e의 초기값은 N을 2로 나눈 몫인 즉, 가장 가운데 지점부터 시작한다. 그래야 다이아몬드의 맨 윗점을 의미하니깐! 그리고 행이 중간까지 갈때까지는 s를 -1, e를 +1해주고 그 이후 행부터는 s를 +1, e를 -1 해주면서 더해야 한다. 풀이(스스로 못 푼 풀이) n = int(input()) arr = [list(map(int, input().split())) for _ ..
[밑시딥] 오직! Numpy와 계산 그래프를 활용해 활성화 함수 계층 오차역전파 이해하기 🔊 해당 포스팅은 밑바닥부터 시작하는 딥러닝 1권의 교재 내용을 기반으로 딥러닝 신경망을 Tensorflow, Pytorch와 같은 딥러닝 프레임워크를 사용하지 않고 순수한 Numpy로 구현하면서 딥러닝의 기초를 탄탄히 하고자 하는 목적 하에 게시되는 포스팅입니다. 내용은 주로 필자가 중요하다고 생각되는 내용 위주로 작성되었음을 알려드립니다. 저번 포스팅에서 오차역전파 개념을 계산 그래프로 이해하고 간단한 곱셈, 덧셈 연산에 대한 오차역전파를 넘파이로 구현하는 방법에 대해 알아보았다. 이번 포스팅에서는 곱셈, 덧셈 연산을 넘어서서 나눗셈과 활성화 함수 연산에 대한 오차역전파가 어떻게 동작하는지 이해해보고 이를 넘파이로 구현하는 방법에 대해서도 알아보자. 신경망 모델은 덧셈, 곱셈 연산도 존재하지만 가장 ..
[BOJ] 2003번 - 수들의 합 2 문제설명 https://www.acmicpc.net/problem/2003 2003번: 수들의 합 2 첫째 줄에 N(1 ≤ N ≤ 10,000), M(1 ≤ M ≤ 300,000,000)이 주어진다. 다음 줄에는 A[1], A[2], …, A[N]이 공백으로 분리되어 주어진다. 각각의 A[x]는 30,000을 넘지 않는 자연수이다. www.acmicpc.net 사고과정 이중 for 문을 구현하면 시간초과 판정이 나기에 투 포인터를 활용해야 했다.(왼쪽 포인터, 오른쪽 포인터 하나씩) 부분 수열의 합이 m보다 작을때, 같을 때, 클 때를 나누어서 처리해주어야 한다. 작을 때는 오른쪽 포인터를 하나씩 늘려가면서 합을 갱신해주면 되고 크거나 같을 때는 왼쪽 포인터에 있는 값을 합에서 빼주고 왼쪽 포인터 인덱스..
[밑시딥] 오직! Numpy와 계산 그래프를 활용해 오차역전파 이해하기 🔊 해당 포스팅은 밑바닥부터 시작하는 딥러닝 1권의 교재 내용을 기반으로 딥러닝 신경망을 Tensorflow, Pytorch와 같은 딥러닝 프레임워크를 사용하지 않고 순수한 Numpy로 구현하면서 딥러닝의 기초를 탄탄히 하고자 하는 목적 하에 게시되는 포스팅입니다. 내용은 주로 필자가 중요하다고 생각되는 내용 위주로 작성되었음을 알려드립니다. 저번 포스팅까지 파라미터의 기울기를 구하는 방법으로서 수치 미분이 무엇인지 알아보고 넘파이로 구현하는 방법에 대해서도 알아보았다. 그리고 그를 기반으로 신경망을 학습시키는 것도 구현해보았다. 그런데 수치미분을 활용해서 파라미터의 기울기를 구하는 방법은 단순한 계산이지만 시간이 오래걸린다는 단점이 존재했다. 왜냐하면 저번 포스팅의 소스코드를 살펴보면 알겠지만, 하나의..
[ML] Tensorflow Window Dataset 객체로 시계열 예측 구현하기 이번 포스팅에서는 Tensorflow 2.x 버전에서 제공하는 Window Dataset 객체로 시계열 순환신경망을 구현하는 방법에 대해 알아본다. 최근에 수요 예측 알고리즘 대회에 참가하면서 Tensorflow를 활용해 딥러닝으로 시계열 예측을 시도했는데, 구현하는 과정이 순조롭지 않았다. 레퍼런스 문서를 Tensorflow 공식 문서를 활용해 구현하려 했지만 개인적으로 이해하기가 매우 난해했다. 너무 작성자 위주로 작성되어 있다고 해야 할까? 그러던 중 유용한 유투브 강의를 참고하면서 tf.data.Dataset 객체를 활용해 시계열 Window 데이터셋을 만드는 데 성공했다. 그리고 시계열 데이터를 예측하는 데 있어서 문제에 따라 예측하는 유형이 매우 다양하다는 것을 느꼈다. 그래서 이번 기회에 알..
[밑시딥] 오직! Numpy와 수치 미분을 통해 신경망 학습시키기 🔊 해당 포스팅은 밑바닥부터 시작하는 딥러닝 1권의 교재 내용을 기반으로 딥러닝 신경망을 Tensorflow, Pytorch와 같은 딥러닝 프레임워크를 사용하지 않고 순수한 Numpy로 구현하면서 딥러닝의 기초를 탄탄히 하고자 하는 목적 하에 게시되는 포스팅입니다. 내용은 주로 필자가 중요하다고 생각되는 내용 위주로 작성되었음을 알려드립니다. 저번 시간까지 배웠던 Numpy로 신경망을 구성하는 방법과 이미 학습된 파라미터로 추론해보는 단계까지 해보았다. 이번 포스팅에서는 직접 넘파이로 설계한 신경망을 데이터를 통해 파라미터를 '학습'시키는 방법에 대해 알아보자. 먼저 학습시키는 방법을 알아보기 전에 손실함수라는 개념에 대해 알아야 한다. 손실함수는 일명 파라미터를 어떤 방향으로 학습시킬지 가이드라인을 제..
[BOJ] 1748번 - 수 이어 쓰기 1 문제설명 https://www.acmicpc.net/problem/1748 1748번: 수 이어 쓰기 1 첫째 줄에 N(1 ≤ N ≤ 100,000,000)이 주어진다. www.acmicpc.net 사고과정 주어지는 데이터 범위 최댓값이 1억이기 때문에 일반 loop문으로 해결해서는 시간 초과가 분명히 발생한다. 따라서 고민을 많이 했는데.. 10의 자릿수(10의 제곱수) 기준으로 분할해서 1억까지의 누적 자릿수 합을 DP 테이블로 미리 만들어 놓고 N이 주어졌을 때, N의 자릿수보다 2보다 작은 인덱스값의 DP 테이블을 참조한다. 그리고 N 자릿수에서 1을 뺀 자릿수의 10의 제곱수와 N의 차이 + 1한 값에다가 N의 자릿수를 곱해주면 N과 동일한 자릿수의 10의 제곱수부터 N까지의 숫자를 붙여놓은 자..