일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 |
Tags
- 2차원배열
- css
- java
- springboot
- springSecurity
- security
- Linux
- 싱글톤
- programmers
- 로그인
- 스프링 부트
- 반복문
- StyleSheet
- gradle
- Spring boot
- 시큐리티로그인
- 시큐리티
- 프로그래머스
- codingtest
- 리눅스
- 목록
- input태그
- html
- javascript
- JAVA11
- 코딩테스트
- 소스트리
- 시큐리티 로그인
- 시큐리티 로그아웃
- sql
Archives
- Today
- Total
JAVAIARY
프로그래머스) 둘만의 암호 본문
문제:https://school.programmers.co.kr/learn/courses/30/lessons/155652
프로그래머스
코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.
programmers.co.kr
class Solution {
public String solution(String s, String skip, int index) {
String answer = "";
for (int i = 0; i < s.length(); i++) {
char target = s.charAt(i); // i번째 문자
int idxCnt = 0;
// idxCnt 가 index 와 같지 않고, 현재 target값이 skip에 포함되면 재실행
while (idxCnt != index || skip.contains(Character.toString(target)) ) {
/*
* skip에 target값이 들어있는지 확인
* skip에 있는 문자가 아니면 idxCnt와 target 모두 증가
* skip에 있는 문자이면 idxCnt를 건너뛰고 target만 증가
*/
if (!skip.contains(Character.toString(target))) {
idxCnt++;
target++;
}else target++;
target = target>122? target-=26: target;
}
answer = answer.concat(Character.toString(target));
}
return answer;
}
}
- 처음에 ascii 코드로 인덱스만큼 더해준 다음, 처음 코드와 코드+인덱스 값 사이에
스킵값이 있으면 스킵값의 개수만큼 더해주는 식으로 풀려고 했다. - 이렇게 했을 경우 인덱스 마지막에 연속된 스킵값이 있을 경우 그 연속값을 건너뛰지 못해 반례가 생김
- 그래서 스킵값일 경우 인덱스카운트를 증가시키지 않고
- 인덱스카운트가 인덱스에 도달할 때 까지 반복시키는 방법으로 진행
public static void main(String[] args) {
String s = "ybcde";
String skip = "az";
int index = 1;
// String s = "zzzzz";
// String skip = "bcdefghijk";
// int index = 20;
System.out.println(solution(s, skip, index));
}
다른풀이 생각해 본 것
- 알파벳 배열에서 스킵값을 뺀 새로운 배열 생성
- indexOf로 찾는 알파벳의 인덱스 n을 구해서
(n +index)% 알파벳 배열 길이
계산을 통해 나오는 나머지가 찾는 알파벳의 인덱스가 될 것
public static String solution(String s, String skip, int index) {
String answer = "";
// skip에 포함된 문자가 빠진 알파벳 배열 생성
ArrayList<Character> alphabet = new ArrayList<>();
for (int j = 0; j < 26; j++) {
if (!skip.contains(Character.toString(j + 97))) {
alphabet.add((char) (j + 97));
}
}
System.out.println(alphabet);
for (int i = 0; i < s.length(); i++) {
int tgtIdx = alphabet.indexOf(s.charAt(i)); // s의 i번째 문자의 알파벳 배열에서의 인덱스값
//(tgtIdx+index) % alphabet.size() 로 변환된 문자열의 인덱스 값을 얻음
char converted = (char)alphabet.get((tgtIdx+index) % alphabet.size());
answer = answer.concat(Character.toString(converted));
}
return answer;
}
- 첫 번째 풀이가 먼저 떠올라서 아득바득 풀어보려고 애썼던 거였는데
두 번째 풀이가 더 간단하고 처리 속도도 빠름!
'examplePractice' 카테고리의 다른 글
프로그래머스) 연속된 수의 합 (0) | 2023.02.28 |
---|---|
프로그래머스) 구명보트 (0) | 2023.02.26 |
프로그래머스) 종이자르기 (0) | 2023.02.24 |
프로그래머스) 콜라츠 추측 (0) | 2023.02.24 |
프로그래머스 ) 분수의 덧셈 (0) | 2023.02.22 |