2019년 11월 17일 일요일

[Python 3] HackerRank Forming a Magic Square

Test url: https://www.hackerrank.com/challenges/magic-square-forming/problem



My Answer:


#!/bin/python3

import math
import os
import random
import re
import sys

def reverseTopBottom(mtx):
result = [[0]*3 for i in range(3)]

for i in range(3):
for j in range(3):
result[i][j] = mtx[2-i][j]
return result

def reverseLeftRight(mtx):
result = [[0]*3 for i in range(3)]

for i in range(3):
for j in range(3):
result[i][2-j] = mtx[i][j]

return result

def rotate90(mtx):
result = [[0]*3 for i in range(3)]

result[0][0] = mtx[2][0]
result[0][1] = mtx[1][0]
result[0][2] = mtx[0][0]
result[1][0] = mtx[2][1]
result[1][1] = mtx[1][1]
result[1][2] = mtx[0][1]
result[2][0] = mtx[2][2]
result[2][1] = mtx[1][2]
result[2][2] = mtx[0][2]

return result

def calculate(s, mtx):
result = 0
for i in range(3):
for j in range(3):
result += abs(mtx[i][j] - s[i][j])
return result

# Complete the formingMagicSquare function below.
def formingMagicSquare(s):
result = 0
minResult = 100
mtx = [[4,9,2],[3,5,7],[8,1,6]]
result = calculate(s, mtx)
if(minResult > result):
minResult = result

mtx = rotate90(mtx)
result = calculate(s, mtx)
if(minResult > result):
minResult = result

mtx = rotate90(mtx)
result = calculate(s, mtx)
if(minResult > result):
minResult = result

mtx = rotate90(mtx)
result = calculate(s, mtx)
if(minResult > result):
minResult = result

mtx = reverseLeftRight(mtx)
result = calculate(s, mtx)
if(minResult > result):
minResult = result

mtx = rotate90(mtx)
result = calculate(s, mtx)
if(minResult > result):
minResult = result

mtx = rotate90(mtx)
result = calculate(s, mtx)
if(minResult > result):
minResult = result

mtx = rotate90(mtx)
result = calculate(s, mtx)
if(minResult > result):
minResult = result

return minResult


if __name__ == '__main__':
fptr = open(os.environ['OUTPUT_PATH'], 'w')

s = []

for _ in range(3):
s.append(list(map(int, input().rstrip().split())))

result = formingMagicSquare(s)

fptr.write(str(result) + '\n')

fptr.close()

[Python 3] HackerRank Max Min

Test url: https://www.hackerrank.com/challenges/angry-children/problem


My Answer:

#!/bin/python3

import math
import os
import random
import re
import sys

# Complete the maxMin function below.
def maxMin(k, arr):
cal = 0
min = 1000000000
arr.sort()

for i in range(len(arr)-k+1):
cal = arr[i+k-1] - arr[i]
if(cal < min):
min = cal
return min

if __name__ == '__main__':
fptr = open(os.environ['OUTPUT_PATH'], 'w')

n = int(input())

k = int(input())

arr = []

for _ in range(n):
arr_item = int(input())
arr.append(arr_item)

result = maxMin(k, arr)

fptr.write(str(result) + '\n')

fptr.close()

[Python 3] HackerRank Non-Divisible Subset

Test url: https://www.hackerrank.com/challenges/non-divisible-subset/problem


My Answer:



#!/bin/python3

import math
import os
import random
import re
import sys

#
# Complete the 'nonDivisibleSubset' function below.
#
# The function is expected to return an INTEGER.
# The function accepts following parameters:
# 1. INTEGER k
# 2. INTEGER_ARRAY s
#

def nonDivisibleSubset(k, s):
# Write your code here
result = 0
arr = [0] * k
half_idx = k // 2 + k % 2

for i in range(len(s)):
seed = s[i] % k
arr[seed] += 1

for i in range(0, half_idx):
if i == 0:
if(arr[i] > 0):
result += 1
continue

if arr[i] > arr[k-i]:
result += arr[i]
else:
result += arr[k-i]

if k % 2 == 0 and arr[half_idx] > 0:
result += 1

return result


if __name__ == '__main__':
fptr = open(os.environ['OUTPUT_PATH'], 'w')

first_multiple_input = input().rstrip().split()

n = int(first_multiple_input[0])

k = int(first_multiple_input[1])

s = list(map(int, input().rstrip().split()))

result = nonDivisibleSubset(k, s)

fptr.write(str(result) + '\n')

fptr.close()

2019년 11월 15일 금요일

[Python 3] HackerRank Encryption

Test URL: https://www.hackerrank.com/challenges/encryption/problem



My Answer:


#!/bin/python3

import math
import os
import random
import re
import sys

# Complete the encryption function below.
def encryption(s):
result = ''
row = 0
col = 0

myStr = s.replace(' ','')
str_len = len(myStr)
str_len_sqrt = math.sqrt(str_len)

if(int(str_len_sqrt) == str_len_sqrt):
row = col = int(str_len_sqrt)
else:
row = int(str_len_sqrt)
col = row + 1

for i in range(col):
for j in range(i,str_len,col):
if(myStr[j]):
result += myStr[j]
result += ' '

return result


if __name__ == '__main__':
fptr = open(os.environ['OUTPUT_PATH'], 'w')

s = input()

result = encryption(s)

fptr.write(result) # removed (+ '\n')

fptr.close()

2019년 11월 5일 화요일

Clojure Study) 개발 환경 세팅

1. VSCode 설치
사용 버전: VSCodeUserSetup-x64-1.39.2

2. Java 설치
JDK로 설치할 것. (JRE X)

3. leiningen-installer-1.0 설치
url: http://leiningen-win-installer.djpowell.net


4.Calva: Clojure & ClojureScript 설치
(VSCode의 Extension 메뉴에서 검색)


5. 윈도우에서 Clojure REPL을 검색하여 실행

6. REPL 을 켜둔채로 유지하고, REPL에 나온 포트 번호를 기억

7. VSCode 를 실행한 뒤, ctrl + alt + c 를 누르고, ctrl + alt + j를 입력.
"There was no valid project configuration found in the workspace ... " 라는 에러가 뜰 텐데.
창 가장 하단에 파란색 막대가 생겨있을 텐데, 거기서 nREPL 버튼을 누를 것


그럼 위 쪽 커맨드 입력창에서 "Connect to a running REPL server, not in your project" 선택, 이어서 Leiningen 선택.

그 뒤 나오는 화면에서 6번 과정에서 띄웠던 포트번호를 입력하면, VSCode에서 REPL 사용 가능

Python Study) 개발 환경 세팅

1. VScode 설치
 사용 버전: VSCodeUserSetup-x64-1.39.2

2. VSCode 실행 후 Extension 탭 클릭

3. Python 검색하여 설치

2018년 5월 31일 목요일

(번역) C에서 과학적표기법으로 int 상수를 나타내도 안전한가요?

//원문:
https://stackoverflow.com/questions/24389678/is-scientific-notation-safe-for-integer-constants-in-c

---------------------------------------------------------------------------------------------------

질문: C에서 과학적표기법으로 int 상수를 나타내도 안전한가요?

질문자: David Dombrowsky
질문 날짜: 2014-06-24

저는 큰 10의 제곱수의 상수를 과학적 표기법을 사용하는 식으로 표현했었는데요, 그래서 전 0의 숫자를 셀 필요가 없었습니다. 이렇게 말이죠.

#define DELAY_USEC 1e6

제 동료는 이건 integer가 아니기 때문에 항상 정확히 1000000의 값을 가질거라는 보장이 없어서 안전하지 않을 거라고 하더군요. 문서를 읽어봤을 땐 써도 괜찮은 것으로 보였지만, 이게 실제로도 맞는지 궁금합니다. 10의 제곱수를 약자로 안전하게 표현할 수 있는 방법이 따로 있나요? define에서 int로 변환하는 거는 안전한 방법인가요?


---------------------------------------------------------------------------------------------------

투표수: 19
답변자: Mike Seymour
답변 날짜: 2014-06-24

이론적으로는, 아닙니다. 언어에서는 소수점 값을 어떤 식으로, 그리고 정확하게 표현할 수 있는지 명시하지 않았습니다. (업데이트: C11에서는 추천하는 표현방식이 있다고 합니다. C++ 나 예전 C라면, 아닙니다)

실제로는, 꽤 큰 숫자까지 Yes입니다. 당신이 보게 될 구현들은 double에 대한 64-bit IEEE  표준을 따를 것입니다. 그건 2의 53승(대충 9x10^15) 까지의 어느 int 값이라도 정확하게  표현될 수 있습니다. 즉, 32비트의 int 형은 뭐든지 확실히 표현할 수 있다는 뜻이죠.

2018년 5월 29일 화요일

(번역) C++에서 큰 숫자를 어떻게 읽기 쉽게 쓸 수 있을까요?

//원문:
https://stackoverflow.com/questions/50559636/is-there-a-way-to-write-a-large-number-in-c-source-code-with-spaces-to-make-it
---------------------------------------------------------------------------------------------------

질문: C++에서 큰 숫자를 어떻게 읽기 쉽게 쓸 수 있을까요?

질문자: Makogan
질문 날짜: 2018-05-29

제가 이런 코드를 가지고 있다고 치겠습니다.

vector<int> temp = vector<int>(1 000 000 000);
위 코드는 저 공백을 설명할 수 없어 컴파일러가 컴파일하지 않을 것입니다. 컴파일할 때 저런 공백을 무시하는 방법이나, 숫자를 읽기 쉽게 만들 수 있는 다른 방법이 있을까요?




Relevant post (이 포스트에 따르면 그런 숫자를 쓰는 가장 좋은 방법은 1e9 입니다.) - leftaroundabout

---------------------------------------------------------------------------------------------------

투표수: 82
답변자: Nicky C
답변 날짜: 2018-05-29


digit separator를 써보세요:
int i = 1'000'000'000;
이건 C++14 부터 적용되는 특징입니다. ( ' ) 이 문자를 digit separator로 사용합니다.


다음 링크도 참고해보세요


ㄴ이건 다른 진수에도 통합니다. hex: 0x01'ff, octal: 0'777, binary: 0b0000'1111'0000 :) - YSC


2018년 5월 27일 일요일

(번역) 면접 전에 회사의 공개 와이파이에 보안 테스트를 해도 될까요? [스택오버플로우]

//원문 링크
https://workplace.stackexchange.com/questions/112571/is-it-acceptable-to-do-a-security-test-on-a-companys-open-wifi-before-an-interv
---------------------------------------------------------------------------------------------------

질문: 면접 전에 회사의 공개 와이파이에 보안 테스트를 해도 될까요?

질문자: Chase Sandmann
질문 날짜: 2018-05-20

XYZ라는 조직에 IT 포지션으로 면접 제의를 받았습니다.

로비에서 기다리는 동안, XYZ라고 되어 있는 공개 WiFi를 발견했습니다. 와이파이에 연결하자 인사말과 함께 username과 비밀번호를 요구하는 웹 페이지가 나타났습니다. Fing(안드로이드 앱)을 사용해 연결된 장비들을 스캔해보니 XYZ-HR-1과 XYZ-FN-1이라는 랩탑을 몇 개 찾을 수 있었습니다.

면접을 보는 중에 그들에게 말했습니다. 내 포지션은 보안 쪽에도 좀 관련되어 있는데, 회사 의 공개 네트워크에 보안 취약점을 찾아냈다고요.

IT 매니저는 그 말에 인상깊어하는 눈치였지만, HR 직원은 아니었습니다. 그는 방어적인 태도로 아직 당신은 우리의 네트워크 보안을 체크하라고 고용된 건 아니다라고 말했습니다. 저는 이건 저나 다른 사람이 고용될 때까지 기다릴 수 없는 중요한 문제라고 했습니다.

이런 걸 그들에게 말하는게 맞는 거였나요? 제가 기회를 걷어차 버린 걸까요? 다른 곳에서도 이렇게 하는 것이 맞을까요(만약 뭔가 발견하게 된다면)? 이런 정보는 면접에서 어떻게 유리하게 써먹을 수 있을까요?





ㄴ해도 되냐고 물어보는 의미가 취업에 도움이 되냐는 뜻인가요 아니면 합법적이냐는 뜻인가요? - Mr Me

ㄴ왜 혼자서 생각해보거나 그 회사 문화가 어떤지 체크하지 않고인터넷의 모르는 사람한테 이런 질문들을 하는거죠? - mathreadler

---------------------------------------------------------------------------------------------------

투표수: 262
답변자: Sascha
답변 날짜: 2018-05-20

이런 멍청한 짓은 - 대부분의 환경에서 - HR로부터 골칫거리로 생각될 겁니다. 이유는 매우 간단합니다: 당신은 당신이 뭘 하는지 알고 있었고, 그리고 그 테스트를 하는 건 당신의 책무가 아니라는 것이죠.

혹시 당신이 "인터넷에 이런 얘기가 나돌던데요?" 라는 식으로 그런 문제를 발견했다면 괜찮았을 겁니다. 하지만 보안 전문가는 네트워크 스캐너를 네트워크 상에 돌린다는 것은, 관리자에게 허가받지 않았다면, 그 행동이 분명 "좋지 않음" 과 "나쁜 의도"라는 분류 중 어딘가에 속할 것이라는 것을 알아둬야 할 겁니다. 또한 이건 실제 문제를 발생시킬 수도 있습니다. 가령 False 알람같은 것을 작동시킨다거나 말이죠. 저는 다른 부서(혹은 내부망의 누구든지)의 어떤 놈이 허가 없이 했던 스캔의 근원지를 찾느라 몇 시간을 낭비해본 경험이 있습니다.

그런 상황에서는, 누군가는 당신이 회사 안으로 오기 전까지 그 네트워크는 보이지 않았을 거라고도 상상했을 법 합니다. 저는 특별한 방법없이는 외부에서 WiFi신호를 보지 못할 정도로 큰 장소에서도 작업해 봤습니다. 그런 경우 퍽이나 보안 위협이 있겠네요.
(저도 여러분이나 ,IT인들이 아시는 것처럼 공개 WiFi를 사용하는 것이 좋지 않음을 알고 있습니다. 하지만 저는 이게 인사부나 관리부에서도 듣고 싶어하는 얘기인진 모르겠네요)





ㄴ 어느 나라인지 언급이 안 되어 있지만, 미국에서는 정말 조심해야 합니다. 단순한 Fing 스캔조차도 컴퓨터 사기 및 남용 행위 (CFAA)에 저촉될 수도 있고, 불법적인 컴퓨터시스템 접근으로 생각될 수도 있습니다. 위키피디아의 첫 번째 라인을 보시길 바랍니다: en.wikipedia.org/wiki/Computer_Fraud_and_Abuse_Act "The law prohibits accessing a computer without authorization, or in excess of authorization"
- JesseM


---------------------------------------------------------------------------------------------------

투표수: 185
답변자: Kate Gregory
답변 날짜: 2018-05-20

제가 당신을 저희집 뒷마당 바베큐파티에 초대했다고 상상해 봅시다. 당신은 제가 부엌에 있는 동안 도착한 다음 이렇게 말했습니다.

[
당신이 직장에 가 있는 동안 들렸었는데요. 울타리가 제 기능을 못하고 있더군요. 그네는 지반에 제대로 박혀있지 않았구요, 그건 덩치큰 애들이 강하게 타면 위험할 수 있어요. 또, 데크 난간이 너무 넓던데, 요즘 법은 X 인치만큼이고 당신 거는 Y 였습니다.
]

저는 당신의 무례함에 입을 벌린채 멍하니 서있을 겁니다. 아무도 당신에게 해달라고 한 적이 없고, 당신은 그게 해도 되는 건지 물어보지도 않았고, 당신은 단지 멋대로 침범한 다음 지금 지적질을 하고 있군요. 네, 그네 탈 때의 아이들의 안전과 데크는 정말 중요하죠. 하지만 사회생활의 규칙도 마찬가지로 중요합니다. 훌륭한 손님이라면 동의 없이 뒷마당을 침입하지도, 대화 초입부부터 검사 레포트를 내뱉지도 않겠죠. 대신 레몬에이드 한 잔과 함께 뒷마당에 갈 때까지 기다렸다가 이렇게 말할 겁니다.

[
어, 그네가 있네요. 그네에 대해 조금 압니다만, 이거 땅에 제대로 묻혀있는 건가요? 제가 한 번 봐도 되겠습니까?
]

그리고

[
요즘 데크 난간이 Y인치로 규정되어있는거 아시죠? ...보기에 당신거는 좀 오래되어 보이는데.. 혹시 괜찮으시다면 측정 테이프로 확인해봐도 될까요?
]

이렇게 당신은 뒷마당 안전에 대한 깊은 지식과 당신이 해당하는 도구를 가지고 있음을 보여줬지만, 아무에게도 피해를 주지 않았습니다.

이 비유는 공개 WiFi와 연결된 기기 이름을 체크하는 행동과 완벽하게 같지는 않습니다. 이건 이런 행동이 끌어내는 감정적 반응을 보여드리는 겁니다. 그들은 당신을 면접 보자고 사무실로 초대했죠. 당신은 그들이 보지 않는 곳에서 허가 없이 면접 규범의 바깥에 해당하는 무언가를 했죠. 그리고 당신이 무엇을 했는 지 말하는 것과 동시에 그들에게 지적을 했습니다. 적어도 그들 중의 한 명은 충격받고 기분이 상했습니다. 위의 실험적인 생각은 당신이 그런 기분을 이해하도록 해줍니다.

비유로 들었던 건 이제 됐고, 당신이 어떻게 했어야 했을까요? 면접 초반에 당신이 한 행동의 결과를 얘기하는 것 대신, 보안 쪽에 대한 얘기가 나올 때까지 기다렸다가 "많은 회사들이 네트워크가 몇 가지 새로운 공격에 취약하다는 것을 잘 모르기도 합니다. 괜찮으시다면 귀사의 손님용 WiFi를 5분 정도 스캔해볼 수 있습니다." 라고 할 수 있을 겁니다. 당신은 자신감 있게 이 제안을 할 수 있습니다. 왜냐하면 이미 로비에서 해봤으니까요 :-). 그리고 당신은 당신의 기술력과 도구를, 적절한 상황에서, 허가를 받은 채 보여주게 됩니다. 당신이 찾은 것은 그들을 바보로 만드는 것 대신 그들의 체면을 세워주게 됩니다. 당신이 문제를 찾았을 때, 당신은 어떻게 하면 취약점을 막을 수 있는지 알고 있다고 말할 수 있습니다. 이제 그들은 당신을 공격하는 대신 당신을 고용하고 싶어하겠네요.





동의하지 않습니다. 올바른 비유는 누군가를 당신의 집에 어떤 문제를 확인하기 위해 초대했고 (당신이 비유했던 것처럼), 그러나 손님에 대해 혹은 일자리에 대한 이야기를 하기도 전에 당신이 기대했던 것보다 더 많은 것에 대해 모두 체크해 버린 것이죠. 질문자는 단지 수다 떨자고 초대받은 것이 아니라, 일자리를 위해 초대받은 것이죠 - John Weisz

ㄴRe "저는 당신의 무례함에 입을 벌린채 멍하니 서있을 겁니다", 정말요? 저라면 제 정원을 관리시키기 위해 면접보는 사람이 그랬다면 정말 좋아했을 겁니다. 물론 당신이 말한 요점 (마지막 두 문단)에는 동의합니다만, 당신의 비유는 조금 고칠 필요가 있겠군요. - ikegami

---------------------------------------------------------------------------------------------------








2018년 4월 13일 금요일

[C++] Samsung SW Expert Academy 1244. [S/W 문제해결 응용] 2일차 - 최대 상금

/*

When I made 'check' as Map STL, it failed because it's too slow.
After I changed check to bool array, it got much faster.

It means that Map STL is sooooooooooo much slow.






*/

#include <iostream>
#include <string>

using namespace std;

bool check[100][999999]; //최대 교환 횟수를 100으로 가정함.
int max_num;

void calc(string num, int len, int change) {
    if(change==0) {   
        int result = stoi(num);
        max_num = max(max_num,result);

    } else {
        for(int i=0;i<len;i++) {
            for(int j=i+1;j<len;j++) {
                if(num[i] > num[j]) continue;
                char temp = num[i];
                num[i] = num[j];
                num[j] = temp;

                if(check[change-1][stoi(num)]) {
                    temp = num[i];
                    num[i] = num[j];
                    num[j] = temp;
                    continue;
                } else {
                    check[change-1][stoi(num)] = true;
                    calc(num,len,change-1);
               
                    temp = num[i];
                    num[i] = num[j];
                    num[j] = temp;
                }
            }
        }   
    }
}

int main() {
    int N;
    cin >> N;
   
    for (int i=1;i<=N;i++) {
    string num;
        int change;
        cin >> num;
        cin >> change;
        int len = num.size(); 
       
        max_num = 0;

calc(num,len,change);
       
       cout << "#" << i << " " << max_num << endl;
    }
   
return 0;
}

2018년 4월 12일 목요일

[C++] Samsung SW Expert Academy 1247. [S/W 문제해결 응용] 3일차 - 최적 경로

/*

Basic DFS(or BFS) problem.






*/

#include <iostream>

using namespace std;

struct myPair {
int x;
    int y;
};
myPair comp,home;
myPair cust[10];
int result;
int visit[10];


int dist(myPair p1, myPair p2) {
int temp = abs(p1.x - p2.x);
    int temp2 = abs(p1.y - p2.y);
 
    return temp + temp2;
}

void dfs(int N, int prev, int cur, int sum, int count) {
    if(prev == -1) {
        sum = dist(comp,cust[cur]);
    }
    else {
        if (visit[cur] == 1) {
            return;
        }

        sum += dist(cust[prev],cust[cur]);
    }
 

    visit[cur] = 1;
    count++;
 
    if(count >= N) {
        sum += dist(cust[cur],home);
        result = min(result,sum);
        visit[cur] = 0;
        return;
    }
 
    for(int d=0;d<N;d++) {
    dfs(N,cur,d,sum,count);
    }
    visit[cur] = 0;

}

void calc(int N){
    for(int i=0;i<N;i++) {
        dfs(N,-1,i,0,0);
    }
}

int main() {
    int T;
    cin >> T;
 
    for(int k=1;k<=T;k++){
        int N;
        cin >> N;
     
        cin >> comp.x;
        cin >> comp.y;
        cin >> home.x;
        cin >> home.y;

        for(int i=0;i<N;i++){
        cin >> cust[i].x;
            cin >> cust[i].y;
        }
     
     
        for(int i=0;i<N;i++) visit[i] = 0;
        result = 2000000000;
     
calc(N);
     
        cout << "#" << k << " " << result << endl;
 
    }
return 0;
 
}

2018년 4월 11일 수요일

[C++] Samsung SW Expert Academy 1226. [S/W 문제해결 기본] 7일차 - 미로1

/*

I faced segmentation fault at first, because I made map as int (int map[16][16])
but the input text was actually too long, so I changed it to 'string' type.




*/

#include <iostream>
#include <string>

using namespace std;

struct dot  {
int x;
    int y;
};
dot startP,endP;
string map[16];
int visit[16][16];
int dir[4][2] = {{0,1},{0,-1},{1,0},{-1,0}};
int find_flag;

void calc(int cur_x, int cur_y) {
if(visit[cur_y][cur_x] == 1) return;
    else {
    visit[cur_y][cur_x] = 1;
        if(map[cur_y][cur_x] == '1') return;
        else if (map[cur_y][cur_x] == '3') {
            find_flag = 1;
            return;
        }
       
        for(int i=0;i<4;i++) calc(cur_x+dir[i][0],cur_y+dir[i][1]);
    }
}


int main() {
for(int k=1;k<=10;k++) {
        int n;       
    cin >> n;
       
        for(int j=0;j<16;j++) {
            cin >> map[j];
        for(int i=0;i<16;i++) {
                visit[j][i] = 0;
                if(map[j][i] == '2') {
                startP.x = i;
                    startP.y = j;
                } else if (map[j][i] == '3') {
                endP.x = i;
                    endP.y = j;
                }
            }
        }
       
       
        find_flag = 0;
    calc(startP.x,startP.y);
       
        cout << "#" << k << " " << find_flag << endl;
   
    }
    return 0;
}

[C++] Samsung SW Expert Academy 1767. [SW Test 샘플문제] 프로세서 연결하기

/*
reference: https://kimth1130cr.blog.me/221144277234

My own code has the same logic, but use vector instead of array.
However it has errors, so I refered to the above link.


*/

#include <iostream>

using namespace std;

struct myCore {
int x, y;
};
myCore core[12];
int map[12][12];
int dir[4][2] = {{-1,0},{0,1},{1,0},{0,-1}};
int N,core_count;
int core_max, line_min;

int cirsum(int cmap[12][12]) {
int result = 0;
    for (int i=0; i<N; i++) {
        for (int j=0;j<N;j++) {
            if (cmap[i][j] == 2) result++;
        }
    }
    return result;
}

//cnum : 현재 선택한 코어번호.
//core_cur : 현재 연결 성공한 코어 개수
void solve(int cnum, int cmap[12][12], int core_cur) {
if (cnum >= core_count) {
        if(core_cur > core_max) {
            core_max = core_cur;
            line_min = cirsum(cmap);
        }
        else if( core_cur == core_max) {
            line_min = min(line_min,cirsum(cmap));
        }
        return;
    }
 
    for (int d = 0; d<4; d++) {
    int cur_x = core[cnum].x;
        int cur_y = core[cnum].y;
        bool connect = true;
        int cnt = 0;
     
        while(1) {
        cur_x += dir[d][0];
            cur_y += dir[d][1];
            if (cur_x <0 || cur_x>=N || cur_y<0 || cur_y>=N)
                break;
            if(cmap[cur_x][cur_y] != 0){
                connect = false;
                break;
            }
            cmap[cur_x][cur_y] = 2;
            cnt++;
        }
        if(connect) {
        solve(cnum+1,cmap,core_cur+1);
        }
     
        cur_x = core[cnum].x + dir[d][0];
        cur_y = core[cnum].y + dir[d][1];   
        for(int i = 0; i<cnt; i++, cur_x+=dir[d][0],cur_y+=dir[d][1])
            cmap[cur_x][cur_y] = 0;
    }
 
    solve(cnum+1,cmap,core_cur);
 
}

int main() {
int T;
 
    cin >> T;
    for(int k=1; k<=T; k++) {
    cin >> N;
     
        core_count = 0;
        core_max = -1;
        line_min = 200;
        for (int i=0;i<N;i++) {
        for (int j=0;j<N;j++) {
                int input;
            cin >> input;
                map[i][j] = input;
             
                if(input == 1) {
                    if (i == 0 || i == N - 1 || j == 0 || j == N - 1)    continue;
                    else {
                        core[core_count].x = i;
                        core[core_count].y = j;
                        core_count++;                   
                    }

                }
            }
        }
        solve(0,map,0);
        cout << "#" << k << " " <<line_min << endl;
    }

 
    return 0;
}

2018년 4월 10일 화요일

[C++] Samsung SW Expert Academy 1206. [S/W 문제해결 기본] 1일차 - View

/*
This problem looks difficult first, but actually it's very simple.

Just check if current index is higher than both two sides.


*/


#include <iostream>
#include <algorithm>
#include <vector>

using namespace std;
int myView(int n, vector<int> arr);

int main() {
    int n,input;
    vector<int> arr;
for(int i=0;i<10;i++) {
    cin >> n;
        for(int j=0;j<n;j++) {
            cin >> input;
            arr.push_back(input);
        }
        int result = myView(n,arr);
        cout << "#" << i+1 << " " << result << endl;
        arr.clear();
    }
    return 0;
}

int myView(int n, vector<int> arr) {
  int leftMax, rightMax;
    int differ;
    int result = 0;
for(int i=2;i<n-2;i++) {
leftMax = max(arr[i-2],arr[i-1]);
        rightMax = max(arr[i+1],arr[i+2]);
        differ = arr[i] - max(leftMax,rightMax);
        if(differ > 0) {
        result += differ;
            i += 2;
        }
    }
   
    return result;
}

2018년 3월 30일 금요일

[C++] HackerRank Strong Password

/*
https://www.hackerrank.com/challenges/strong-password/problem

You should use string functions like islower(),isupper(),isdigit() to solve.

There is an easy mistake to make when password shorter than 6. Sometimes the password will need to be longer than 6 to satisfy all criteria.

*/


#include <bits/stdc++.h>

using namespace std;

int minimumNumber(int n, string password) {
    int len = password.length();
    int num_low = 0, num_upp = 0, num_dig = 0, num_spe = 0;
    int count = 0;
   
    for(int i=0;i<len;i++) {
        if(islower(password[i])) {
            num_low++;
        } else if(isupper(password[i])) {
            num_upp++;
        } else if(isdigit(password[i])) {
            num_dig++;
        } else {
            num_spe++;
        }
    }
   
    if(num_low == 0) count++;
    if(num_upp == 0) count++;   
    if(num_dig == 0) count++;
    if(num_spe == 0) count++;
   
    return max(6-len,count);
}

int main() {
    int n;
    cin >> n;
    string password;
    cin >> password;
    int answer = minimumNumber(n, password);
    cout << answer << endl;
    return 0;
}

[C++] HackerRank CamelCase

/*
https://www.hackerrank.com/challenges/camelcase/problem


Use isupper() to check whether it's uppercase or not.


*/


#include <bits/stdc++.h>

using namespace std;

int camelcase(string s) {
    int count = 1;
    for(int i=0;i<s.length();i++) {
        if(isupper(s[i])) {
            count++;   
        }
    }
   
    return count;
}

int main() {
    string s;
    cin >> s;
    int result = camelcase(s);
    cout << result << endl;
    return 0;
}

[C++] HackerRank Super Reduced String

/*
https://www.hackerrank.com/challenges/reduced-string/problem

It's a good challenge to practise C++ String.

push_back(), pop_back(), empty()  are useful functions for this problem.


*/



#include <bits/stdc++.h>

using namespace std;

string super_reduced_string(string s){
    string result;
    int cur=0;
   
    for(int i=0;i<s.length();i++) {
        if(cur == 0) {
            result.push_back(s[i]);
            cur++;
        } else if(result[cur-1] == s[i]) {
            result.pop_back();
            cur--;
        } else {
            result.push_back(s[i]);
            cur++;
        }
    }
   
    if(result.empty()) {
        return "Empty String";
    }
   
    return result;
}

int main() {
    string s;
    cin >> s;
    string result = super_reduced_string(s);
    cout << result << endl;
    return 0;
}

[C++] Virus (바이러스) (BAEKJOON 2606)

/*

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

I used BFS strategy.

*/


#include <iostream>
#include <queue>

using namespace std;

int num, num_matrix;
int con[101][101];
int flags[101];

queue<int> que;

int bfs(int start);

int main() {
cin >> num;
cin >> num_matrix;

for (int i = 0; i<num_matrix; i++) {
int x, y;

cin >> x;
cin >> y;

con[x][y] = 1;
con[y][x] = 1;
}

cout << bfs(1) << endl;
return 0;
}

int bfs(int start) {
int count = 0;
int now;

que.push(start);
flags[1] = 1;

while (!que.empty()) {
now = que.front();
que.pop();

for (int i = 1; i <= num; i++) {
if ((con[now][i] == 1) && (flags[i] != 1)) {
que.push(i);
flags[i] = 1;
count++;
}
}
}

return count;
}

2017년 12월 23일 토요일

[C++] Topcoder FriendScore Solution

/*
I wrote this code assuming that "one way friendship" might exist in test cases.
but actually it's not in Topcoder's test cases.
*/


#include <string>
#include <vector>
#include <iostream>

using namespace std;

class FriendScore {
   
public:
    int highestScore(vector<string> friends){
        int max=0;
        int size = friends[0].length();
        for(int i=0;i<size;i++){
            int temp=0;
            vector<int> temp_arr(size,1);    // prevention of duplication
           
            for(int j=0;j<size;j++){
                if(i == j) continue;
                if(friends[i][j] == 'Y'){
               
                    if(friends[j][i] == 'Y'){       // checking whether it's one way friendship
                        if(temp_arr[j]){
                        temp++;
                        temp_arr[j]=0;                       
                        }

                    }

                    for(int k=0;k<size;k++){
                        if(k==i) continue;
                        if(k==j) continue;

                        if(friends[k][j] == 'Y'){
                            if(temp_arr[k]){
                                temp++;
                                temp_arr[k]=0;                       
                            }

                        }
                    }
                }   
            }
           
            cout << "temp=" << temp;
            if(temp > max) max = temp;
        }
       
        return max;
    }
};

[C++] HackerRank Day25 Solution

/*
https://www.hackerrank.com/challenges/30-running-time-and-complexity/problem

*/

#include <cmath>
#include <cstdio>
#include <vector>
#include <iostream>
#include <algorithm>
using namespace std;


int main() {
    int t;
   
    cin >> t;
   
    for(int i=0; i<t; i++){
        int flag = 1;
        int n;
       
        cin >> n;
       
        if(n <= 1){
            cout << "Not prime" << endl;
            continue;
        }
       
        if(n == 2){
            cout << "Prime" << endl;
            continue;
        }           
        else if((n&1) == 0){                //even number is not prime.
            cout << "Not prime" << endl;
            continue;
        }
       
        for(int i=3; i*i<=n;i++){         
            if(n%i == 0){
                flag = 0;
                break;
            }
        }
       
        if(flag) {
            cout << "Prime" << endl;
            continue;           
        } else {
            cout << "Not prime" << endl;
            continue;           
        }     
    }
     
    return 0;
}