전체 글401 [백준/BOJ] 1001번: A-B https://www.acmicpc.net/problem/1001 1001번: A-B 두 정수 A와 B를 입력받은 다음, A-B를 출력하는 프로그램을 작성하시오. www.acmicpc.net 문제 해설 1000번: A+B와 마찬가지로 두 정수를 입력받고 차를 구하면 된다. 입력받는 방법은 이전과 동일하다. 소스코드 import java.util.* fun main() { val sc: Scanner = Scanner(System.`in`) println(sc.nextInt() - sc.nextInt()) } fun main() { val input = readLine()!!.split(" ") println(input[0].toInt() - input[1].toInt()) } PS(Problem Solving)/BOJ 2021. 11. 1. 코틀린(Kotlin) - 연산자 오버로딩과 기타 관례 어떤 클래스 안에 plus라는 이름의 특별한 메소드를 정의한다면 그 클래스의 인스턴스에 대해 + 연산자를 사용할 수 있다. 이런 식으로 어떤 언어 기능과 미리 정해진 이름의 함수를 연결해주는 기법을 코틀린에선 관례라고 한다. 코틀린에서는 언어 기능을 타입에 의존하는 자바와 달리 관례에 의존한다. 이는 기존 자바 클래스를 코틀린 언어에 적용하기 위해서이다. 기존 자바 클래스가 구현하는 인터페이스는 이미 고정돼 있고, 코틀린에서 자바 클래스가 새로운 인터페이스를 구현하게 만들 수 없다. 하지만 확장 함수를 사용하면 기존 클래스에 새로운 메소드를 추가할 수 있다. 따라서 기존 자바 코드를 바꾸지 않아도 새로운 기능을 쉽게 부여할 수 있게 된다. 산술 연산자 오버로딩 산술 연산자는 코틀린에서 관례를 사용하는 가.. Programming/Kotlin 2021. 10. 31. C언어 - 매크로와 선행처리기(preprocessor) 선행처리 선행처리는 컴파일 이전의 처리를 의미한다. 선행처리는 선행처리기에 의해, 컴파일은 컴파일러에 의해, 링크는 링커에 의해 진행이 된다. 컴파일 과정을 거치면 바이너리 데이터로 이뤄진 오브젝트 파일이 생성된다. 하지만 컴파일 이전에 진행되는 선행처리 과정을 거쳐 생성되는 파일은 그냥 소스파일이다. 선행처리기가 하는 일은 매우 단순한데, 삽입해 놓은 선행처리 명령문대로 소스코드의 일부를 수정한다. 여기서 수정이란, 단순 치환의 형태를 띠는 경우가 대부분이다. 선행처리 명령문은 # 키워드로 시작하며, 컴파일러가 아닌 선행처리기에 의해 처리되기 때문에 끝에 세미클론(;)을 붙일 필요가 없다. #define PI 3.14 위와 같은 명령문이 삽입돼 있는 소스파일을 선행처리의 과정에서 변환되는 것을 보자. .. Programming/C 2021. 10. 27. 코틀린(Kotlin) - 컬렉션과 배열 널 가능성과 컬렉션 컬렉션 안에 널 값을 넣을 수 있는지의 여부는 어떤 변수의 값이 널이 될 수 있는지 여부와 같이 중요하다. 컬렉션 타입 인자 뒤에 ?를 붙이면 널이 될 수 있는 값으로 이루어진 컬렉션을 만들 수 있다. fun readNumbers(reader: BufferedReader) : List { val result = ArrayList() for (line in reader.lineSequence()) { try { val number = line.toInt() result.add(number) } catch(e: NumberFormatException) { result.add(null) } } return result } 코드를 보면 2행에서 List를 볼 수 있다. List는 Int? 타.. Programming/Kotlin 2021. 10. 24. 코틀린(Kotlin) - 코틀린의 원시 타입 코틀린에서는 자바와 달리 원시 타입과 래퍼 타입을 구분하지 않는다. * 원시 타입 : 원시 타입의 변수에는 값이 직접 들어간다. * 참조 타입(reference type): 참조 타입의 변수에는 메모리 상의 객체 위치가 들어간다. 원시 타입 원시 타입은 참조 타입보다 값을 더 효율적으로 저장하고 이곳저곳으로 전달할 수 있다. 하지만 이 값에 대해 메소드를 호출하거나 컬렉션에 원시 타입 값을 담을 수는 없다. 자바에서는 참조 타입이 필요한 경우 특별한 래퍼 타입으로 원시 타입 값을 감싸 사용한다. 이 때문에 정수의 컬렉션을 정의하려면 Collection가 아닌 Collection를 사용해야 한다. 코틀린은 원시 타입과 참조 타입을 구분하지 않으므로 항상 같은 타입을 사용한다. val i: Int = 1 v.. Programming/Kotlin 2021. 10. 21. 코틀린(Kotlin) - 널(NULL) 가능성 자바에 비해 코틀린의 타입 시스템은 코드의 가독성을 향상하는 데 도움이 되는 몇 가지 특성을 제공한다. 대표적으로는 널이 될 수 있는 타입(nullalbe type), 읽기 전용 컬렉션, 배열지원이 있다. 널 가능성 널 가능성은 NPE오류(NullPointerException 오류)를 피할 수 있게 도와주는 코틀린 타입 시스템의 특성이다. 널이 될 수 있는지의 여부를 타입 시스템에 추가함으로써 컴파일러가 컴파일 시 오류를 미리 감지해서 실행 시점에 발생할 수 있는 예외 가능성을 줄일 수 있다. 널이 될 수 있는 타입 코틀린과 자바의 가장 중요한 차이는 코틀린 타입 시스템이 널이 될 수 있는 타입을 명시적으로 지원한다는 것이다. 자바에서 다음과 같은 코드가 있다 하자. int strLen(String s).. Programming/Kotlin 2021. 10. 20. C언어 - 메모리 관리와 메모리의 동적 할당 메모리의 구성 프로그램을 실행했을 때 운영체제에 의해 마련되는 메모리의 구조는 4개의 영역으로 나뉜다. 메모리 공간을 나눠놓은 이유는 유사한 성향의 데이터를 묶어 저장하면, 관리가 용이해지고 메모리의 접근 속도가 향상되기 때문이다. 메모리 영역별로 저장되는 데이터 유형 각 영역 별 특성에 대해 알아보면 다음과 같다. 1. 코드 영역 코드 영역에는 이름 그대로 실행할 프로그램의 코드가 저장되는 메모리 공간이다. CPU는 코드 영역에 저장된 명령문을 하나씩 가져가 실행을 한다. 2. 데이터 영역 데이터 영역에는 전역변수와 static으로 선언되는 static 변수가 할당된다. 이는 프로그램의 시작과 동시에 메모리 공간에 할당되어 프로그램이 종료될 때까지 남아있다는 특징이 있다. 3. 스택 영역 스택 영역에는.. Programming/C 2021. 10. 18. 코틀린(Kotlin) - 컬렉션 API 함수형 프로그래밍 스타일을 사용하면 컬렉션을 다룰 때 편리하다. 대부분의 작업에 라이브러리 함수를 활용할 수 있어 코드를 아주 간결하게 만들 수 있다. 컬렉션을 다루는 코틀린 표준 라이브러리를 알아보도록 하자. filter와 map 이 두 함수는 컬렉션을 활용할 때 기반이 되는 함수다. 대부분의 컬렉션 연산을 이 두 함수를 통해 표현할 수 있다. filter 함수는 컬렉션을 이터레이션 하면서 주어진 람다에 각 원소를 넘겨 람다가 true를 반환하는 원소만 모은다. val list = istOf(1, 2, 3, 4) println(list.filter{ it % 2 == 0 }) [2, 4] 결과는 입력 컬렉션의 원소 중 주어진 술어를 만족하는 원소만으로 이뤄진 새로운 컬렉션이다. filter 함수는 컬렉.. Programming/Kotlin 2021. 10. 17. 코틀린(Kotlin) - 람다식과 멤버 참조 람다식 또는 람다는 기본적으로 다른 함수에 넘길 수 있는 작은 코드 조각을 뜻한다. 이를 사용하면 쉽게 공통 코드 구조를 라이브러리 함수로 뽑아낼 수 있다. 코드 블록을 함수 인자로 넘기기 "이벤트가 발생하면 이 리스너를 실행하자" 또는 데이터 구조의 모든 원소에 이 연산을 적용하자"와 같은 생각을 코드로 표현하기 위해 일련의 동작을 변수에 저장하거나 다른 함수에 넘겨야 하는 경우가 종종 있다. button.setOnClickListener(new OnClickListener() { @Override public void onClick(View view) { /* 클릭 시 수행할 동작 */ } }); 이처럼 자바에서는 무명 내부 클래스를 선언하여 코드가 번잡스러워진다. 이와 비슷한 작업을 많이 수행해야 .. Programming/Kotlin 2021. 10. 16. C언어 - 파일 입출력 프로그램상에서 파일에 저장되어 있는 데이터를 참고할 때 제일 먼저 해야 하는 것은 프로그램과 참조할 데이터가 작성돼 있는 파일 사이에 다리를 놓는 것이다. 이처럼 데이터 이동의 경로가 되는 다리를 "스트림"이라 한다. 스트림에 대해 잘 모르겠다면 이 글을 봐보는 것도 좋을 것이다. https://jjunsu.tistory.com/26 C언어 - 스트림(Stream) 스트림(Stream) 스트림은 데이터의 이동 수단이다. 프로그램상에서 모니터로 문자열을 출력할 수 있는 이유가 무엇일까? 이는 문자열을 출력하는 printf 함수가 있기 때문이다. 그럼 printf 함수를 호 jjunsu.tistory.com 파일은 운영체제에 의해 구조가 결정, 관리되는 대상이기 때문에 파일 뿐만 아니라 스트림의 형성도 온전.. Programming/C 2021. 10. 16. C언어 - 구조체와 사용자 정의 자료형(2) typedef 선언 typedef 선언은 기존에 존재하는 자료형의 이름에 새 이름을 부여하는 것이다. 예를 들어보자. typedef int INT; 이는 int라는 자료형의 이름에 INT라는 이름을 추가하는 것이 된다. 따라서 INT num; 이와 같이 해도 int num;과 같은 선언이 되는 것이다. 포인터 변수 또한 선언할 수 있다. INT *ptr; typedef 선언에 있어 새로운 이름의 부여는 가장 마지막에 등장하는 단어를 중심으로 이뤄진다. typedef name1 name2 mane3; 이러한 선언이 있다면 name3가 "name1 name2"에 부여된 새로운 이름이 되는 것이다. 예를 들어보자. typedef unsigned char UCHAR; 이는 unsigned char의 새로 부여된.. Programming/C 2021. 10. 13. C언어 - 구조체와 사용자 정의 자료형(1) 구조체 구조체란? 하나 이상의 변수(포인터 변수와 배열 포함)를 묶어 새로운 자료형을 정의하는 도구이다. 프로그램 상에서 어떠한 사람의 정보를 저장하고 관리해야 한다 해보자. char name[20]; char phoneNum[20]; int age; 이 세 변수는 서로 독립된 정보를 표현하는 것이 아닌, 한 사람의 정보를 표현한다. 따라서 사람이 바뀌면 그에 따른 정보를 갱신해야 하기 때문에 세 변수에 저장된 값이 동시에 갱신되어야 한다. 세 변수는 함께 있을 때 의미를 지니며, 이 중 하나가 어떠한 이유로 인해 소멸된다면 나머지 하나도 의미가 없어진다. 따라서 이 세 변수를 묶어버리는 방법이 좋은데, 이를 구조체로 정의함으로써 하나로 묶을 수 있다. 구조체는 struct 키워드를 사용하면 된다. st.. Programming/C 2021. 10. 12. C언어 - 표준 입출력과 버퍼 앞에서 공부했던 printf, scanf, putc, getc 등의 입출력 함수들을 "표준 입출력"이라 한다. ANSI C의 표준에서 정의된 함수이기 때문이다. 입출력 함수들에 대해 잘 모르겠다면 https://jjunsu.tistory.com/4?category=971045 C언어 - 헤더파일, printf, scanf 헤더파일 선언의 필요성 c언어를 사용하며 프로그래밍을 한다면 prinf, scanf라는 함수를 사용하게 된다. 이러한 표준 함수를 호출하기 위해서는 함수와 관련된 헤더파일을 선언해야 한다. #include jjunsu.tistory.com https://jjunsu.tistory.com/27?category=971045 C언어 - 문자와 문자열 함수 getchar, putchar get.. Programming/C 2021. 10. 11. 코틀린(Kotlin) - 오브젝트(object): 객체 선언, 동반 객체, 객체 식 객체 선언: 싱글톤 객체 선언은 클래스 선언과, 클래스에 속한 단일 인스턴스의 생성, 변수에 인스턴스 저장을 동시에 처리해주기 때문에 싱글톤에 사용하기 적합하다. object Payroll { val allEmployees = arraylistOf() fun calculateSalary() { for(person in allEmployees) { . . . . } } } payroll.allEmployees.add(Person(. . . .)) payroll.calculateSalary() 싱글톤은 객체 선언 키워드인 object로 시작하면 된다. 객체 선언 객체 선언의 특징은 다음과 같다. 프로퍼티, 메서드, 초기화 블록이 가능하다. 생성자는 객체 선언에 사용할 수 없다.(주 생성자, 부 생성자 모두 .. Programming/Kotlin 2021. 10. 10. 코틀린(Kotlin) - 데이터 클래스와 위임 데이터 클래스(data class) 데이터 클래스는 data라는 수식어를 사용하며 다음과 같은 조건이 충적되어야 한다. 주요 생성자에는 적어도 하나의 파라미터가 필요하다. 주요 생성자의 파라미터는 val, var로 지정해야 한다. 데이터 클래스는 abstract, open, sealed, inner와 같은 수식어를 사용할 수 없다. data Class Client(val name: String, val nation: String) 다음 메서드는 컴파일러가 자동으로 생성한다. 인스턴스 간 비교를 위한 equals 해시 기반 컨테이너에서 키로 사용할 수 있는 hashCode 각 필드를 선언 순서대로 표시하는 문자열 표현을 만들어주는 toString 객체 복사를 편하게 해주는 copy 프로퍼티 선언 순서에 따.. Programming/Kotlin 2021. 10. 10. C언어 - 문자와 문자열 함수 getchar, putchar getchar와 putchar는 문자 입출력 함수이다. getchar는 문자 입력 함수이며, stdin으로 표현되는 표준 입력 스트림으로부터 하나의 문자를 입력받아 반환한다. 함수 호출을 성공할 시 쓰인 문자정보가 반환되며, 실패 시 EOF가 반환된다. putchar는 문자 출력 함수이며, 인자로 전달된 문자 정보를 stdout으로 표현되는 표준 출력 스트림으로 전송하는 함수이다. 파일의 끝에 도달하거나 함수 호출 실패 시 EOF를 반환한다. 다음의 예제를 보자. #include int main() { while (1) { int ch = getchar(); if (ch == EOF) break; putchar(ch); } return 0; } 코드를 보면 getchar는 .. Programming/C 2021. 10. 9. C언어 - 스트림(Stream) 스트림(Stream) 스트림은 데이터의 이동 수단이다. 프로그램상에서 모니터로 문자열을 출력할 수 있는 이유가 무엇일까? 이는 문자열을 출력하는 printf 함수가 있기 때문이다. 그럼 printf 함수를 호출할 때 어떠한 경로 및 과정을 거쳐서 출력이 되는가? printf 함수를 입력하기 위한 입력장치인 키보드와, 출력을 위한 장치인 모니터 이 둘은 서로 떨어져 있는 개체이다. 이러한 개체들을 대상으로 데이터를 입출력하기 위해서는 이들을 연결시켜 주는 장치가 필요하다. 이러한 다리 역할을 하는 매개체를 "스트림"이라 한다. 스트림의 생성과 소멸 입출력은 보통 두 가지로 나뉘는데 콘솔 입출력과 파일 입출력이 있다. 둘의 차이점은 파일과의 연결을 위한 스트림의 생성은 우리가 직접 해야 하지만, 콘솔과의 연.. Programming/C 2021. 10. 6. C언어 - 함수 포인터와 void 포인터 메모리 공간에 저장되는 것은 변수뿐만이 아니라, 프로그램 실행의 흐름을 구성하는 함수들도 바이너리(binary) 형태로 저장된다. 그리고 메모리 공간에 저장된 함수의 주소 값을 저장하는 포인터 변수를 "함수 포인터 변수"라고 한다. 함수 포인터 함수 포인터의 포인터 형(타입) 프로그래밍을 할 때 정의되는 모든 함수는 프로그램 실행 시 메인 메모리에 저장되어 실행된다. 배열의 이름이 배열의 시작 주소 값을 의미하듯이, 함수의 이름은 함수가 저장된 메모리 공간의 주소 값을 의미한다. 함수 포인터 변수를 선언할 때는 먼저 함수 포인터의 포인터 형을 결정해야 한다. 변수에서도 그랬듯이 형을 결정하지 못하면 적절한 함수 포인터 변수의 선언이 불가능하다. int SimpleFunc(int num) { . . . ... Programming/C 2021. 10. 5. C언어 - 다차원 배열과 포인터의 관계 1차원 배열이름의 포인터 형과 2차원 배열이름의 포인터 형 int arr[10]; 여기서 arr은 int형 포인터이다. 이를 함수의 인자로 전달하기 위해서는 다음과 같다. #include void SimpleFunc(int *ptr) { . . . . } int main() { . . . . SimpleFunc(arr); . . . . } 이제 2차원 배열을 봐보자. int arr2[2][3]; 1차원 배열에서 arr은 int형 포인터였으니 2차원 배열인 arr2는 int형 더블 포인터일까? 이 질문의 답은 "아니다"이다. int형 더블 포인터이기 위해서는 다음과 같아야 한다. int *ptr[2]; 2차원 배열 이름이 더블 포인터를 가리킨다고 오해하면 안 되는 것이다. 그럼 2차원 배열 이름의 포인터 .. Programming/C 2021. 10. 4. 코틀린(Kotlin) - 클래스 계층(인터페이스, open, final, abstract, 중첩 클래스, sealed 클래스) 인터페이스 코틀린의 인터페이스는 자바에서의 인터페이스와 유사하다. interface로 시작을 하며, 메서드를 구현할 때 override 변경자를 사용한다.(자바의 @override를 대체) interface Clickable { fun click() } class Button: Clickable { override fun click() = println("I was clicked!") } 인터페이스와 클래스 확장은 클래스: 인터페이스 클래스명 형식으로 구현한다. 여러 인터페이스를 구현 가능하지만, 클래스는 한 개만 상속 가능하다. 또한 override된 함수 이름과 다른 함수의 이름이 중복되서는 안 된다. 디폴트 구현 자바에서는 디폴트를 구현할 때 앞에 default 키워드를 붙여야 하지만, 코틀린에서는.. Programming/Kotlin 2021. 10. 3. 이전 1 ··· 16 17 18 19 20 21 다음 728x90