문제 사이트 : http://codeup.kr/problem.php?id=3015


문제 설명 : 

n명의 학생에 대해 이름과 점수를 입력받고 주어진 조건(단, 출력순서는 점수가 높은 학생이 먼저 출력되며, 점수가 같을 경우 입력 순서가 빠른 순서로 출력한다.) 에 따라 첫번째부터 m번째 까지의 학생 이름을 출력하는 문제이다.


-입력-

4 2

Jeon 95

Kim 59

Lee 90

Bae 100


-출력-

Bae

Jeon


요롷게 되면 된다.


해결 방법 : 

구조체 설계를 할때 조건에 맞게 정렬을 하기위해서 입력된 순서를 알고있는 녀석을 추가해서 

멤버변수로 학생이름, 성적, 학생입력순서 이 세개를 갖도록 설계한다.


struct student{

char name[];

int score;

int number; // 입력순서정보!

}


그리고 sort 함수로 비교함수를 넣어서 구조체 멤버변수 기준으로 조건을 정해서 정렬시키면 원하는 답을 구할 수 있다.

여기서 비교함수를 구현 하는게 조금 애매할 수 있는데 멤버변수 두개를 비교해서 < 면 오름차순 , >면 내림차순, == 같으면 입력순서로 기호에 맞게 정렬을 시켜주면 된다.



반응형

'PS > 코드업' 카테고리의 다른 글

1925 (재귀함수) nCr  (0) 2019.05.15
3704번 계단 오르기 2  (0) 2019.03.31
1920번 2진수 변환 (재귀함수)  (0) 2019.03.16
3733번 우박수 길이 - large  (0) 2019.01.27
2606. 소수점 이하 출력  (0) 2018.12.17

주말에 심심해서 구조체에 대한 문법을 짧게 정리 해보려고 한다ㅎㅎ

<위키 백과 참고>

구조체  : C/C++ 프로그래밍 언어에서 구조화 된 데이터를 처리할 때struct를 사용하는데 이를 구조체라고 한다. 라고 말하는데

솔직히 보고 확 와닿지는 않았다. 

구조화된 데이터 처리 ??? 뭐지??


그래서 쉽게 생각해봣는데, 구조체는 데이터를 하나로 묶어서 사용하고 싶을 때 쓰는 일종의 '문법' 이라고 볼수있다.

이때, 묶긴 묶되 '잘' 묶어야되는게 구조체의 핵심이라고 생각한다. 즉, 데이터 묶음 자체가 가지고 있는 데이터들과의 연관관계가 있어야 하는 것이다. 


예를 보면 책이라는 대상이 있다.

책에는 제목이있을것이고, 가격도 있을거고, 저자도 있을것이다. 

따라서,

struct book{

   char title[20];

   char author[10];

   int price;

};


라고 struct 문법을 이용해서 표현할 수 있는 것이고,  묶어진 요소들을 보면 Book과 연관되어 있기 때문에 잘 묶여진 것이라고 볼수있다.


이처럼 struct에 대한 의미를 알고 앞으로 이를 잘 활용해서 써보자ㅎㅎ



아!! 참고로 typedef를 사용해서 구조체 선언을 간편하게 사용하는 방법도 있다.


typedef struct book{

    ...

    ...

}Book;






반응형

'취미' 카테고리의 다른 글

카카오톡 영구정지 해결방법  (1) 2019.05.29
[ES6] var, let, const 란?  (0) 2019.02.23
뷰 공부시작한날  (2) 2019.02.03
[드라마] 프리스트 9화 이후 추측글  (0) 2018.12.23
오늘의 알바-부평문화의거리 서포터즈  (0) 2018.12.14

문제링크 : http://codeup.kr/problem.php?id=3704


해결 방법 :

n 이 5라면은 다음과 같이 총 13가지 경우의 수를 알 수 있다.

5=1+1+1+1+1

5=1+1+1+2

5=1+1+2+1

5=1+2+1+1

5=2+1+1+1

5=1+1+3

5=1+3+1

5=3+1+1

5=1+2+2

5=2+1+2

5=2+2+1

5=2+3

5=3+2

이걸 보고 생각해보면 5를 도달하기 직전 시점에서 보면 한 칸 전에오는 경우의수 가 있을 것이고, 두 칸 전에 오는 경우의 수도 있을거고 그리고 세 칸전에 오는 경우의 수가 있을것이다.


그렇다면 n에 도달하는데 모든 경우의 수는 n-1까지 오는데 경우의수 + n-2 까지 오는데 경우의 수 + n-3 까지 오는데 경우의수로 모든 경우를 다 합해주면은 원하는 답을 구할 수 있다.


이렇게하면 정답은 구할수 있지만, 이렇게 모든 경우를 세주면은 하나의 경우에있어서 계속 3가지의 경우의수가 발생이 되므로 3의 n승이라는 어마어마한 시간이 걸려서 틀리게 된다.


따라서, 중복되는 경우를 세주지 않게하기위해서 memo라는 배열에 n에 도달하는 경우의수를 미리 기록해둔다.

그렇게되면 일단 n이 1씩계속 감소하며 모든경우를 구하게 되고 n-2, n-3으로 부르는 재귀함수는 n-1의 재귀함수에 모두 포함되므로 경우의수가 확 줄어들게 된다. 


이제 코드를 작성해 보면 다음과 같다.




반응형

'PS > 코드업' 카테고리의 다른 글

1925 (재귀함수) nCr  (0) 2019.05.15
3015번 성적표 출력  (1) 2019.04.14
1920번 2진수 변환 (재귀함수)  (0) 2019.03.16
3733번 우박수 길이 - large  (0) 2019.01.27
2606. 소수점 이하 출력  (0) 2018.12.17

요즘 코딩을 잘 안하는 것 같아 자료구조 중 링크드 리스트를 코딩해 보면서 공부 하기로 했다.

그래서 오늘은 간단하게 링크드 리스트 구조를 설계하고 원소를 왼쪽, 오른쪽으로 각각 삽입하는 기능을 구현해보도록 하겠다.

 

구현하기에 앞서 어떤 순서로 시작할지 대략 생각해 보면

 

1. 노드를 일단 만든다.

   노드는 데이터와 next라는 것을 지닌다. 여기서 next 는 다음 노드를 가리키는 포인터변수다.

 

Node

 

2. 링크드 리스트 클래스를 만든다.

    멤버변수 : 링크드 리스트의 시작위치를 알려주는 start, 끝의 위치를 알려주는 end

    함수 :  왼쪽 삽입, 오른쪽 삽입, 리스트 출력

링크드 리스트 구조

 

3. 리스트 왼쪽 부분에 원소 추가 방법

- 추가할 원소 Next 를 다음 원소로 가리키게 하고 현재 링크드리스트의 start새로추가한 원소로 변경해준다.  그럼 왼쪽으로 추가가 된다.

 

4. 리스트 오른쪽 부분에 원소 추가 방법

현재 링크드리스트의 end부분 노드의 next 를 새로 만든 노드로 가리키게 해주면 된다. 그럼 오른쪽으로 원소가 추가가 된다.

 

5.  마지막으로 링크드리스트 원소를 전부 출력 해주는 방법은 C라는 변수를 두고 링크드 리스트의 start 부터 end 까지 순회시키면서 각 요소가 가진 데이터 전부를 출력하도록 한다.

 

 

이 절차대로 구현해주면 소스는 다음과 같다.

 

...더보기

 

#include <iostream>
#include <string>
#include <stdlib.h>
#include <vector>
using namespace std;
struct Node {
	// 각원소  
	const char * data;
	Node * next;
};
class myLinkedList {
public:
	myLinkedList();
	~myLinkedList();
	void addLeft(const char*);
	void addRight(const char*);
	void getList();
private:
	Node * start;
	Node * end;
};
myLinkedList::myLinkedList() :start(NULL), end(NULL) {};
myLinkedList::~myLinkedList() {
}
void myLinkedList::addLeft(const char* data) {
	Node * pTemp = (Node *)malloc(sizeof(Node));
	pTemp->data = data;
	pTemp->next = NULL;
	if (this->start == NULL) {
		this->start = pTemp;
		this->end = pTemp;
	}
	else {
		pTemp->next = this->start;
		this->start = pTemp;
	}
}
void myLinkedList::addRight(const char* data) {
	Node * pTemp = (Node *)malloc(sizeof(Node));

	pTemp->data = data;
	pTemp->next = NULL;
	if (this->start == NULL) {
		this->start = pTemp;
		this->end = pTemp;
	}
	else {
		this->end->next = pTemp;
		this->end = pTemp;
	}
}
void myLinkedList::getList() {
	Node * c;
	Node result[100];
	int index = 1;
	c = this->start;

	while (c != NULL) {
		cout << index << "번째 data : " << c->data << endl;
		index++;
		c = c->next;
	}
}
int main(){
	Node * result = NULL;
	myLinkedList myLinkPipe;
	
	myLinkPipe.addLeft("red");
	myLinkPipe.addLeft("blue");
	myLinkPipe.addLeft("green");
	myLinkPipe.addRight("black");
	myLinkPipe.addRight("purple");
	myLinkPipe.getList();
	
	
	return 0;
}

 

 

반응형

<해결 방법>

이 문제는 정수 n 을 입력받아서 2진수로 출력하는 문제이다.


예를들어 12라는 숫자가 입력되면 


1100 이 출력되면된다.


이 문제를 재귀함수로만 풀어야 하는 조건이 있기때문에 재귀적인 패턴을 먼저 찾아야한다.


우리가 일반적으로 2진수를 변환할때를 생각해보면, 12를 일단 2로 쭊쭉쭉 계속 나눠본후 나머지를 거꾸로 이어서 붙여주면 2진수가 완성된다.


이때, 12를 2로나눠서 생긴 나머지에 2로나눈 몫인 6을 다시 2로 쭉쭉쭉 나눠서 생긴 나머지와 붙여준다면 2진수가 완성된다.

이걸 그림으로 표현해 보면 다음과 같다. (그림 잘 못그림 ㅜ)

이걸보면 재귀적 패턴을 알수있다.  

string getBinaryNum(int n) : n을 입력받아 2진수를 반환하는 함수  라고 정의를 한다면, 


getBinaryNum(n/2) + (n % 2)  <- 이 식의 의미는 현재 n의 2를 나눈 나머지를 n/2로 나눈 숫자의 2진수를 반환하는 것에 갖다 붙인다. 즉, 원래 n에 대한 2진수를 반환할 수 있게된다. 


요약하자면 재귀함수가 n/2에 대한 2진수를 반환해줄거니까 우리는 이거에 현재 n을 2로나눈 나머지만 갖다가 붙이면 되는것이다.



반응형

'PS > 코드업' 카테고리의 다른 글

3015번 성적표 출력  (1) 2019.04.14
3704번 계단 오르기 2  (0) 2019.03.31
3733번 우박수 길이 - large  (0) 2019.01.27
2606. 소수점 이하 출력  (0) 2018.12.17
재귀함수 1부터 n까지 합 구하기  (0) 2018.11.18

var, let, const 란?

- var, let, const 는 변수 선언시 사용되는 키워드


  • Var

var은 변수 데이터의 오염이 많이 발생할 수있는 녀석이다. 

1
2
3
4
var a = 1;
if(a == 2){
var a = "홍길동";
}//원치않은 변수 오염이 발생할수있음.
cs


하지만 함수 스코프내에서 선언했을때는 안전하게쓸수있다.


1
2
3
4
(function () {
    var name = "Minsu";
    console.log(name);
})(); //선언과 동시에 실행하는 함수
cs

즉시실행함수로 var을 지역변수로 사용할때 쓸수는 있지만, 좀 복잡한 표현으로 보인다.

이러한 문제를 해결?하기위해 등장한 것이 let이다.


  • let

let은 var에서 처럼 중복선언을 막아주고, 중괄호 스코프로 완벽히 분리하여 사용할 수 있다.

일반적으로 생각하는 지역변수 처럼 말이다.


한편, var로 선언되기 전 변수를 사용할 때 분명한 에러지만 자바해석기가 알아서 자동적으로 

호스팅이라는 방법으로 선언을 해주면서 오류가 없도록 해준다.

선언없는 변수를 사용할때도 자바해석기가 알아서 처리를 하면서 선언을 임의의 위치에 해준다. 이는 예기치 못한 오류가 발생할 가능성이있다.


하지만 let은 선언전에 사용한다고 하면 오류를 내면서 선언을 먼저하라고 알려준다.


1
2
3
console.log(userName);  // let 키워드로 선언한 변수는 호이스팅이 동작하지 않는다.
let userName = "홍길동";
console.log(userName);
cs


  • const

const는 상수화, 즉 어떤대상이라도 재할당을 금지하기위해서 이 키워드를 쓴다.

객체, 배열, 함수와 같은.. 

const는 선언과동시에 리터럴값을 넣어주어야한다.




var, let 키워드를 정리하자면..


var 키워드로 변수선언은 이제 그만!

let키워드는 변수의 재선언을 막아준다.

let키워드는 호스팅이 되지 않으므로 변수 사용전 반드시 먼저 선언해야한다.

let키워드는 블록영역에 고립된 변수를 선언할 수 있어서 외부로부터 오염을 방지한다.

const도 되도록이면 자주사용하자. 데이터 변경이 많이일어날 일이 적다고한다.

키워드 없는 변수는 가급적 사용하지말자. 예기치 않은 오류가 발생할수있다.

반응형

vue.js란 ? 

- 웹페이지 화면을 개발하기 위한 프런트엔드 프레임워크


vue 특징

- MVVM패턴 : 프런트와 백엔드 역할을 분리해서 개발하는 패턴, 추후 유지보수가 편해진다.

                   예전에는 HTML,CSS, 데이터베이스의 데이터를 가져오는 JAVA 코드가 한파일에 섞이면서 가독성이 현저히 떨어졌다.


- 컴포넌트기반 프레임워크 : 레고쌓듯이 잘조합해서 쓰면 원하는 모형, 화면을 구성할 수있다.


- 빠른 화면 렌더링의 가상 돔 렌더림 방식 : 요즘 대세, 가상돔을 활용하면 화면전체를 다시그리는 일이 없다.


vue 준비물 4가지

- editor : atom 추천 무료 , 'language-vue' 아톰패키지 설치 (vscode 쓰는분들은 vscode용 따로 또 있어요 자동으로 추천해줌) 


- chrome


- 뷰 개발자 도구 : 크롬확장플러그인


- node.js : 추후 vue 프로젝트 구성할때 손쉽게 할 수있음(?)



화면 개발을 하기위한 필수 단위

인스턴스 & 컴포넌트


1. 인스턴스 : 화면 개발하기위해 필수적으로 생성해야하는 기본 단위, hello world를 화면에 뿌려줄수있던건 이녀석이 있었기때문이다. 즉 빠질수 없는 필수조건


2. 컴포넌트 : 레고 블록과 같은것 처럼 하나씩 잘 쌓아서 화면을 구성할수 있음.


레고기본판 안에 레고블록있듯이 인스턴스안에 컴포넌트있다.  


뷰 컴포넌트 통신

 컴포넌트 끼리는 통신을 어떻게 할까?


1. 상하위 컴포넌트 관계의 통신

- 단일 방향으로 위에서 아래로 데이터를 전달하는 기본적인 구조.

- 상위에서 하위로는 props라는 특별한 속성으로 전달한다.


ex) <child-component v-bind : propsdata = "상위 컴포넌트의 속성"> 


2.  하위에서 상위 컴포넌트로는 이벤트로 전달하기

하위 컴포넌트에 이벤트가 발생하면 이 이벤트 명으로 상위 컴포넌트의 메서드를 실행시키는 방식

ex) this.$emit('이벤트명')

     v-on : 이벤트명 = "상위 컴포넌트의 메서드명"


3. 같은 레벨간의 컴포넌트 통신

- 이벤트 버스

1.이벤트 버스를 위한 추가 인스턴스를 생성

2.그리고 이 이벤트 버스 참조로 이벤트와 데이터를 보낸다.

3.받는 쪽은 $on으로 이벤트와 데이터를 받는다.


반응형

문제링크)

http://codeup.kr/problem.php?id=3733


해결방법)


어떤 임의의 자연수 n 을 입력받고 홀수 or 짝수 일때의 각각의 규칙에 따라 재귀함수를 호출한다.

이때 재귀함수 호출 횟수가 몇번인지가 문제에서 말한 우박수의 길이가 되고 이것을 구하면 된다.


규칙은 다음과 같다.

1. 어떤 자연수 n이 입력되면,

2. n이 홀수이면 3n+1을 하고,

3. n이 짝수이면 n/2를 한다.

4. 이 n이 1이 될때까지 2~3과정을 반복한다.

예를 들어 5는 5 → 16 → 8 → 4 → 2 → 1 이 된다.

여기서 생각해야할 부분이 있는데, 입력이 자연수 a, b 구간으로  1<= a <= b <= 10,000,000 의 아주 큰 범위를 갖는다.

그래서 이 문제가 large 버전으로 이름이 붙여진 것 같다.

이 큰 값의 범위 입력을 풀기 위해서 대표적인 방법으로 메모이제이션을 써서 시간복잡도를 줄여야 겠다는 생각을 했다.

그리고 코딩하면서 알게 된것이 배열을 천만으로 선언할 수 있다는 것을 알 수 있었다. 너무 비효율적이라 생각되는데 무튼 문제만 푼다면야...하고 일단 넘어가자.


메모이제이션을 할때 천만으로만 하기 때문에 n이 홀수여서 천만의 값을 넘어간다면 이는 따로 조건을 추가해서 메모이제이션을 안하고 다음 재귀함수를 그냥 호출 하는 방식으로 구해보았다.



반응형

'PS > 코드업' 카테고리의 다른 글

3704번 계단 오르기 2  (0) 2019.03.31
1920번 2진수 변환 (재귀함수)  (0) 2019.03.16
2606. 소수점 이하 출력  (0) 2018.12.17
재귀함수 1부터 n까지 합 구하기  (0) 2018.11.18
코드업-캔디팡 문제  (0) 2018.09.23

이전에 클래스 패스는 자바를 실행할때 클래스 파일의 경로를 미리 지정해서 위치가 달라도 자바가 그 경로를 찾아서 실행할 수 있었다.


패키지 개념은 컴파일을 할때, 이름이 중복되는 java파일이 있으면 충돌오류가 발생해서 이를 방지하고자 나온 개념이다.


즉 폴더를 미리 나눠놔서 중복이 발생되지 않도록 구분해둔다.


보통 도메인 이름으로 패키지명을 쓰는데, 이는 도메인이 유일 무이한 고유한 속성이기 때문에 쓰는 것이다.

ex)com.opentutorial.javatutorial.example


이렇게 소스 맨위에 package 선언을 하게되면 실제 폴더가 생성되고 그안에 해당 소스파일이 생성된다.


우리가 흔히 import java.util.Scanner 요롷게 해서 입력을 쓰는데, java.util패키지 폴더 밑에 Scanner 클래스를 사용하겠다. 라는 의미이다.

이 import 키워드 사용으로 다른 패키지에 있는 클래스를 사용할 수 있다. 그러면 하나의 소스파일안에 여러개의 클래스가 있는거겟지 ㅎㅎ




반응형

'java' 카테고리의 다른 글

자바 클래스패스~  (0) 2018.12.31
자바 시작~!(초기셋팅 절차)  (0) 2018.12.31

클래스 패스 = 자바 클래스 파일의 위치 경로를 지정해주는 기능


사용법 : java -classpath ".;lib" ClassDemo 

여기서 보면 ".;lib"의 의미는 현재 그리고 현재안의 lib폴더의 경로를 지정한 것이다.

그래서 class 파일이 떨어져 있어도 내가 수동으로 classpath 옵션으로 지정해주면 실행이 가능하다.


일일히 이 -classpath 옵션을 붙이기 귀찮아서 우리가 맨처음에 배운 환경변수에 class 파일이 전부 있는 폴더 경로를 미리 지정해준다.

CLASSPATH 의 임의 변수에 C:\파일위치; 추가 파일위치 ; ; ; ; ; ; 등등등 을해서 사용이 가능하다.

이것도 귀찮아서 배치파일 이나 스크립트 파일에 경로설정에 관한 것을 미리 만들어 놓기도 한다. 이건 안써봐서 모르겟다 아직 

반응형

'java' 카테고리의 다른 글

자바 패키지~  (0) 2018.12.31
자바 시작~!(초기셋팅 절차)  (0) 2018.12.31

+ Recent posts