1. 코드카타
오늘 푼 알고리즘 문제는 '바탕화면 정리' 이다.
바탕화면 정리 |
![]() |
![]() |
이번 문제는 너무 길어서 잘랐는데도 저 정도다.
게다가 딱 봐도 문제를 이해하는 데에 오래걸리게 생겼다.
어찌됐든 일단 풀어보자.
말을 복잡하게 해놔서 그렇지 이 문제의 답을 구하는 방법은 의외로 간단하다.
#이 표시되어 있는 지점의 왼쪽 끝점과 오른쪽 끝점의 좌표를 구하면 된다. 그렇게 하면 드래그 한 번으로 모든 파일을 전부 지정할 수 있다. 단, 오른쪽 끝점은 각 좌표에 1씩 더해야 한다.
이게 뭔 소리냐?
위의 그림에서도 알 수 있듯이 점은 왼쪽 상단을 기준으로 하기 때문에, 우측 하단은 저기서 1씩 더해야 함을 알 수 있다.
예를 들어 wallpaper[0][1]은 1행 2열에 있는 파일을 말하며, 파일 왼쪽 상단의 좌표는 S점의 좌표인 (0, 1)이다. 그러므로 우측 하단의 좌표는 여기서 각각 1을 더한 (1, 2)가 되는 것이다.
그렇다면 이걸 이제 어떻게 코드로 구현할까?
class Solution {
fun solution(wallpaper: Array<String>): IntArray {
var answer: IntArray = intArrayOf()
var x = intArrayOf()
var y = intArrayOf()
for (i in wallpaper.indices){
for (j in 0 until wallpaper[i].length){
if (wallpaper[i][j] == '#'){
x += i
y += j
}
}
}
answer += x.minOf{it}
answer += y.minOf{it}
answer += x.maxOf{it} + 1
answer += y.maxOf{it} + 1
return answer
}
}
우선 파일을 드래그하기 위해 필요한 좌표를 저장할 변수들을 만든다.
그리고는 반복문을 통하여 #가 있는 좌표를 찍는다.
마지막으로 각각 x, y에 저장된 값 중에서 최소값과 최대값을 찾아서 answer에 저장한다. 이 때, 순서는 최소값, 최대값 순으로 적으며, 최대값은 1을 더한다.
시간이 지남에 따라서 문제 자체의 난이도도 점차 올라가는 것도 있지만, 문제의 지문이 급격하게 길어지고 있다.
어디까지나 이 문제를 푸는 이유 중에 Kotlin 문법에 익숙해지는 것도 있지만, 후에 있을 코딩 테스트에서 제한시간 내에 풀어내는 능력 또한 기르기 위함이니 이 다음부터 주어진 정보들 가운데 불필요한 정보들을 최대한 빨리 소거하고, 꼭 필요한 정보들을 토대로 어떻게 풀어나가는 것이 좋은지 판단하는 것 또한 연습해야겠다.
2. 클래스
클래스.
이걸 처음 접했을 때도 뭔가 애매모호해서 어려웠는데 막상 이걸 실전에 옮기려니까 더더욱 난항이 생겼다.
무엇보다 어떨 때 클래스를 만드는 게 좋으며, 클래스를 만든 다음에 함수(메소드) 안의 변수는 뭘 넣는 게 좋은지, 어떤 식으로 객체를 생성하는지 하다보니 헷갈리는 경우가 많았다.
그리하여 이번에 클래스에 대해서 자세하게 정리해보기로 했다.
마침 이번 주 과제에서도 클래스를 사용하는 항목이 있었기 때문에 정리해서 나쁠 것이 없지.
(추후에 다시 보강하겠음)
클래스의 정의
클래스는 데이터(속성)와 그 데이터를 조작하는 데 필요한 함수(메소드)를 하나의 단위로 묶은 것이다.
클래스의 기본구조
- 속성(property) : 클래스에 포함된 데이터 요소
- 메소드(method) : 클래스가 수행할 수 있는 동작 또는 기능
- 생성자(constructor) : 클래스의 객체(인스턴스)를 생성할 때 초기화하는 메소드
- 파라미터(Parameter) :
- 매개변수(Argument) :
클래스와 함수
클래스 : 데이터와 그 데이터를 조작하는 데 필요한 메소드를 묶은 것
함수 : 특정 작업을 수행하는 코드 블록
○ 클래스와 함수의 차이점
- 구성화 밎 캡슐화
- 재사용성
- 유지보수
- 추상화
클래스 상속 (Class Inheritance)
하나의 클래스(자식 클래스)가 다른 클래스(부모 클래스)의 속성과 메소드를 물려받는 것.
이를 통해 재사용성을 높이고, 중복을 줄이며, 계층적 구조를 만들어 더욱 체계적으로 관리할 수 있음.
○ Kotlin은 기본적으로 상속할 수 없는 상태.
따라서 상속을 허용하기 위해서 open을 사용함.
ex)
open class Car {
// 부모 클래스 선언
}
○ Kotlin은 다중 상속 또한 허용하지 않는다. 부모 클래스 하나에 여러가지 자식 클래스가 상속받을 수는 있지만 하나의 자식 클래스가 여러개의 부모 클래스를 상속받지는 못 한다. 이 때문에 인터페이스(Interface)라는 기능도 있지만, 이건 아직은 상속도 완벽하게 이해하지 못해서 추후에 다시 알아보자.
추상화 (Abstraction)
○ 상속과 추상화의 차이점
- 상속 : 이미 존재하는 클래스의 기능을 확장하거나 수정하는 것에 초점을 맞춤
- 추상화 : 복잡한 시스템을 간단하게 표현하는 것에 초점을 맞춤
'[TIL][내일배움캠프]' 카테고리의 다른 글
[내일배움캠프][TIL] 23.12.08 (금) - 예상 대진표&최대값과 최소값, 키오스크 프로그램 Lv. 3 (1) | 2023.12.08 |
---|---|
[내일배움캠프][TIL] 23.12.07 (목) - 피보나치 수, 키오스크 프로그램 (Lv. 1 / Lv. 2) (2) | 2023.12.07 |
[내일배움캠프][TIL] 23.12.05 (화) - 푸드 파이트 대회, 객체지향 프로그래밍 심화 (2) | 2023.12.05 |
[내일배움캠프][TIL] 23.12.04 (월) - 로또의 최고순위와 최저순위, 조건문·반복문 예제 (1) | 2023.12.04 |
[내일배움캠프][TIL] 23.12.01 (금) - 명예의 전당, 계산기 만들기 Lv3 완성본 (0) | 2023.12.01 |