본문 바로가기

카테고리 없음

2주 3일차 알고리즘 문제풀이(개인)

1. 같은 숫자는 싫어

https://programmers.co.kr/learn/courses/30/lessons/12906

[기본 상태]

import java.util.*;

public class Solution {
    public int[] solution(int []arr) {
        int[] answer = {};
        
        // [실행] 버튼을 누르면 출력 값을 볼 수 있습니다.
        System.out.println("Hello Java");

        return answer;
    }
}

[풀이에 필요한 조건]

입력받은 arr 비교를 위한 clone Array를 생성. 

int[] clone = arr.clone();

 

비교 후 결과값을 임시저장할 int형 가변 리스트 생성.

ArrayList<Integer> integers = new ArrayList<>();

 

비교를 위한 for 문 작성. 

for문은 arr 길이보다 1 작게 ( arr[i] vs arr[i+1] 을 비교하기 위해, 마지막에 arr 길이값을 넘어 오류가 날 수 있음. )

 

clone에 저장된 값을 다음 값과 비교하여 값이 일치하지 않을 때, Arraylist.add(data)를 통해 list에 값을 넣어줌.

ex) {1,1,2} > arr[0]=1, arr[1]=1 은 비교값이 일치하여 특별한 조작 없이 다음으로 넘어감.

             > arr[1]=1, arr[2]=2 에서 비교값이 일치하지 않아 arr[1]의 값을 list(0) 에 저장.

 

 

arr 의 마지막 2개의 데이터를 처리하기 위한 조건을 추가함.

 

{1,1,3,4,4} = {1,3,4} arr[3]=4, arr[4]=4 에서 일치하면 arr[3]만 저장

{1,1,3,4,5} = {1,3,4,5} arr[3]=4, arr[4]=5 에서 상위 조건문을 통해 arr[3]은 저장되었으나, arr[4]를 저장하지 못함.

 

위 예시와 같이 마지막 2개의 데이터가 동일하다면 1개만 출력되고, 다르다면 2개의 데이터가 저장되어야함.

for문이 arr.length-2 만큼 진행되면, arr[arr.length-2], arr[arr.length-1]를 비교하여

조건에 맞춰 arr[arr.length-1] 데이터를 저장하도록 함.

 

answer를 ArrayList 의 길이만큼의 배열로 지정하고,

ArrayList.get() 으로 데이터 값을 하나씩 부여함.

 

[참고]

Arraylist :

https://psychoria.tistory.com/765

Array Clone() : 

https://coding-factory.tistory.com/548

[해답]
import java.util.*;
import java.util.ArrayList;

class Solution {
    public int[] solution(int []arr) {
        int[] clone = arr.clone();
        ArrayList<Integer> integers = new ArrayList<>();

        loop:
        for (int i = 0; i < arr.length - 1; i++) {
            if (clone[i] != clone[i + 1]) {
                integers.add(clone[i]);
            }
            if (i == arr.length - 2) {
                if (clone[i] != clone[i + 1]) {
                    integers.add(clone[i+1]);
                    break loop;
                } else {
                    integers.add(clone[i]);
                    break loop;
                }
            }
        }
        int[] answer = new int[integers.size()];

        for (int i = 0; i < integers.size(); i++) {
            answer[i] = integers.get(i);
        }
        return answer;
    }
}

더보기

import java.util.*;
import java.util.ArrayList;

class Solution {
public int[] solution(int []arr) {
int[] clone = arr.clone();
ArrayList<Integer> integers = new ArrayList<>();
int count = 0;

loop:
for (int i = 0; i < arr.length - 1; i++) {
if (clone[i] != clone[i + 1]) {
integers.add(clone[i]);
System.out.print("비교대상 : " + clone[i] + "vs" + clone[i + 1] + " / " + "count = " + count + " / " + "추가된 integer[" + count + "] = " + integers.get(count) + "\n");
count += 1;
}

// else {
// System.out.print("비교대상 : "+clone[i]+"vs"+clone[i+1]+" / "+ "count = "+count + "\n");
// }

if (i == arr.length - 2) {
if (clone[i] != clone[i + 1]) {
integers.add(clone[i+1]);
break loop;
} else {
integers.add(clone[i]);
break loop;
}
}

// System.out.print("{");
// for(int i=0;i<integers.size();i++){
// System.out.print(integers.get(i));
// if(i< integers.size()-1){
// System.out.print(",");
// }
// }
// System.out.print("}\n");


}
int[] answer = new int[integers.size()];

for (int i = 0; i < integers.size(); i++) {
answer[i] = integers.get(i);
}
return answer;
}
}

public class Main {
public static void main(String[] args) {
Solution sol = new Solution();

int[] arr = {1,1,5,1,1,6,6,8,4,6,8,1,9,9,8};

int[] result = sol.solution(arr);

System.out.print("{");
for(int i=0;i<result.length;i++){
System.out.print(result[i]);
if(i<result.length-1){
System.out.print(",");
}
}
System.out.print("}\n");

}
}

더보기

import java.util.*;

public class Solution {
public int[] solution(int []arr) {
ArrayList<Integer> tempList = new ArrayList<Integer>();
int preNum = 10;
for(int num : arr) {
if(preNum != num)
tempList.add(num);
preNum = num;
}
int[] answer = new int[tempList.size()];
for(int i=0; i<answer.length; i++) {
answer[i] = tempList.get(i).intValue();
}
return answer;
}
}

2. 문자열 내 마음대로 정렬하기

https://programmers.co.kr/learn/courses/30/lessons/12915?language=java 

[기본 상태]

class Solution {
    public String[] solution(String[] strings, int n) {
        String[] answer = {};
        return answer;
    }
}

[풀이에 필요한 조건]

입력받은 문자열에서 뽑아낼 데이터를 담아낼 ArrayList 선언.

 

ArrayList 에 입력값 문자열 특정 위치의 문자를 추출하고, 문자열을 뒤에 붙여 만든 새로운 데이터를 List에 저장.

 

ArrayList를 sort 하여 오름차순으로 정렬.

 

list에 저장된 i번째 값을 2번째 문자부터 끝까지( substring(1,list.get(i).length()) ) answer 배열에 하나씩 저장.

 

 

[참고]

ArrayList sort :

https://offbyone.tistory.com/154

 

ArrayList substring : 

https://aries574.tistory.com/9

 

[해답]

import java.util.*;

class Solution {
public String[] solution(String[] strings, int n) {
String[] answer = {};
ArrayList<String> list = new ArrayList<>();

for (int i = 0; i < strings.length; i++) {
list.add(strings[i].charAt(n) + strings[i]);
}

Collections.sort(list);

answer = new String[list.size()];

for (int i = 0; i < list.size(); i++) {
answer[i] = list.get(i).substring(1, list.get(i).length());
}

return answer;
}
}

더보기
import java.util.*;

class Solution {
public String[] solution(String[] strings, int n) {
String[] answer = {};
ArrayList<String> list = new ArrayList<>();

for (int i = 0; i < strings.length; i++) {
// System.out.println("받은 str n번째 문자 : "+strings[i].charAt(n)+" str의 데이터 : "+ strings[i]);
list.add(strings[i].charAt(n) + strings[i]);
}

// ArrayList 오름차순 배열
Collections.sort(list);

answer = new String[list.size()];

for (int i = 0; i < list.size(); i++) {
// System.out.println("ArrayList list 에 저장된 정보 " + list.get(i));
// 배열 순서 변경을 위해 앞에 추가된 n번째 문자 + 기존 정보
// substring(i,j) i부터 j까지의 글자 리턴, 아래는 맨 앞글자를 잘라내고 글자의 끝까지 반환
answer[i] = list.get(i).substring(1, list.get(i).length());

// System.out.println("i = "+i+"일 때, answer["+i+"] = "+ answer[i]);
}

return answer;
}
}

public class Main {
public static void main(String[] args) {
Solution sol = new Solution();

String[] str = {"abce", "abcd", "cdx"};
int n = 2;

String[] result = sol.solution(str, n);

System.out.print("{");
for(int i=0;i<result.length;i++){
System.out.print(result[i]);
if(i<result.length-1){
System.out.print(",");
}
}
System.out.print("}\n");

}
}

 

 

3. 시저 암호

https://programmers.co.kr/learn/courses/30/lessons/12926

[기본 상태]

class Solution {
    public String solution(String s, int n) {
        String answer = "";
        return answer;
    }
}

[풀이에 필요한 조건]

Character 형태의 숫자를 받아왔을 때, 결과값으로 리턴되는 ASCII 코드에 대해 알아야 함.

([참고]에 아스키 코드 테이블과 간단한 예시 작성)

 

입력받은 String 값을 Character 값으로 저장할 ArrayList chr 을 선언.

ArrayList<Character> chr = new ArrayList<>();

 

for 문에서 List chr 에 값을 저장.

chr.add(s.charAt(i));

 

Character 값을 계산해줄 Integer 형태의 tmp 선언.

int tmp=0;

 

입력 받은 값 중 " " (띄어쓰기, SP, 공백) 칸인 경우, 연산 없이 tmp=32 고정.

 

이 외 입력에 대해 조건부 연산을 진행.

 

64<tmp<91 로 시작하여, tmp>91이 되는 경우(대문자)와

97<tmp<122 로 시작하여, tmp>123이 되는 경우(소문자)가 별개로 존재.

 

조건 a 와 b를 동시에 만족해야 True가 되는 &&(AND) 를 사용하여 조건에 맞춰 연산 진행.

넘어가는 숫자에서 26을 빼주어, 알파벳이 매칭된 값으로 변경.

 

if ((int)chr.get(i)<123 && tmp > 122) {
tmp = (int) chr.get(i) + n - 26;
}
else if ((int)chr.get(i)<91 && tmp > 90) {
tmp = (int) chr.get(i) + n - 26;
}

 

연산이 완료된 값을 return 하기 전의 String 에 넣어주기 위해 chr_real에 Character형태의 tmp값을 저장.

chr_real.add((char) tmp);

 

chr_real의 size 만큼 반복하여 각 chr_real 값을 String answer에 하나씩 저장.

answer += chr_real.get(j);

 

[참고]

ASCII table

https://shaeod.tistory.com/228

[해답]

import java.util.*;

class Solution {
public String solution(String s, int n) {
String answer = "";

ArrayList<Character> chr = new ArrayList<>();

int tmp=0;

 

ArrayList<Character> chr_real = new ArrayList<>();


if (1<=n && n<=25) {
for (int i = 0; i < s.length(); i++) {
chr.add(s.charAt(i));

if ((int) chr.get(i) == 32) {
tmp = (int) chr.get(i);
}
else {
tmp = (int) chr.get(i) + n;

if ((int)chr.get(i)<123 && tmp > 122) {
tmp = (int) chr.get(i) + n - 26;
}
else if ((int)chr.get(i)<91 && tmp > 90) {
tmp = (int) chr.get(i) + n - 26;
}
}
chr_real.add((char) tmp);
}
}

for(int j=0;j<chr_real.size();j++){
answer += chr_real.get(j);
}
System.out.println(answer);

return answer;
}
}

더보기
import java.util.*;

class Solution {
public String solution(String s, int n) {
String answer = "";
int tmp=0;

ArrayList<Character> chr = new ArrayList<>();
ArrayList<Character> chr_real = new ArrayList<>();

if (1<=n && n<=25) {
for (int i = 0; i < s.length(); i++) {
System.out.print("넣을 값 =" + s.charAt(i));
chr.add(s.charAt(i));
System.out.println(" 입력된 값 =" + chr.get(i));

if ((int) chr.get(i) == 32) {
tmp = (int) chr.get(i);
}
else {
tmp = (int) chr.get(i) + n;

if ((int)chr.get(i)<123 && tmp > 122) {
tmp = (int) chr.get(i) + n - 26;
}
else if ((int)chr.get(i)<91 && tmp > 90) {
tmp = (int) chr.get(i) + n - 26;
}
}
System.out.println("tmp 확인 : " + tmp);
chr_real.add((char) tmp);
System.out.println("chr_real 확인 : " + chr_real);
}
}

for(int j=0;j<chr_real.size();j++){
System.out.println("값확인 : " + chr_real.get(j));
answer += chr_real.get(j);
}
System.out.println(answer);

return answer;
}
}

public class Main {
public static void main(String[] args) {
Solution sol = new Solution();

String s = "a B z";
int n = 4;

String result = sol.solution(s,n);

System.out.println("결과값 : " + result);


}
}