문제출처 : https://www.acmicpc.net/problem/1463


1. 문제요약

- 연산1. 3으로 나누어 지면 3으로 나눔

  연산2. 2로 나누어 지면 2로 나눔

  연산3. 1을 뺌

- 위 연산 3가지를 이용하여 N을 1로 만드는 최소 횟수

- 1 <= N <= 10^6


2. 접근방법

- bfs

  N에서 N/3, N/2, N-1을 1을 만날때 까지 bfs

=> N과 N이 1로 가는 모든 과정들이 2나 3으로 무조건 나누어 떨어진다고 하면,

     N -> N/3, N/2, N-1 3개의 숫자로 뻗어나감(큐에 3개씩 저장)

     방문한 숫자는 다시 방문할 필요가 없으므로 10^6 만큼 시간이 걸림

     (물론 1을 만나자마자 bfs를 그만 두면 좀 더 빠를거임)


- dp

  N이 1이 되는 최소 횟수는 N/3, N/2, N-1 중에 최솟값 + 1

  d[n] : n이 1이 되는 횟수 로 정의한다면

  d[n] = min(d[n-1], d[n/2], d[n/3]) + 1


3. 시간복잡도

- bfs나 dp 모두 최악 N


4. 회고

- d[n] + 1 을 안해줘서 한참 고민했네...



소스코드 : dp bottom up



[출처 : BOJ, 문제에 대한 모든 권리는 BOJ(acmicpc.net, startlink)에 있음]

'먹고살려면 > boj' 카테고리의 다른 글

BOJ 11727 2xn 타일링2  (0) 2018.01.15
BOJ 11726 2xn 타일링  (0) 2018.01.12
BOJ 2573 빙산  (1) 2018.01.05
BOJ 1389 케빈 베이컨의 6단계 법칙  (0) 2018.01.04
BOJ 9205 맥주 마시면서 걸어가기  (0) 2018.01.03

문제출처 : https://www.acmicpc.net/problem/2573


1. 문제요약

- 물과 상하좌우 4방향으로 인접한 빙하는 접하는 면 갯수 만큼 1년 뒤 녹음

- 빙하가 두 덩어리 이상으로 분리되는 최초시간

- 빙하가 다 녹을 때 까지 두 덩어리 이상으로 분리되지 않는다면 0 출력

- 3 <= 행n, 열m <= 300

- 첫행, n-1행, 첫열, m-1열은 0으로 주어짐

- 빙하의 최대 갯수는 10,000 이하


2. 접근방법

- 빙하 갯수를 세는 dfs or bfs

- 맵을 돌면서 물이 접하고 있는 빙하를 -1


3. 시간복잡도

- 빙하 갯수를 세는 dfs : N*M

- 맵을 돌면서 물이 접하고 있는 빙하 -1 : N*M

  => 여기까지 2NM


- 위 두 과정을 최대 몇번이나 반복할까?

  빙하의 갯수는 최대 10000 = 25 * 40

  행 25, 열 40 으로 된 한 덩어리의 빙하가 가장 늦게 녹음. 물과 접하는 면이 가장 작기 때문(50 + 80)

  정중앙에 있는 빙하가 가장 늦게 녹을 텐데 여기까지 도달하기 위해서는 12행((25 - 1) / 2)이 녹아야함

  모든 빙하가 10이라고 한다면 대략 한 행이 녹는데 10년

  12행이 녹는데 120년

  => 120 * 2NM = 21,600,000 반복

  => 반복마다 코드 길이가 조금 되지만 시간내엔 들어옴


4. 회고

- dfs를 돌때 4방향 탐색을

  if(!map[r-1][c] && !check[r-1][c]) dfs(r-1, c);

  if(!map[r][c-1] && !check[r][c-1]) dfs(r, c-1);

  if(!map[r+1][c] && !check[r+1][c]) dfs(r+1, c);

  if(!map[r][c+1] && !check[r][c+1]) dfs(r, c+1);

  은 틀리고


  for(int k = 0; k < 4; k++){

int nr = r + dr[k];

int nc = c + dc[k];


if(!map[nr][nc] && !check[nr][nc])

dfs(nr, nc);

  }

  는 맞는거지??


  물론 중간에 빙하 깍는 과정을 조금 수정했지만 디버깅 하면서 둘다 잘 돌아갔는데

  으흠.... 

  한시간동안 뻘짓했는데


- 시간이 244ms 나왔는데 더 줄일 수는 없을까?

- dfs에서 2개 이상 발견하면 dfs 안돌고 탈출

- 다 녹은 빙하 위치를 기억해서 다음 시작점을 거기서 부터 녹여나가도



소스코드



[출처 : BOJ, 문제에 대한 모든 권리는 BOJ(acmicpc.net, startlink)에 있음]

'먹고살려면 > boj' 카테고리의 다른 글

BOJ 11726 2xn 타일링  (0) 2018.01.12
BOJ 1463 1로 만들기  (0) 2018.01.12
BOJ 1389 케빈 베이컨의 6단계 법칙  (0) 2018.01.04
BOJ 9205 맥주 마시면서 걸어가기  (0) 2018.01.03
BOJ 1325 효율적인 해킹  (0) 2017.12.27

이번편은 번외편으로 게임 진행에 있어서 도움이 될만한 자료입니다.


1. 경험치 추가획득 방법

- 레벨이 7, 8 언저리 쯤 되면 경험치 쌓기가 힘든데 조금이라도 경험치를 더 쌓는 방법을 알려드리겠습니다.


1) The Three 제단 이용하기

- 어떤 마을이던 The Three의 이렇게 생긴 제단이 있을 겁니다.


- 제단을 누르면 100gold와 500gold 기부가 있습니다.


   

- 100gold를 기부하면 게임시간 일주일 동안 몬스터를 잡을때 +3%의 경험치를 추가로 주는 축복(?)을 받을 수 있습니다.

- 500gold를 기부하면 게임시간 일주일 동안 몬스터를 잡을떄 +5%의 경험치를 추가로 주는 축복(?)을 받을 수 있습니다.


- 상세정보를 보면 XP 보너스에 +2%에 +5%가 추가로 붙은게 보이는군요


2) 스크롤 이용하기

- 파밍이나 상점에가면 'Scroll of Lesser Wisdom' 이 있습니다.

- 이걸 사용하면 게임시간 2일 동안 7%의 경험치를 추가로 얻을 수 있습니다.


- 위 사진은 Scroll of Lesser Wisdom 이네요


- 스크롤은 3종류가 있는데

  Scroll of Lesser Wisdom : 2day +7%

  Scroll of Wisdom : 2day +10%

  Scroll of Greather Wisdom : 2day +15%

  입니다.


- 정리하자면

  The Three 제단

  : 100gold : 7days +3%

  : 500gold : 7days +5%


  스크롤

  : Scroll of Lesser Wisdom : 2day +7%

  : Scroll of Wisdom : 2day +10%

  : Scroll of Greather Wisdom : 2day +15%


- The Three 제단에 500gold 짜리가 가성비가 좋아서 전 항상 시간될 때 마다 받아서 가네요



2. 아이템 속성

- 아이템에 보면 위 사진처럼 파란색 글씨가 있는 것들이 있습니다. 물론 방어구나 악세사리도요.

- 그거에 대해 정리해보겠습니다.


1) 무기

 Banishing

인외존재(데몬, 엘리멘탈 등)에게 랭크당 +2데미지 추가

 Beast Slayer

동물, 반동물에게 랭크당 +2데미지 추가

 EMP

기본 +8% + 랭크당 +4%의 확률로 쇼크 데미지(배터리 소모)

 Holy

언데드에게 랭크당 +2데미지 추가

 Orc Slayer

오크에게 랭크당 +2데미지 추가

 Paralysis

공격시 6%확률로 5초간 마비

 Silver

물리공격에 내성이 있는 겉모습이 변한(shapeshifter) 늑대인간 등에게 최대 데미지 적용 

 Slow

공격시 6%확률로 6초간 슬로우 

 Stun

공격시 5%확률로 2초간 스턴 

 Vicious

30%이하 체력이 남은 적에게 랭크당 +2데미지 추가 


- '랭크' 라고 적은 부분은 위 아이템에 보면 'Orc Slayer 2' 라고 적혀 있는데 2가 랭크 입니다.

※ Light 는 무기 타입 입니다. 2-Handed, Hand, Ranged와 같은.. 속성이 아닙니다. 


2) 방어구, 악세사리

 Anti-Rad

Ashen Wastes에 서식하는 붉은색 오크에게 부분적 방어

 Detection

랭크당 +3% 추가로 숨겨진 것 찾기 확률 상승

 Gossip

랭크당 +3% 추가로 가십 상승

 Shield

방어계수가 20-100%인걸 40-100%로 올려줌

 Stability

넉백면역

 Stun Immunity

스턴 면역, 마비 반 면역

 Tinkering

랭크당 +5% 추가로 트랩이나 다른 장치 발견 확률 상승

 Wisdom

랭크당 +2XP 상승



3. 어드밴스드 스킬

- 어드밴스드 스킬이 35개라 너무 많으니 다음 기회에......

 Arcanist

 

 

 

 

 

 Assassinate

 

 

 

 

 

 Battle Prayer

 

 

 

 

 

 Battle Rage

 

 

 

 

 

 Bloodust

 

 

 

 

 

 Body Develpment

 

 

 

 

 

 Death Ward

 

 

 

 

 

 Disintegrate

 

 

 

 

 

 Duel

 

 

 

 

 

 Earth Mastery

 

 

 

 

 

 Explosive Traps

 

 

 

 

 

 Fire Mastery

 

 

 

 

 

 Fire Ward

 

 

 

 

 

 Flames of Faith

 

 

 

 

 

 Flurry

 

 

 

 

 

 Gate

 

 

 

 

 

 Guardian Wolf

 

 

 

 

 

 Heavyhand

 

 

 

 

 

 Ice Mastery

 

 

 

 

 

 Ice Ward

 

 

 

 

 

 Infantry Training

 

 

 

 

 

 Mage Barrier

 

 

 

 

 

 Magical Training

 

 

 

 

 

 Massive Criticals

 

 

 

 

 

 Poison Master

 

 

 

 

 

 Poison Shots

 

 

 

 

 

 Precision Strikes

 

 

 

 

 

 Rapid Fire

 

 

 

 

 

 Retribution

 

 

 

 

 

 Shock Ward

 

 

 

 

 

 Smoke Bomb

 

 

 

 

 

 Spiritual Ward

 

 

 

 

 

 Summoner

 

 

 

 

 

 Toxic Ward

 

 

 

 

 

 Turn Undead

 

 

 

 

 



+ Recent posts