스쿠버 다이빙알기

스쿠버 다이빙이란?

스쿠버 다이빙이란 표면공기 공급 장치와는 달리 육상 또는 수면으로부터 공기를 공급 받지 않은 상태로 (다이버는)압축 공기통이나 호흡기체를 압축해 담은 용기를 착용하고 수중에서 자유로이 호흡하면서 이동하며 자신의 목적을 수행하는 활동 일반적으로 장비 착용 시 5~10M 경험 해볼 수 있고, 라이센스 취득시 수심 40M 까지 경험해볼 수 있다.

이외 수중레포츠 종류

  • 스킨다이빙 (= 스노클링)

마스크, 스노클, 오리발 등 장비를 착용

  • 프리 다이빙

스킨다이빙 + 수중에서 수심과 시간을 늘리기 위해 고난도의 호흡 테크닉과 다이빙 스킬들을 사용
라이센스 취득 필요

  • 스피어 피싱

프리 다이빙 + 작살총을 이용한 수중사냥은 레크레이션

얻는 즐거음

  • 아직 보지 못한 세계를 탐험

지구를 100% 즐기는 방법
대양은 지구 표면의 71%를 차지, 지구 해수면지상과 해상에서 할 수 있는 레포츠 종류는 정말 많지만 수중 레포츠는 다이빙 뿐이다.

  • 무중력 체험

무중력을 경험할 수 있고, 중성 부력를 통해 가라 앉지도 떠있지도 않은 평온한 상태 경험
대화불가, 오로지 자신 호흡소리에만 집중

  • 바다 생물 관찰이나 바다아래 숨겨진 역사체험은 덤

자주 묻는 질문

물을 무서워 하는 사람도 할 수 있나요?

만 10세 이상 누구나 할 수 있고, 물 공포증을 없애는데 효과가 크다는 결과도 있다. 또한 수영과도 크게 상관은 없다.

라이센스 취득 비용

나라와 지역, 라이센스 발급 단체별 가격이 다르다

  • 체험 스쿠버 다이빙

라이센스 없이 스쿠버 다이빙을 체험해볼 수 있는 기회
장비대여및 기본 교육포함 10만원정도 (1~3시간)

  • 오픈워터 자격증 코스

스쿠버 다이버가 되기 위한 첫 단계. 최대 18미터까지 입수 가능. 3~4일 교육기간소요
3~40만원
주요 교육내용

  • 어드밴스드 자격증 코스

중급자 이상의 실습위주 교육. 최대 수심 40미터까지 입수 가능.
1~2일 교육. ~40 만원

여행 비용

  • 국내

제주도/동해/남해
1일 ~ 15만원 (3회)

  • 해외

필리핀/사이판/태국/일본/인도네시아 등
1일 ~ 130불 (3회)

  • 추천 포인트

필리핀 보홀섬:
http://www.oceanholic.com/sub30/233436
http://www.oceanholic.com/sub30/309222

장비소개


스킨장비

  • 슈트 : 아무리 체온이 따뜻한 바닷물이라도 체온을 유지하기 위해서는 옷을 입어야 한다. 두께에 따라 3mm, 5mm, 7mm 같은 슈트가 있고, 물이 투과되는 웻슈트와 투과되지 않는 드라이슈트 등 여러종류의 슈트가 있다.

  • 마스크 : 수중에 들어가게 되면 사람의 시력은 물로 인해 흐릿하게 된다. 이럴때 눈을 보호하고 시력을 맑게 유지시켜주는 장비가 마스크이다.

  • 스노클 : 수면에서 편안하게 숨을 쉴수 있게 하는 장비

  • 핀 : 수중에서 다리를 사용하여 수영할 수 있게 해준다

스쿠버장비

  • 호흡기 : 공기통에 모인 공기를 편안하게 호흡하게 해 주는 장비. 입으로 호흡기를 물고나면 수중에선 편안한 호흡을 유지시켜 준다

  • 보조호흡기 : 호흡기가 고장 나거나 짝이 필요로 할때 사용하게 되는 예비 호흡기

  • 게이지(SPG) : 수중용 나침판, 수심계, 잔압계등로 구성되어 있고 한번에 여러가지를 볼 수 있도록 한 뭉치로 되어 있다.

  • 부력조절기(BCD) : 공기통과 결합해 등에 짊어지게 하고, 공기를 넣었다 뺐다 할 수 있어 수중과 수면에서 부력을 조절하게 할 수 있다.

  • 다이브 컴퓨터 : 자동으로 수심, 수온, 방향, 다이빙시간, 무감앞 한계시간 등을 표시해 준다. 점차 다이빙을 하는데 필수적인 장비로 인식되고 있다.

다이빙 시 발생할 수 있는 위험

  • 패닉

바다속에서는 소리가 들리지 않는다. 자기 혼자만 남겨져 있다는 공포심. 반드시 2인 1조 (버디시스템)로 움직인다.

  • 압착

물속으로 들어갈 수록 대기압 + 수압이 몸에 가해진다 (10m 당 + 1 bar의 압력). 이때 가정 먼저 압력을 느끼는 곳이 귀이다. 그 압력을 해소시키지 못하면 귀에 통증이 유발되 더이상 내려갈 수 없다. 이를 방지하는것이 압력평형(이퀄라이즈)이다.

  • 감압병

흔히 잠수병이라함. 수심이 깊어지고(30m 이상), 시간이 길어질수록 더욱 많은 양의 질소가 체내에 축적이 되는데, 이렇게 축적된 질소를 제대로 배출해 주기 위해 안전정지 (safety stop)을 가급적 필수로 해 주어야 한다.

안전정지란 10미터 수심 이상을 다이빙 했을 시, 상승 전 3 ~ 6m 수심사이에서 3분 동안 머무르는 것을 말한다.

만약 깊은 수심에서 장시간 다이빙을 진행한 후에 빠른 속도로 상승을 하게 되면, 질소가 원활하게 배출되지 못하면서 신체 조직 내에서 기포를 형성하게 된다. 이렇게 형성된 기포는 감압병의 원인으로 어떤 부분에 발생하는가에 따라 다른 증상으로 나타난다.

  • 질소마취

수면을 떠라 하강함에 따라 호흡 기체 중의 질소 분압이 상승하게 되는데, 체내에 녹아들어간 질소의 분압이 일정 수준을 넘어서게 되면 신경 세포의 작용을 방해하여 마취 효과를 일으키며, 이를 질소 마취라 말한다.

이것은 마치 술을 먹고 취한 것과 동일한 증상을 나타내고, 어떤 사람은 깔깔대고 웃고 싶은가 하면 어떤 경우에는 울고 싶은 심정이 들기도한다. 이러한 현상이 심해지면 자기 통제가 불가능해져서, 호흡 조절기를 빼서 물고기에 건네준다 든가, 자신이 물 속에 있다는 사실을 잊고 행동하여 치명적인 결과를 낳을 수 있다.

Fruit Feast

Problem

https://www.acmicpc.net/problem/11964

Idea

dfs탐색이되 중복을 막는다.

static void f(int sum, int flag) {
    if (sum > T) {
        return;
    }
    if (sum > ans) {
        ans = sum;
    }
    if (memo[flag][sum] > 0) {
        return;
    }
    memo[flag][sum]++;

    f(sum + A, flag);
    f(sum + B, flag);
    if (flag == 0) {
        f(sum / 2, 1);
    }
}
경주

Problem

https://www.acmicpc.net/problem/5820

Idea

트리의 Centroid: N개의 노드를 가지는 트리에서 특정 노드를 지웠을 때 나눠지는 subtree의 node개수가 각각 N/2 이하라면 그 특정 노드를 트리의 centroid 라고한다.

centroid node를 구하는 방법

  1. 임의의 root node를 택하고 dfs를 통해 각 node별 subtree 의 size를 구한다
    static int getSz(int curr, int parent) {
        sz[curr] = 1;
            
        for (int next : adj.get(curr)) {
            if (curr == next) {
                continue;
            }
            sz[curr] += getSz(next, curr);
        }
        return sz[curr];
    }
    
  2. 임의의 root node로부터 subtree size가 N/2 개보다 큰 node가 없을 때까지 탐색을 진행
    static int getCenter(int here, int parent, int cap) {
         for (int next: adj.get(here)) {
             if (here == next) { 
                 continue;
             }
             if (sz[next] > cap) {
                 return getCenter(next, here, cap);
             }
         }
         return here;
    }
    
색칠하기

Problem

https://www.acmicpc.net/problem/13265

Idea

edge 끝 두 vertex가 서로 색깔이 달라야 한다(이분 그래프).
주의점은 그래프가 끊겨있을 수 (비연결)있어 모든 정점을 체크해야함

  • 모든 정점 체크 시 이미 체크한 정점은 skip
  • coloring 은 1과 -1로 구분이 코딩이 편하다. * -1 해주면 되니..
The Other Way

Problem

https://www.acmicpc.net/problem/14554

Idea

DAG(Directed Acyclic Graph)로 시작점 부터 끝점까지 가는 최단 거리를 구한다. 이때 dp로 경우의 수를 업데이트한다.

최단 거리가 갱신이 되면 경우의 수가 0으로 초기화
최단 거리가 같은 경우 경우의 수 업데이트

d[n]: 시작점 S로부터 정점 n 에까지의 최단 경로 수
dist[n]: 시작점 S로부터 정점 n 에까지의 최단 경로 값
d[n] = d[prev] + d[n] if (dist[n] == dist[prev] + w(prev->n) ) d[n] = 0 if (dist[n] > dist[prev] + w(prev->n))

Dijkstra 최단거리

S - a - b - c - S 인 no directed cycles graph 에서 최단거리가 S -> c 라고하면
2 4 3 12
정점만을 큐에 넣는 BFS 에서는 최단거리를 찾기 어렵다. 큐에는 발견된 정점 순서대로 방문하기 때문에 a와 c를 방문한 이후에 b를 가게된다. 더 늦게 발견한 정점이라도 더 먼저 방문할 수 있어야 한다.

BFS에서는 큐에 정점을 넣었지만 다익스트라 알고리즘에서는 우선순위 큐에 정점의 번호와 함께 지금까지 찾아낸 해당 정점까지의 최단 거리를 쌍으로 넣는다.

시작점에서 (a,2) 와 (c,12) 가 우선순위 큐에 들어간다.
c는 큐에 있고 a 와 b가 순서대로 방문하게 된다.
b가 방문될 때 b에서 c로 가는 길이 9가 되 12 보다 짧아지게된다.
이미 큐에 들어있는 (c,12)는 어떻게 해야하나? (c,12)를 찾아 (c,9)로 바꿔야 하나?
(c,9)를 추가하고 (c,12) 가 꺼내질 때는 그냥 무시한다

복잡도: 각 정점마다 인접한 간선을 모두 검사(1) + 우선순위 큐 넣고 빼는 비용(2)

1: 전체 간선개수 O(E)
2: dist 가 갱신될 때마다 큐삽입이 일어나고, 최대 모든 edge가 큐에 삽입가능하므로 O(E)가 되며 추가 삭제는 O(log(E))가 걸려 큐 관련된 총 비용은 O(ElogE) 가 된다.

총 비용: O(E + ElogE)

for (int i = 0; i < E; i++) {
    StringTokenizer st = new StringTokenizer(br.readLine(), " ");
    int from = Integer.parseInt(st.nextToken());
    int to = Integer.parseInt(st.nextToken());
    int weight = Integer.parseInt(st.nextToken());
    list.get(from).add(new Edge(to, weight));
    list.get(to).add(new Edge(from, weight));
}
PriorityQueue<Edge> que = new PriorityQueue<>();
dist[start] = 0;
que.add(new Edge(start, 0));

while (!que.isEmpty()) {
    int cur_index = que.peek().index;
    int cur_w = que.peek().weight;

    que.poll();

    // 만 약 지금 꺼낸 것보다 더 짧은 경로를 알고 있다연 지금 꺼낸 것을 무시한다.
    if (dist[cur_index] < cur_w) {
        continue;
    }
    for (Edge edg: list.get(cur_index)) {
        int next_index = edg.index;
        int next_weight = edg.weight;
    
        if (next_index == cur_index) {
            continue;
        }
        if ( dist[cur_index] + next_weight < dist[next_index]) {
            dist[next_index] = dist[cur_index] + next_weight;
            que.add(new Edge(next_index, dist[next_index]));
        }
    }
}