codility - CyclicRotation 정답 및 해설
난이도 ★☆☆☆☆
문제 요약
A배열을 K번만큼 오른쪽으로 shift하면 됩니다 |
힌트
K번만큼 실제로 일일이 이동하지 말고, 최종 위치로 한번에 일괄 이동합니다 |
이하는 코드입니다.
1 2 3 4 5 6 7 8 9 10 11 | public int[] solution(int[] A, int K) { int[] ret = new int[A.length]; for (int i = 0; i < A.length; i++) { int idx = (i + K) % A.length; ret[idx] = A[i]; } return ret; } | cs |
'뿌리튼튼 CS > Algorithm' 카테고리의 다른 글
| codility - FrogJmp 정답 및 해설 (0) | 2017.06.06 |
|---|---|
| codility - PermMissingElem 정답 및 해설 (0) | 2017.06.06 |
| codility - OddOccurrencesInArray 정답 및 해설 (0) | 2017.06.06 |
| codility - BinaryGap 정답 및 해설 (0) | 2017.06.06 |
| Conversions(CONVERT) 정답 코드 (0) | 2015.10.09 |
codility - OddOccurrencesInArray 정답 및 해설
난이도 ★☆☆☆☆
문제 요약
총 홀수번 등장하는 숫자가 딱 1종류 있는데 그걸 리턴하면 됩니다 |
힌트
자료구조 문제이며, 등장 횟수 측정의 부하를 줄이는 것이 핵심입니다 (Hash 사용을 추천) |
이하는 코드입니다.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 | public int solution(int[] A) { Map<Integer, Integer> countMap = new HashMap<>(); for (int i = 0; i < A.length; i++) { increaseCount(countMap, A[i]); } for (Integer key : countMap.keySet()) { if (countMap.get(key) % 2 != 0) { return key; } } return -1; } private void increaseCount(Map<Integer, Integer> countMap, int targetNum) { Integer target = countMap.get(targetNum); if (target == null) { countMap.put(targetNum, 1); } else { countMap.put(targetNum, target + 1); } } | cs |
'뿌리튼튼 CS > Algorithm' 카테고리의 다른 글
| codility - PermMissingElem 정답 및 해설 (0) | 2017.06.06 |
|---|---|
| codility - CyclicRotation 정답 및 해설 (0) | 2017.06.06 |
| codility - BinaryGap 정답 및 해설 (0) | 2017.06.06 |
| Conversions(CONVERT) 정답 코드 (0) | 2015.10.09 |
| Endians(ENDIANS) 정답 코드 (0) | 2015.10.09 |
codility - BinaryGap 정답 및 해설
난이도 ★☆☆☆☆
힌트
그냥 빼먹는 것 없이 반복문을 잘 돌면 됩니다 |
이하는 코드입니다.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 | public int solution(int N) { String biStr = Integer.toBinaryString(N); int firstOneIndex = getNextOneIndex(biStr, 0); if (firstOneIndex < 0) { return 0; } int maxGap = 0; while (true) { int nextOneIndex = getNextOneIndex(biStr, firstOneIndex + 1); if (nextOneIndex < 0) { break; } int gap = nextOneIndex - firstOneIndex - 1; if (gap > maxGap) { maxGap = gap; } firstOneIndex = nextOneIndex; } return maxGap; } private int getNextOneIndex(String biStr, int startIndex) { int nextOneIndex = -1; for (int i = startIndex; i < biStr.length(); i++) { char c = biStr.charAt(i); if (c == '1') { nextOneIndex = i; break; } } return nextOneIndex; } | cs |
'뿌리튼튼 CS > Algorithm' 카테고리의 다른 글
| codility - CyclicRotation 정답 및 해설 (0) | 2017.06.06 |
|---|---|
| codility - OddOccurrencesInArray 정답 및 해설 (0) | 2017.06.06 |
| Conversions(CONVERT) 정답 코드 (0) | 2015.10.09 |
| Endians(ENDIANS) 정답 코드 (0) | 2015.10.09 |
| Mispelling(MISPELL) 정답 코드 (0) | 2015.04.10 |
[보안] 안전한 암호화 기법 (Secure Salted Password Hashing)
비밀번호 저장시
1. 충분히 긴 길이의 랜덤 salt 를 생성한다. (java.security.SecureRandom 사용할 것)
2. 생성된 salt 에 타깃 pw 를 붙이고 해싱한다.
3. salt 와 결과 hash 를 둘다 유저 테이블에 있는 각각의 컬럼에 나란히 저장한다.
비밀번호 검증시
1. 유저 테이블에서 해당 유저의 salt 와 결과 hash 를 가져온다.
2. salt 뒤에 검증할 pw 를 붙이고 같은 해싱 기법으로 해싱한다.
3. hash 결과를 비교하여 일치하면 true, 아니면 false
주의
1. salt 는 유저마다, 패스워드마다 고유해야 한다. (The salt needs to be unique per-user per-password.)
2. 한번이라도 사용된 salt 는 절대 재사용하면 안된다.
3. salt 의 길이는 충분히 길어야 한다. 결과 hash 와 같은 길이로 하는 것이 가장 좋다.
4. salt 값은 유저 테이블에 결과 hash 와 나란히 저장되어야 한다.
출처
https://crackstation.net/hashing-security.htm
