드디어 마지막 회차.
남은 문제는 세문제
기초트레이닝 문제가 끝나면 어떤 도전과제가 생길지 기대된다
1. 그림 확대
10보다 작은 양의 정수 k만큼 2차원배열을 늘리는 문제
var newPicture: [String] = []
for i in 0 ..< picture.count {
for _ in 0 ..< k {
newPicture.append(picture[i])
}
}
for line in 0 ..< newPicture.count {
let arr = Array(newPicture[line])
var newLine: [String.Element] = []
for i in 0 ..< arr.count {
for _ in 0 ..< k {
newLine.append(arr[i])
}
}
newPicture[line] = newLine.map({ String($0) }).joined()
}
return newPicture
세로로 늘리고 가로로늘리고를 크게 두가지로 나눠서 처리했는데 이걸 한번에 묶어서 처리를 하는게 인기가 좋나보다.... 다른답들 다 그렇게 처리가 되어있다
2. 정수를 나선형으로 배치하기
이중배열을 시계방향으로 돌아가면서 방문하는 문제이다.
class Position {
var x: Int
var y: Int
init(x: Int, y: Int) {
self.x = x
self.y = y
}
init(_ copy: Position) {
self.x = copy.x
self.y = copy.y
}
}
enum Direction {
case right, left, down, up
}
func solution(_ n:Int) -> [[Int]] {
var map: [[Int]] = Array(repeating: Array(repeating: 0, count: n), count: n)
// 캐릭터 현재 x,y 좌표
let position: Position = .init(x: 0, y: 0)
var checkNumber: Int = 1
func isMoveRight() -> Bool {
let startX = position.x
let startY = position.y
let nextX = startX + 1
// 맵 범위밖
if nextX >= n {
return false
}
// 이미 탐사한 지역
if map[startY][nextX] > 0 {
return false
}
return true
}
func isMoveLeft() -> Bool {
let startX = position.x
let startY = position.y
let nextX = startX - 1
if nextX < 0 {
return false
}
if map[startY][nextX] > 0 {
return false
}
return true
}
func isMoveDown() -> Bool {
let startX = position.x
let startY = position.y
let nextY = startY + 1
if nextY >= n {
return false
}
if map[nextY][startX] > 0 {
return false
}
return true
}
func isMoveUp() -> Bool {
let startX = position.x
let startY = position.y
let nextY = startY - 1
if nextY < 0 {
return false
}
if map[nextY][startX] > 0 {
return false
}
return true
}
func checkMap(position: Position) -> Bool {
if map[position.y][position.x] > 0 {
print("ERROR!!!!!")
return false
}
map[position.y][position.x] = checkNumber
checkNumber += 1
return true
}
// 시작 위치
_ = checkMap(position: position)
// 순서 right down left up
var direction: Direction = .right
while true {
let beforPosition: Position = .init(position)
// 이동 가능 체크
if !(isMoveRight() || isMoveLeft() || isMoveUp() || isMoveDown()) {
break
}
// 이동
switch direction {
case .right:
if isMoveRight() {
position.x += 1
} else {
direction = .down
}
case .down:
if isMoveDown() {
position.y += 1
} else {
direction = .left
}
case .left:
if isMoveLeft() {
position.x -= 1
} else {
direction = .up
}
case .up:
if isMoveUp() {
position.y -= 1
} else {
direction = .right
}
}
if beforPosition.x == position.x && beforPosition.y == position.y {
continue
}
// 맵 수정
_ = checkMap(position: position)
}
return map
}
이동하는걸 각 기능으로 나눠서 방향지정까지 해놨는데
솔직히 너무 과했다 쓸모없다
이렇게 해두면 그야 탐색 순서가 달라져도 써먹을 부분이 많겠지만 너무 오버했다
게임을 구현한다고 생각하니 뭔가 필받아서 머리가 나빠졌나보다
중간에 이동가능체크 라고 넣어둔부분은
추가로 루프 탈출지점을 깜빡해서 나중에 넣은 부분이라 저런다만 저런건 미리 계산해두고 사용하는게 좋을듯하다
아니 아예 인덱스부분만 골라서 숫자 올리는게 더 코드가 짧을지도 모르겠다
3. 정사각형으로 만들기
이중배열을 n형태의 배열로 만드는 문제, 줄수든 줄내의 요소수든 가장 큰값을 기준으로 0을 채워야한다
var maxECount: Int = 0
for e in arr {
maxECount = max(maxECount, e.count)
}
let targetCount: Int = max(arr.count, maxECount)
var resultArr: [[Int]] = Array(repeating: Array(repeating: 0, count: targetCount), count: targetCount)
for line in 0 ..< resultArr.count {
if line >= arr.count {
continue
}
for i in 0 ..< resultArr[line].count {
if i >= arr[line].count {
continue
}
resultArr[line][i] = arr[line][i]
}
}
return resultArr
이번에도 그냥 문제 내용대로
가장 큰수를 구하고 해당 큰수대로 정사각형 배열을 만들어줬다
문제는 기존 배열을 늘리는거지만 새롭게 만들어준거에 복사해주는것으로 대체.
그렇게 기초 트레이닝 문제가 끝!
마지막일자꺼는 왜 5문제가 아닐까....
24일날 시작하여 대부분은 25일까지 완료를 짖고 흥미가 떨어져 도전과제로 풀리는것만 풀다보니
일자로만 11일이 걸렸다.
하루에 day가 두개씩 열리는거보면 사이트에서 노린 기초 트레이닝 일자는 대략 14일 정도 2주가 아니였을까?
"사이트의 노림수대로 일자가 끝난거야 " 라며 자신을 위로하며 기초트레이닝 문제를 마무리한다.
'iOS > 프로그래머스 - 코딩테스트 문제' 카테고리의 다른 글
11. day 21, 22. 함수(메서드), 조건문 활용 (0) | 2024.07.04 |
---|---|
10. day19 문자열, 리스트(배열) (0) | 2024.07.02 |
9. day15,16 리스트(배열), 문자열 (0) | 2024.07.01 |
8. day12 , day13 리스트 (0) | 2024.06.30 |
7. day10 문자열, day11 리스트(배열) (0) | 2024.06.28 |