Skip to content

Commit edb0f0f

Browse files
committed
[Gold I] Title: 낚시왕, Time: 368 ms, Memory: 80608 KB -BaekjoonHub
1 parent e45e1a5 commit edb0f0f

2 files changed

Lines changed: 169 additions & 0 deletions

File tree

Lines changed: 52 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,52 @@
1+
# [Gold I] 낚시왕 - 17143
2+
3+
[문제 링크](https://www.acmicpc.net/problem/17143)
4+
5+
### 성능 요약
6+
7+
메모리: 80608 KB, 시간: 368 ms
8+
9+
### 분류
10+
11+
구현, 시뮬레이션
12+
13+
### 제출 일자
14+
15+
2025년 8월 12일 16:36:40
16+
17+
### 문제 설명
18+
19+
<p>낚시왕이 상어 낚시를 하는 곳은 크기가 R×C인 격자판으로 나타낼 수 있다. 격자판의 각 칸은 (r, c)로 나타낼 수 있다. r은 행, c는 열이고, (R, C)는 아래 그림에서 가장 오른쪽 아래에 있는 칸이다. 칸에는 상어가 최대 한 마리 들어있을 수 있다. 상어는 크기와 속도를 가지고 있다.</p>
20+
21+
<p style="text-align: center;"><img alt="" src="https://upload.acmicpc.net/85c2ccad-e4b8-4397-9bd6-0ec73b0f44f8/-/preview/" style="width: 506px; height: 350px;"></p>
22+
23+
<p>낚시왕은 처음에 1번 열의 한 칸 왼쪽에 있다. 다음은 1초 동안 일어나는 일이며, 아래 적힌 순서대로 일어난다. 낚시왕은 가장 오른쪽 열의 오른쪽 칸에 이동하면 이동을 멈춘다.</p>
24+
25+
<ol>
26+
<li>낚시왕이 오른쪽으로 한 칸 이동한다.</li>
27+
<li>낚시왕이 있는 열에 있는 상어 중에서 땅과 제일 가까운 상어를 잡는다. 상어를 잡으면 격자판에서 잡은 상어가 사라진다.</li>
28+
<li>상어가 이동한다.</li>
29+
</ol>
30+
31+
<p>상어는 입력으로 주어진 속도로 이동하고, 속도의 단위는 칸/초이다. 상어가 이동하려고 하는 칸이 격자판의 경계를 넘는 경우에는 방향을 반대로 바꿔서 속력을 유지한채로 이동한다.</p>
32+
33+
<p>왼쪽 그림의 상태에서 1초가 지나면 오른쪽 상태가 된다. 상어가 보고 있는 방향이 속도의 방향, 왼쪽 아래에 적힌 정수는 속력이다. 왼쪽 위에 상어를 구분하기 위해 문자를 적었다.</p>
34+
35+
<p style="text-align: center;"><img alt="" src="https://upload.acmicpc.net/d03be3c0-057d-47f7-9808-202ae36a3da3/-/preview/" style="width: 1000px; height: 350px;"></p>
36+
37+
<p>상어가 이동을 마친 후에 한 칸에 상어가 두 마리 이상 있을 수 있다. 이때는 크기가 가장 큰 상어가 나머지 상어를 모두 잡아먹는다.</p>
38+
39+
<p>낚시왕이 상어 낚시를 하는 격자판의 상태가 주어졌을 때, 낚시왕이 잡은 상어 크기의 합을 구해보자.</p>
40+
41+
### 입력
42+
43+
<p>첫째 줄에 격자판의 크기 R, C와 상어의 수 M이 주어진다. (2 ≤ R, C ≤ 100, 0 ≤ M ≤ R×C)</p>
44+
45+
<p>둘째 줄부터 M개의 줄에 상어의 정보가 주어진다. 상어의 정보는 다섯 정수 r, c, s, d, z (1 ≤ r ≤ R, 1 ≤ c ≤ C, 0 ≤ s ≤ 1000, 1 ≤ d ≤ 4, 1 ≤ z ≤ 10000) 로 이루어져 있다. (r, c)는 상어의 위치, s는 속력, d는 이동 방향, z는 크기이다. d가 1인 경우는 위, 2인 경우는 아래, 3인 경우는 오른쪽, 4인 경우는 왼쪽을 의미한다.</p>
46+
47+
<p>두 상어가 같은 크기를 갖는 경우는 없고, 하나의 칸에 둘 이상의 상어가 있는 경우는 없다.</p>
48+
49+
### 출력
50+
51+
<p>낚시왕이 잡은 상어 크기의 합을 출력한다.</p>
52+
Lines changed: 117 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,117 @@
1+
import Foundation
2+
3+
struct Shark {
4+
5+
enum Direction: Int {
6+
case on = 1
7+
case under
8+
case right
9+
case left
10+
}
11+
12+
var i: Int
13+
var j: Int
14+
let speed: Int
15+
var direction: Direction
16+
17+
}
18+
19+
let direcMovieCoordi = [(-1, 0), (1,0), (0,1), (0,-1)]
20+
21+
let rcm = readLine()!.split(separator: " ").map { Int($0)! }
22+
let r = rcm[0]
23+
let c = rcm[1]
24+
let m = rcm[2]
25+
var answer = 0
26+
27+
var sharkDict: [Int:Shark] = [:]
28+
29+
var sharkMap: [[Int]] = Array(repeating: Array(repeating: 0, count: c+1), count: r+1)
30+
31+
func printSharkMap() {
32+
for i in sharkMap {
33+
print(i.map{"\($0)"}.joined(separator: " "))
34+
}
35+
}
36+
37+
for _ in 0..<m {
38+
let input = readLine()!.split(separator: " ").map { Int($0)! }
39+
let sharkI = input[0]
40+
let sharkJ = input[1]
41+
let sharkSpeed = input[2]
42+
let sharkDirec = input[3]
43+
let sharkSize = input[4]
44+
sharkDict[sharkSize] = .init(i: sharkI, j: sharkJ, speed: sharkSpeed, direction: .init(rawValue: sharkDirec)!)
45+
sharkMap[sharkI][sharkJ] = sharkSize
46+
}
47+
48+
func fishing(j: Int) {
49+
for y in sharkMap.enumerated() {
50+
if y.element[j] != 0 {
51+
answer += y.element[j]
52+
sharkMap[y.offset][j] = 0
53+
break
54+
}
55+
}
56+
}
57+
58+
func moveShark() -> [[Int]] {
59+
var copyMap = Array(repeating: Array(repeating: 0, count: c+1), count: r+1)
60+
for y in 1...r {
61+
for x in 1...c {
62+
if sharkMap[y][x] != 0 {
63+
let sharkSize = sharkMap[y][x]
64+
let shark = sharkDict[sharkSize]!
65+
var currentSharkCoordi = (shark.i, shark.j)
66+
sharkMap[currentSharkCoordi.0][currentSharkCoordi.1] = 0
67+
var moveCoordi = direcMovieCoordi[shark.direction.rawValue-1]
68+
var direction = shark.direction
69+
var moveLen = shark.speed
70+
switch direction {
71+
case .on, .under:
72+
moveLen %= ((r-1)*2)
73+
case .left, .right:
74+
moveLen %= ((c-1)*2)
75+
}
76+
77+
for _ in 0..<moveLen {
78+
let di = currentSharkCoordi.0 + moveCoordi.0
79+
let dj = currentSharkCoordi.1 + moveCoordi.1
80+
81+
if di < 1 || di > r || dj < 1 || dj > c {
82+
if direction.rawValue%2 == 0 {
83+
direction = .init(rawValue: direction.rawValue-1)!
84+
} else {
85+
direction = .init(rawValue: direction.rawValue+1)!
86+
}
87+
moveCoordi = direcMovieCoordi[direction.rawValue-1]
88+
currentSharkCoordi.0 = currentSharkCoordi.0 + moveCoordi.0
89+
currentSharkCoordi.1 = currentSharkCoordi.1 + moveCoordi.1
90+
continue
91+
}
92+
93+
currentSharkCoordi.0 = di
94+
currentSharkCoordi.1 = dj
95+
}
96+
97+
98+
sharkDict[sharkSize] = .init(i: currentSharkCoordi.0, j: currentSharkCoordi.1, speed: shark.speed, direction: direction)
99+
if copyMap[currentSharkCoordi.0][currentSharkCoordi.1] != 0 {
100+
if sharkSize > copyMap[currentSharkCoordi.0][currentSharkCoordi.1] {
101+
copyMap[currentSharkCoordi.0][currentSharkCoordi.1] = sharkSize
102+
}
103+
} else {
104+
copyMap[currentSharkCoordi.0][currentSharkCoordi.1] = sharkSize
105+
}
106+
}
107+
}
108+
}
109+
return copyMap
110+
}
111+
112+
for fishingMan in 1...c {
113+
fishing(j: fishingMan)
114+
sharkMap = moveShark()
115+
}
116+
117+
print(answer)

0 commit comments

Comments
 (0)