삼총사
💡 삼총사
문제 설명
한국중학교에 다니는 학생들은 각자 정수 번호를 갖고 있습니다. 이 학교 학생 3명의 정수 번호를 더했을 때 0이 되면 3명의 학생은 삼총사라고 합니다. 예를 들어, 5명의 학생이 있고, 각각의 정수 번호가 순서대로 -2, 3, 0, 2, -5일 때, 첫 번째, 세 번째, 네 번째 학생의 정수 번호를 더하면 0이므로 세 학생은 삼총사입니다. 또한, 두 번째, 네 번째, 다섯 번째 학생의 정수 번호를 더해도 0이므로 세 학생도 삼총사입니다. 따라서 이 경우 한국중학교에서는 두 가지 방법으로 삼총사를 만들 수 있습니다.
한국중학교 학생들의 번호를 나타내는 정수 배열 number가 매개변수로 주어질 때, 학생들 중 삼총사를 만들 수 있는 방법의 수를 return 하도록 solution 함수를 완성하세요.
제한사항
- 3 ≤ number의 길이 ≤ 13
- 1,000 ≤ number의 각 원소 ≤ 1,000
- 서로 다른 학생의 정수 번호가 같을 수 있습니다.
입출력 예
number result
[-2, 3, 0, 2, -5] | 2 |
[-3, -2, -1, 0, 1, 2, 3] | 5 |
[-1, 1, -1, 1] | 0 |
다른 코드
class Solution {
public int solution(int[] number) {
int answer = 0;
for(int i=0; i<number.length;i++){
for(int j=i+1;j<number.length;j++){
for(int k=j+1; k<number.length;k++){
if(number[i] + number[j] + number[k] == 0) {
answer++;
}
}
}
}
return answer;
}
}
i , j , k 로 각각 1,2,3 번째 수를 구하여 더한다. 이 중에 0이 되는 값이 있다면 anwer를 올린다.
시저암호
💡 시저 암호
문제 설명
어떤 문장의 각 알파벳을 일정한 거리만큼 밀어서 다른 알파벳으로 바꾸는 암호화 방식을 시저 암호라고 합니다. 예를 들어 "AB"는 1만큼 밀면 "BC"가 되고, 3만큼 밀면 "DE"가 됩니다. "z"는 1만큼 밀면 "a"가 됩니다. 문자열 s와 거리 n을 입력받아 s를 n만큼 민 암호문을 만드는 함수, solution을 완성해 보세요.
제한 조건
- 공백은 아무리 밀어도 공백입니다.
- s는 알파벳 소문자, 대문자, 공백으로만 이루어져 있습니다.
- s의 길이는 8000이하입니다.
- n은 1 이상, 25이하인 자연수입니다.
입출력 예
s n result
"AB" | 1 | "BC" |
"z" | 1 | "a" |
"a B z" | 4 | "e F d" |
나의코드1
이 코드는 ‘A’와 ‘z’의 사잇값들을 전부 포함하므로 오류가 생긴다.
따라서 대소문자를 구분하여 나눈다.
class Solution {
public String solution(String s, int n) {
String answer = "";
char[] chars = s.toCharArray();
for(int i=0; i<chars.length;i++){
if('A'<= chars[i]&&chars[i] <='z'){
int charToInt = chars[i]+n;
int i1 = charToInt - 26;
if(charToInt>(int)'Z'&&charToInt<'a'){
chars[i] = (char) i1;
} else if (charToInt>'z'){
chars[i] = (char) i1;
} else{
chars[i] = (char) charToInt;
}
}
}
answer = new String(chars);
return answer;
}
}
테스트 케이스는 통과하나, 채점의 케이스에서는 몇개가 실패가 나온다.
나의코드2
class Solution {
public String solution(String s, int n) {
String answer = "";
char[] chars = s.toCharArray();
for(int i=0; i<chars.length;i++){
int charToInt = chars[i]+n;
int i1 = charToInt - 26;
if('A'<= chars[i]&&'Z'>=chars[i]) {
if (charToInt > 'Z') {
chars[i] = (char) i1;
}else {
chars[i] = (char) charToInt;
}
}
if('a'<=chars[i]&&'z'>=chars[i]){
if (charToInt>'z'){
chars[i] = (char) i1;
}else{
chars[i] = (char) charToInt;
}
}
}
answer = new String(chars);
return answer;
}
}
다른코드
originalChar가 ‘A’일때 아스키로는 65 이므로, (65-65+4) %26 +65 =69 이므로 D가 나온다.
originalChar-’A’를 하는것은 ‘A’부터 얼마만큼 큰 단어인지 확인하는 것이고, 이에 n을 더해 원하는 값을 만든다.
알파벳은 총 26자이므로, 26으로 나누었을때, 나머지가 있다면, 이는 ‘Z’보다 큰 값이다.
현재까지 나온 값((originalChar - 'A' + n) % 26))은 +n 값과 originalChar의 차이값이다.
그러므로 ‘A’에 차잇값을 더하여 원하는 값을 구한다.
class Solution {
public String solution(String s, int n) {
StringBuilder result = new StringBuilder();
for (char originalChar : s.toCharArray()) {
if (Character.isUpperCase(originalChar)) {
char shiftedChar = (char) ((originalChar - 'A' + n) % 26 + 'A');
result.append(shiftedChar);
} else if (Character.isLowerCase(originalChar)) {
char shiftedChar = (char) ((originalChar - 'a' + n) % 26 + 'a');
result.append(shiftedChar);
} else {
result.append(originalChar);
}
}
return result.toString();
}
}
오늘의 학습 :
- 모든 경우의 수에서 n만큼의 길이의 수를 구하려면 for문을 n번 반복하면 된다.
- 값이 중복되지 않도록 각각의 변수에 +1을 해준다.
- 대소문자 구분할때는 Character.isUpperCase(),LowerCase()를 사용하자