문제점 :

A(Standard) Activity -> B(Single Task) Activity ->A(Standard)Activity Intent.FLAG_ACTIVITY_NEW_TASK | Intent.FLAG_ACTIVITY_CLEAR_TASK FLAG로 startActivity 할 때 앱 강제 종료되는 문제

해결 :

SingleTask 는 하나의 Activity만 생성되고 다중 인스턴스를 가질 수 없다. 그리고 이미 존재하는 경우 시스템은 새 인스턴스 대신 onNewIntent() 메서드를 호출하여 인텐트를 기존 인스턴스로 라우팅한다.

플로우가 수정 되면서 해당 이슈가 발생 되었는데 해결 방법은 생각 해본 건 대충 3가지로 정리

1.액티비티 외에 다른 곳에서 호출 될 일이 있을까 하는 부분. Intent.FLAG_ACTIVITY_NEW_TASK 을 제거 하고 사용해도 무관한지 찾아 보는 것이다. 회원가입을 하거나 했을 때 뒤로가기 시 그대로 Task에 남게 되는 이슈가 있다. 이런 경우가 없을 시에는 FLAG_ACTIVITY_NEW_TASK를 제거하면 해결 가능하다.

2.singleTask 액티비티에서만 Intent.FLAG_ACTIVITY_CLEAR_TASK 사용하고 NEW_TASK 는 사용하지 않는다.

    if (context instanceof Bactivity) {
            intent.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TASK);
        } else {
            intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK | Intent.FLAG_ACTIVITY_CLEAR_TASK);
        }

3.굳이 singleTask로 하지 않아도 된다면 Bactivity를 singleInstance로 변경 시키는 것도 고려할 수 있겠다.

현재 처리 된 부분에서 적합한 건 두번째 방법인것 같아 두번째 방법으로 적용 시켰다.

직사각형 나머지 한 좌표 구하기 !!

직사각형을 만드는 데 필요한 4개의 점 중 3개의 좌표가 주어질 때, 나머지 한 점의 좌표를 구하려고 합니다. 점 3개의 좌표가 들어있는 배열 v가 매개변수로 주어질 때, 직사각형을 만드는 데 필요한 나머지 한 점의 좌표를 return 하도록 solution 함수를 완성해주세요. 단, 직사각형의 각 변은 x축, y축에 평행하며, 반드시 직사각형을 만들 수 있는 경우만 입력으로 주어집니다.

v는 세 점의 좌표가 들어있는 2차원 배열입니다. v의 각 원소는 점의 좌표를 나타내며, 좌표는 [x축 좌표, y축 좌표] 순으로 주어집니다. 좌표값은 1 이상 10억 이하의 자연수입니다. 직사각형을 만드는 데 필요한 나머지 한 점의 좌표를 [x축 좌표, y축 좌표] 순으로 담아 return 해주세요.

입출력 예 설명 입출력 예 #1 세 점이 [1, 4], [3, 4], [3, 10] 위치에 있을 때, [1, 10]에 점이 위치하면 직사각형이 됩니다.

입출력 예 #2 세 점이 [1, 1], [2, 2], [1, 2] 위치에 있을 때, [2, 1]에 점이 위치하면 직사각형이 됩니다.

import java.util.HashMap;
class Solution {
    public int[] solution(int[][] v) {
         HashMap<Integer, Integer> xHashMap = new HashMap<>();
        HashMap<Integer, Integer> yHashMap = new HashMap<>();

        for (int i = 0; i < v.length; i++) {
            xHashMap.put(v[i][0], xHashMap.getOrDefault(v[i][0], 0)+1);
            yHashMap.put(v[i][1], yHashMap.getOrDefault(v[i][1], 0)+1);
        }
        int x = 0;
        int y = 0;
        for (Integer key : xHashMap.keySet()) {
            if (xHashMap.get(key) == 1) {
                x = key;
            }
        }

        for (Integer key : yHashMap.keySet()) {
            if (yHashMap.get(key) == 1) {
                y = key;
            }
        }
        return new int[]{x, y};
    }
}

==========================================================

앞뒤를 뒤집어도 똑같은 문자를 palindrome(팰린드롬)이라고 합니다. 예를 들어 12321은 팰린드롬이며, 21453은 팰린드롬이 아닙니다.

자연수 n이 매개변수로 주어질 때, n이 팰린드롬이면 true를, 아니면 false를 반환하도록 함수 solution 을 완성하세요.

제한사항 n은 231 - 1 보다 작거나 같은 자연수입니다.

입출력 예 n result 12321 true 21453 false 입출력 예 설명 입출력 예 #1 12321을 뒤집으면 12321이 되어 팰린드롬입니다.

입출력 예 #2 21453을 뒤집으면 35412가 되어 팰린드롬이 아닙니다.

class Solution { public boolean solution(int n) { int length = String.valueOf(n).length(); String[] values = String.valueOf(n).split(“”);

    if (length % 2 == 0) {
        int center = (length / 2);
        for (int i = 0; i < center; i++) {
            if (!values[i].equals(values[length -i - 1])) {
                return false;
            }
        }
        return true;
    } else {
        int center = (length / 2) + 1;
        for (int i = 0; i < center; i++) {
            if (!values[i].equals(values[length -i - 1])) {
                return false;
            }
        }
        return true;
    }
} }

출처 : https://programmers.co.kr/tryouts/3923/challenges/11576

쇠막대기 알고리즘

여러 개의 쇠막대기를 레이저로 절단하려고 합니다. 효율적인 작업을 위해서 쇠막대기를 아래에서 위로 겹쳐 놓고, 레이저를 위에서 수직으로 발사하여 쇠막대기들을 자릅니다. 쇠막대기와 레이저의 배치는 다음 조건을 만족합니다.

  • 쇠막대기는 자신보다 긴 쇠막대기 위에만 놓일 수 있습니다.
  • 쇠막대기를 다른 쇠막대기 위에 놓는 경우 완전히 포함되도록 놓되, 끝점은 겹치지 않도록 놓습니다.
  • 각 쇠막대기를 자르는 레이저는 적어도 하나 존재합니다.
  • 레이저는 어떤 쇠막대기의 양 끝점과도 겹치지 않습니다.

(a) 레이저는 여는 괄호와 닫는 괄호의 인접한 쌍 ‘()’으로 표현합니다. 또한 모든 ‘()’는 반드시 레이저를 표현합니다. (b) 쇠막대기의 왼쪽 끝은 여는 괄호 ‘(‘로, 오른쪽 끝은 닫힌 괄호 ‘)’로 표현됩니다.

위 예의 괄호 표현은 그림 위에 주어져 있습니다. 쇠막대기는 레이저에 의해 몇 개의 조각으로 잘리는데, 위 예에서 가장 위에 있는 두 개의 쇠막대기는 각각 3개와 2개의 조각으로 잘리고, 이와 같은 방식으로 주어진 쇠막대기들은 총 17개의 조각으로 잘립니다.

쇠막대기와 레이저의 배치를 표현한 문자열 arrangement가 매개변수로 주어질 때, 잘린 쇠막대기 조각의 총 개수를 return 하도록 solution 함수를 작성해주세요.

제한사항 arrangement의 길이는 최대 100,000입니다. arrangement의 여는 괄호와 닫는 괄호는 항상 쌍을 이룹니다.

import java.util.*;
class Solution {
    public int solution(String arrangement) {
      int answer = 0;
        int count = 0;
        String[] array = arrangement.split("");
        Stack<String> stack = new Stack<>();
        for (String character : array) {
            if (character.equals("(")) {
                stack.push(character);
                count++;
            } else {
                if (stack.peek().equals("(")) {//레이저
                    stack.push(character);
                    --count;
                    answer += count;
                } else {//막대 
                    answer += 1;
                    count--;
                }
            }
        }
        return answer;
    }
}

여기서 포인트는 stack 을 사용하면서 레이저와 막대끝을 구분하는 것 같다 ㅎㅎ 알고리즘하니깐 시간 잘 가네 ㅎㅎ

출처 : https://programmers.co.kr/learn/courses/30/lessons/42585

알고리즘 공부 시작!!!

문제 설명 수많은 마라톤 선수들이 마라톤에 참여하였습니다. 단 한 명의 선수를 제외하고는 모든 선수가 마라톤을 완주하였습니다.

마라톤에 참여한 선수들의 이름이 담긴 배열 participant와 완주한 선수들의 이름이 담긴 배열 completion이 주어질 때, 완주하지 못한 선수의 이름을 return 하도록 solution 함수를 작성해주세요.

제한사항 마라톤 경기에 참여한 선수의 수는 1명 이상 100,000명 이하입니다. completion의 길이는 participant의 길이보다 1 작습니다. 참가자의 이름은 1개 이상 20개 이하의 알파벳 소문자로 이루어져 있습니다. 참가자 중에는 동명이인이 있을 수 있습니다.

입출력 예 설명 예제 #1 leo는 참여자 명단에는 있지만, 완주자 명단에는 없기 때문에 완주하지 못했습니다.

예제 #2 vinko는 참여자 명단에는 있지만, 완주자 명단에는 없기 때문에 완주하지 못했습니다.

예제 #3 mislav는 참여자 명단에는 두 명이 있지만, 완주자 명단에는 한 명밖에 없기 때문에 한명은 완주하지 못했습니다.

   class Solution {
    public String solution(String[] participant, String[] completion) {
        Arrays.sort(participant);
        Arrays.sort(completion);

        for (int i = 0; i < completion.length; i++) {
            if(!participant[i].equals(completion[i])){
                return participant[i];
            }
        }
    }
}

처음 문제 풀었을 때 정확성은 100 인데 효율성이 꽝이라 고민을 많이 하게 되었다.. O(N) 으로 풀어야 하는 문제였다. 해시맵 문제 였는데 맵을 사용안하고 품.. 이래도 되는건가 우선 정확성과 효율성은 잘 통과 됨 두 배열을 sort 하고 참여자와 완주자가 다른 순간 값을 리턴시켜주면 되는 문제.

출처 : https://programmers.co.kr/learn/courses/30/lessons/42576?language=java

Rx 공부한지 별로 되진않았지만 확실히 매력있는 친구다.ㅎㅎ

Single 에 대해 궁금증이 생겼다.

Single은 onSuccess 나 onError 중 하나가 불리게 되면 dispose 가 된다. 하지만 오픈 소스들을 보면 CompositeDisposible 에 차곡차곡 쌓고 dispose 시켜준다. 이렇게 되면 중복으로 처리하는게 아닌가 ?? 왜 그러지 라는생각이 듬..

이유는 구독중 onSuccess 또는 onError 가 불리기 전에 이슈가 발생할 우려가 높기 때문에 추가해주고 dispose시켜주는것 같음.ㅎㅎ