//1. 0~9까지 데이터를 포함한 list 생성
//2. i에 0값 대입 후 for문 print 수행
//3. 수행 후 i에 2 증가
//4. i가 9를 초과하면 else문 수행
for i in range(0,10,2):
print(i)
else:
print("모든 데이터 출력")
출력
0
2
4
6
8
모든 데이터 출력
코드
//1. 0~9까지 데이터를 포함한 list 생성
//2. i에 0값 대입 후 for문 print 수행
//3. 수행 후 i에 2 증가
//4. i가 9를 초과하거나 i가 3보다 크면 for문 탈출
//5. break로 수행되었기 때문에 else문 무시
for i in range(0,10,2):
print(i)
if i >= 3:
break
else:
print("모든 데이터 출력")
출력
0
2
4
간단한 for문 및 for문을 모두 완료시 수행하는 else문을 설명했다.
지금까지 했던 다른언어 C++, C#, Java에서도 이런 코드가 있던가?
아무튼 for~else문은 현재 for문을 모두 돌았는지 확인하는? 그런 용도로 쓰일것 같다.
//1. 사용자 입력을 받는다.
//2. 문자열 입력 데이터를 ',' 기준으로 자른후 문자열 리스트를 반환한다.
//3. 문자열 리스트를 float으로 모두 변환 시킨다.
//4. float으로 변환된 float 리스트를 a, b에 저장한다.
//5. 저장된 a, b를 출력한다.
a, b = map(float, input("-->").split(','))
print(a, b)
입력
--> 1,2
출력
1 2
알고리즘 문제 풀다보면 사용자 입력을 받아야 하는 문제가 존재한다.
이전 C++로 풀었다면 생각보다 귀찮은 코드가 추가되어야 하지만 python은 이처럼 간단하게 처리가 가능하다.
- 소스는 정보를 의미 한다. 즉 우리가 보내고자 하는 순수 메세지 정보 소스(information source)를 가지고 있는 데이터 뭉치이다. 소스 정보는 아날로그 형식의 m(t)일 수도 있고, 디지털 신호의 01101... 일수도 있다.
2. 소스 부호화(source encoding)
- 소스 부호화는 2가지 일을 하는데 A/D 변환(Analog-to-Digital Conversion), 데이터 압축 기능을 한다. 소스가 디지털 신호 일 경우 A/D 변환을 생략한다. 핵심은 소스 부호화를 통해 압축된 디지털 데이터가 출력으로 나오는 것이다.
- A/D 변환 (Analog-to-Digital Conversion)은 샘플링, 양자화, 부호화를 거쳐 PCM(Pulse Code Modulation) 포맷을 만드는 과정이다. 샘플링은 나이퀴스트 샘플링 정리, 영자화에서는 양자화에 따른 잡음이 존재한다.
- 압축 과정은 원래의 소스 데이터가 가지고 있는 리던던시 비트를 제거한다. 데이터 압축 과정은 정보이론에서 나온다고 한다.
3. 채널 부호화(channel encoding)
- 소스 부호화와 달리 리던던시 비트를 더하는 과정이며, 데이터를 정확히 전송하기 위한 블록이다. 오류 정정 부호(error correction code)를 사용하여 부호화를 수행한다.
- 오류 정정 부호(error correction code)의 예로 (3,1) 반복 부호(repetition code)를 들 수 있는데 간단하게 0을 보낼때 000을 보내고 1을 보낼때 111을 보내는 방식이다. 수신 단에서는 010이 왔을대 0이 더 많으므로 0으로 추정한다.
4. 변조(modulation)
- 채널 부호화까지 마친 디지털 신호를 받아 출력으로 아날로그 신호 s(t)를 채널로 보낸다. 예를 들어 위상변조(Binart Phase Shift Keying, BPSK)를 사용할때 0이면 cos(t), 1이면 -cos(t)를 보내는 간단한 방법이다.
5. 채널(channel)
- 변조블록에서 출력으로 나온 s(t)데이터를 이동시키는 터널이다. 무선 통신 채널, 전화선 채널, 광섬유 채널 등이 있으며 각 채널들은 환경적인 요인으로 인한 잡음(n(t)) 이 생길 수도 있다.
6. 복조(demodulation)
- 채널에서 감지된 신호 ((전송 신호)s(t) + (잡음)n(t))를 받아 0또는 1을 판정(detection)한다. 아날로그 신호에 비해 데이터가 훨신 적은 이진(0,1) 데이터만 판단 하므로 아날로그 신호에 비해 복조가 비교적 간결하고, 빠르다. 아날로그 통신에서는 수신단에서 오류 없이 m(t)를 복원할 수는 없다.
7. 채널 복호화(channel decoding)
- 복조 과정에서 나온 데이터 (s(t) + n(t))에서 리던던시 코드를 보고 오류 정정을 수행한다. 너무 많은 오류가 발생했다면 고치지 못한다.
8. 소스 복호화(source decoding)
- 이전 소스 부호화(source encoding)에서 압축, A/D Conversion(ADC) 했던 데이터를 압축을 풀고, D/A Conversion(DAC)를 수행한다. 원래의 소스 신호가 디지털 신호 였다면 DAC 과정은 생략한다.
9. 싱크(sink)
- 최종 데이터 m(t)는 정보 싱크(information sink)를 의미하는데, 음악 신호, 스피커 신호를 의미한다.
결론 :
디지털 통신은 위의 9가지 블록도가 있으며 각 블록이 다른 기능을 수행해도 궁극적인 목표는
만약 통신시스템의 성능이 증가 하였다면 3가지 요인 중에 최소한 하나 이상의 자원이 증가 되었음을 알 수 있다.
1. 전력
전력 은 송신전력(transmisson power), 계산하는 데 필요한 전력으로 구분할 수 있다.
전력이 커질때 문제점 중 하나는 무선통신 환경에서 전력을 자주 사용함으로 써 더욱 많은 신호를 보냈을때
다중 사용자 간섭(multi-user-interference) 확률이 증가하는 하는 것이다. 이는 수신부에서 ACK신호가 없기 때문에 다시 보내야 하는 문제까지 초래가 된다. 또한 전력은 많이 사용한 송신부 뿐만 아니라 다른 송신부에도 간섭이 생기기 때문에 문제가 발생한다.
2. 대역폭
정보를 빨리 보내는 것과 연관되어 있다. 대역폭은 서로 다른 스위치간의 간섭을 회피하기위해 각기 다른 스위치, 시스템 마다 분리 되어 있다. (ex 900MHz~930MHz사이의 주파수 영역을 사용 할 경우 대역폭은 30MHz)
한국 통신 3사 5g 대역폭 분리 예시 출처 : JTBC뉴스
3. 복잡도
복잡도는 대부분 한정 되어있는 대역폭은 상수로 두고, 시스템 복잡도를 키우고 송신전력을 줄이는 방식으로 연구 되어 있다. 복잡도는 주로 정보를 정확히 보내는 데에 도움이 된다. 복잡도와 전력은 trade off 관계이다.
1. "남 여 남", 또는 "여 남 여" 순으로 남자 10명, 여자 10명 나열 시 가능한 경우의 수는?
2. 남자 5명에 대해서 나열 시 가능한 경우의 수는?
5!(5팩토리얼)
데이터 통신
1. osi 7 계층을 말하세요.
1L 물리 계층
- 0,1 등 2진비트를 다루며, 네트워크 하드웨어 전송 기술을 이룬다.
2L 데이터링크 계층
- CRC 기반의 오류 제어와 흐름 제어가 필요한 레이어 이며, MAD address를 다룬다.
3L 네트워크 계층
- 라우팅, 흐름제어, 세그멘테이션, 오류 제어, 인터네트워킹 등을 수행한다.
4L 전송 계층
- 종단간 통신을 다루는 최하위 계층으로 TCP를 다룬다.
5L 세션 계층
- 양 끝단의 응용 프로세스가 통신을 관리하기 위한 방법을 제공하며 TCP/IP를 다룬다.
6L 표현계층
- 코드 간의 번역을 담당하여 유저 시스템에서 데이터 형식상의 차이를 다룬다. 아스키 인코딩 등 그런 기능
7L 응용계층
- 응용 프로세스들 사이의 전환을 제공한다. 사용자 입출력 I/O 등
2. 2 계층 데이터링크 계층의 역할은 무엇인가요?
2L 데이터링크 계층
- CRC 기반의 오류 제어와 흐름 제어가 필요한 레이어 이며, MAD address를 다룬다.
3. ARQ 프로토콜이란?
4L 전송 계층에서 다루며 데이터 전송 보장을 위해 사용하며, Selective Repeat ARQ(선택적 방법)이라 부른다.
수신자에게 오류가 발생한 수신 패킷만을 다시 전송하기 때문에 불필요한 재전송을 피한다.
GBN방식의 단점을 보완한 모습이다.
컴퓨터 사이언스
1. 포인터와 배열의 차이는?
정답 : 포인터는 동적할당을 가능하게 하며 변수에 주소값이 저장됩니다. 그리고 동적할당한 데이터는 힙메모리에 저장 됩니다. 배열은 정적할당을 합니다. 포인터와 동일하게 변수에 주소값이 저장되고 참조하는 방식도 포인터와 동일하지만 중괄호[]를 이용하여 읽기/쓰기가 가능합니다. 그리고 정적할당한 데이터는 스텍메모리에 저장 됩니다.
2. 파이썬에서 딕셔너리는 무엇인가?
정답 : 딕셔너리는 immutable한 키(key)와 mutable한 값(value)으로 맵핑되어 있는 순서가 없는 집합입니다.
추가 : HashTable 자료구조와 같으며, Key값을 Hashfunction을 거쳐서 나온 주소에 Value가 있는 구조 입니다.
3. numpy 라이브러리는 무슨 기능을 하는 라이브러리인가?
정답 : “Numerical Python“의 약자로 대규모 다차원 배열과 행렬 연산에 필요한 다양한 함수를 제공합니다.
4. tensor flow를 사용해 보았는가?
얼굴인식 프로젝트 전용으로 간단하게 사용해봤습니다.
5. Reinforcement learning 이란?
정답 : 머신러닝 의 기법중 하나인 강화 학습이며 현재의 상태를 인식하여, 선택 가능한 행동들 중 보상을 최대화하는 행동 혹은 행동 순서를 선택하는 방법
본인의 장단점
연구실에 지원한 동기
연구실을 까지 알게 된 동기
현 직장에서 무슨 일을 하는가?
무슨 언어를 사용하는가?
참고한 영상을 보고 질문할 것이 있는가?
소감
잘못 한 점
1. 질문에 대한 대답을 어떻게든 해보려고 동문서답하는 경우가 자주 있다.
- 예를 들어서 연구실은 어떻게 알게되었는가에서 하이 브레인넷에서 보고 왔다.라고 대답하기에는 매우 성의 없어 보여서 하이 브레인 넷에서 보고 왔고, 현재 나의 문제 (ex 학문적 지식의 깊이가 없다)를 주저리 설명하고 그래서 찾아보고 하이 브레인넷에서 찾게 되었다는 등 대답이 난해했다.
2. 영어점수가 매우 낮다.
- 언급은 안했지만 탈락 사유로 충분하다.
3. 수학에 대한 지식이 준비가 안되어있다.
- 간단한 확률문제, 간단한 푸리에 변환 조차 하지 못했다.
4. 회사에서 하는 업무에 대해서 정확하게 전달하지 못했다.
- 하는 업무에 대해서 처음에 차량용 카메라 개발로 이해를 시키는 바람에 왜 C#을 하는지에 대해서 설명을 다시 했다. (의사 전달을 못했다는 증거)
잘한 점
1. 참고하라는 영상을 보고 분석하여 질문 시간에 구체적인 질문으로 연구실에 관심이 있음을 표현했다.
2. 장단점을 설명하라고 할때 SW적으로 자신감을 표현하여 나 하면 SW 개발자로 떠올리게끔 했다.
using OpenCvSharp;
using System.Windows;
using System.Windows.Controls;
using WpfApp1.utility;
namespace WpfApp1.usercontrol
{
/// <summary>
/// ImageViewer.xaml에 대한 상호 작용 논리
/// </summary>
public partial class ImageViewer : UserControl
{
public ImageViewer()
{
InitializeComponent();
}
public Mat MatImage
{
get { return (Mat)GetValue(MyProperty); }
set { SetValue(MyProperty, value); }
}
public static readonly DependencyProperty MyProperty =
DependencyProperty.Register(
"MatImage",
typeof(Mat),
typeof(ImageViewer),
new FrameworkPropertyMetadata(new PropertyChangedCallback(OnMyPropertyChanged)));
private static void OnMyPropertyChanged(DependencyObject d, DependencyPropertyChangedEventArgs e)
{
ImageViewer viewer = d as ImageViewer;
viewer.image.Source = ImageHandler.IplImageToInteropBitmap((e.NewValue as Mat));
}
}
}
주요코드
1. MatImage의 GetValue,SetValue
2. MyProperty의 등록 과정
DependecyProperty.Register(
"MatImage", // 실제 xaml에 노출 시킬 변수 명 추 후 Binding 시킨다.
typeof(Mat), // 위의 MatImage의 타입을 정의한다.
typeof(ImageViewer), // MatImage 변수를 가지고 있는 객체 타입을 정의한다.
new FrameworkPropertyMetadata(new PropertyChangedCallback(OnMyPropertyChanged)));
//OnMyPropertyChanged 함수로 콜백을 등록한다.
3. OnMyPropertyChanged 함수
DependecyObject - MatImage 인스턴스를 가지고 있는 오너 인스턴스 타입으로 사용.
DependencyPropertyChangedEventArgs - 외부 Binding을 통해 전달된 Mat Type의 인스턴스.
private static void OnMyPropertyChanged(DependencyObject d, DependencyPropertyChangedEventArgs e)
{
ImageViewer viewer = d as ImageViewer; // 오너 인스턴스로 변환
//e.NewValue as Mat으로 외부에서 바인딩한 데이터 변환
viewer.image.Source = ImageHandler.IplImageToInteropBitmap((e.NewValue as Mat));
}
ViewModel 폴더
MainViewModel.cs
using GalaSoft.MvvmLight;
using GalaSoft.MvvmLight.Command;
using Microsoft.Win32;
using OpenCvSharp;
using WpfApp1.utility;
namespace WpfApp1.ViewModel
{
/// <summary>
/// This class contains properties that the main View can data bind to.
/// <para>
/// Use the <strong>mvvminpc</strong> snippet to add bindable properties to this ViewModel.
/// </para>
/// <para>
/// You can also use Blend to data bind with the tool's support.
/// </para>
/// <para>
/// See http://www.galasoft.ch/mvvm
/// </para>
/// </summary>
public class MainViewModel : ViewModelBase
{
Mat _matImage;
public Mat matImage
{
get
{
return _matImage;
}
set
{
_matImage = value;
RaisePropertyChanged(() => matImage);
}
}
public RelayCommand OpenImage { get; set; }
public MainViewModel()
{
OpenImage = new RelayCommand(OpenImageAction);
}
void OpenImageAction()
{
OpenFileDialog openFileDialog = new OpenFileDialog();
openFileDialog.RestoreDirectory = true;
openFileDialog.DefaultExt = "jpg";
openFileDialog.Filter = "Images Files(*.jpg; *.bmp; *.png)|*.jpg;*.bmp;*.png";
if (openFileDialog.ShowDialog() == true)
{
//Get the path of specified file
string strImagePath = openFileDialog.FileName;
matImage = ImageHandler.OpenImage(strImagePath);
}
}
}
}
주요 코드
1. matImage 프로퍼티를 이용한 바인딩 코드
Mat _matImage;
public Mat matImage
{
get
{
return _matImage;
}
set
{
_matImage = value;
RaisePropertyChanged(() => matImage);
}
}