๋ณธ๋ฌธ ๋ฐ”๋กœ๊ฐ€๊ธฐ
๐Ÿ”ฅ PS(Problem Solving) ๐Ÿ”ฅ/goorm

[๊ตฌ๋ฆ„LEVEL] 1๋“ฑ๊ณผ 2๋“ฑ

by dar0m! 2020. 3. 16.
๋‚œ์ด๋„ ์ •๋‹ต๋ฅ 
โ˜…โ˜… 65.2%

 

 

๊ตฌ๋ฆ„LEVEL

๋‚œ์ด๋„๋ณ„ ๋‹ค์–‘ํ•œ ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•จ์œผ๋กœ์จ SW ์—ญ๋Ÿ‰์„ ํ–ฅ์ƒ์‹œํ‚ฌ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

level.goorm.io

๋ฌธ์ œ

์–ด๋Š ํ•œ ์—ฐ๊ตฌ๊ฒฐ๊ณผ์— ์˜ํ•˜๋ฉด ์–ด๋Š ๋Œ€ํšŒ์—์„œ 1๋“ฑ์„ ํ•œ ์‚ฌ๋žŒ์€ ๊ทธ ๋‹ค์Œ ๋Œ€ํšŒ์—์„  2๋“ฑ์„ ํ•  ํ™•๋ฅ ์ด ๋†’๊ณ , 2๋“ฑ์„ ํ•œ ์‚ฌ๋žŒ์€ ๊ทธ ๋‹ค์Œ ๋Œ€ํšŒ์—์„œ 1๋“ฑ์„ ํ•  ํ™•๋ฅ ์ด ๋†’๋‹ค๊ณ  ํ•ฉ๋‹ˆ๋‹ค.

๋“ฑ์ˆ˜๋ฅผ ๋‚˜์—ดํ•œ ์ด ๋ฌธ์ž์—ด์—์„œ "12"์™€ "21"์˜ ๋ถ€๋ถ„ ๋ฌธ์ž์—ด์ด ๊ฐ๊ฐ 1๋ฒˆ ์ด์ƒ ์กด์žฌํ•˜๋ฉด ์ด ์—ฐ๊ตฌ๊ฒฐ๊ณผ๋Š” ๋งž๋‹ค๊ณ  ํŒ๋‹จํ•˜๊ณ , ๊ทธ๋ ‡์ง€ ์•Š๋‹ค๋ฉด ํ‹€๋ฆฌ๋‹ค๊ณ  ํŒ๋‹จํ•ฉ๋‹ˆ๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด, "2112"์˜ ๊ฒฝ์šฐ 21๊ณผ 12๋ฅผ ๊ฐ๊ฐ ์ฐพ์„ ์ˆ˜ ์žˆ์ง€๋งŒ, "212"์˜ ๊ฒฝ์šฐ 21์„ ์ฐพ์œผ๋ฉด 12๋ฅผ ๋ชป ์ฐพ๊ณ , 12๋ฅผ ์ฐพ์œผ๋ฉด 21์„ ์ฐพ์ง€ ๋ชปํ•ฉ๋‹ˆ๋‹ค.

์—ฐ๊ตฌ๊ฒฐ๊ณผ๊ฐ€ ์ฐธ์ด๋ฉด Yes, ๊ฑฐ์ง“์ด๋ฉด No๋ฅผ ์ถœ๋ ฅํ•ฉ๋‹ˆ๋‹ค.

 

ํ•ด๊ฒฐ

key point, string์„ ์ž˜ ๋‹ค๋ฃฐ ์ˆ˜ ์žˆ์–ด์•ผ ํ•œ๋‹ค.
  1. 12์„ ๋จผ์ € ์ฐพ์•˜์„ ๋•Œ ๊ฒน์น˜์ง€ ์•Š๋Š” ๋ฒ”์œ„์—์„œ 21์„ ์ฐพ์œผ๋ฉด return 1 → Yes ์ถœ๋ ฅ
  2. 21์„ ๋จผ์ € ์ฐพ์•˜์„ ๋•Œ ๊ฒน์น˜์ง€ ์•Š๋Š” ๋ฒ”์œ„์—์„œ 12์„ ์ฐพ์œผ๋ฉด return 1 → Yes ์ถœ๋ ฅ
  3. 1, 2๋ฒˆ ๋ชจ๋‘ ํ•ด๋‹น๋˜์ง€ ์•Š๋‹ค๋ฉด No ์ถœ๋ ฅ
  • func() ํ•จ์ˆ˜์— ๋จผ์ € ์ฐพ์„ ์ˆซ์ž๋ฅผ ๋„ฃ๋Š”๋‹ค.
  • ์˜ˆ์‹œ๋กœ 12๋ฅผ ๋„ฃ์—ˆ๋‹ค๋ฉด, findnum์€ 12๊ฐ€ ๋˜๊ณ  findnum2๋Š” 21์ด ๋œ๋‹ค.
  • string.find() ํ•จ์ˆ˜๋Š” ์ธ์ž๋กœ ๋“ค์–ด์˜จ ๋ฌธ์ž๊ฐ€ string์•ˆ์— ์กด์žฌํ•˜๋ฉด ๊ฐ€์žฅ ๋จผ์ € ์ฐพ์€ ๋ฌธ์ž์—ด์˜ ์‹œ์ž‘ ์œ„์น˜๋ฅผ ๋ฐ˜ํ™˜ํ•˜๊ณ  ์—†๋‹ค๋ฉด string::npos๋ฅผ ๋ฐ˜ํ™˜ํ•œ๋‹ค. ์ด ํ•จ์ˆ˜๋ฅผ ์ด์šฉํ•˜์—ฌ 12์˜ ์‹œ์ž‘์œ„์น˜๋ฅผ idx๋ณ€์ˆ˜์— ์ €์žฅํ•˜๊ณ  chk๋ฐฐ์—ด์— 12์— ํ•ด๋‹น๋˜๋Š” ์œ„์น˜์— 1์„ ์ €์žฅํ•œ๋‹ค.

    string.substr() ํ•จ์ˆ˜๋Š” string.substr(index, length) index๋ถ€ํ„ฐ length๋งŒํผ string์„ ์ž˜๋ผ์„œ ๋ฌธ์ž์—ด์„ ๋ฐ˜ํ™˜ํ•ด์ค€๋‹ค.
    length๋ฅผ ์ง€์ •ํ•˜์ง€ ์•Š์œผ๋ฉด index์œ„์น˜๋ถ€ํ„ฐ ๋๊นŒ์ง€์˜ ๋ฌธ์ž์—ด์ด ๋ฐ˜ํ™˜๋œ๋‹ค. 
  • ๊ทธ๋ฆฌ๊ณ  21์„ ์ฐพ์•˜์„ ๋•Œ ํ•ด๋‹น ์ธ๋ฑ์Šค๊ฐ€ chk[]๋ฐฐ์—ด์— 1๋กœ ๋˜์–ด์žˆ๋‹ค๋ฉด 12์™€ ๊ฒน์นœ๋‹ค๋Š” ์˜๋ฏธ์ด๋ฏ€๋กœ ํ˜„์žฌ ์ฐพ์€ ๋ฒ”์œ„ ์ดํ›„์˜ ๋ฌธ์ž์—ด ์ค‘์—์„œ 21์„ ๋‹ค์‹œ ์ฐพ์•„๋ณด๊ณ  ์žˆ๋‹ค๋ฉด return 1์„ ํ•œ๋‹ค.
  • ์• ์ดˆ์— chk[]๋ฐฐ์—ด๊ณผ ๋น„๊ต๋ฅผ ํ–ˆ์„ ๋•Œ ๊ฒน์น˜๋Š” ๋ถ€๋ถ„์ด ์—†์—ˆ๋‹ค๋ฉด return 1์ด๋ฉฐ, ์ด ์™ธ ๋ชจ๋“  ๊ฒฝ์šฐ์— ๋Œ€ํ•ด์„œ๋Š” false๊ฐ€ ๋œ๋‹ค.
  • 21์„ ๋จผ์ € ํƒ์ƒ‰ํ•˜๋Š” ๊ฒฝ์šฐ๋„ ๋งˆ์ฐฌ๊ฐ€์ง€๋กœ ์ง„ํ–‰๋˜๋ฉฐ func(12), func(21) ๋‘ ๋ฒˆ์˜ ์‹คํ–‰์—์„œ ํ•œ ๋ฒˆ์ด๋ผ๋„ return 1; ๋œ ์ ์ด ์—†๋‹ค๋ฉด No๋ฅผ ์ถœ๋ ฅํ•œ๋‹ค.

 

์ฝ”๋“œ

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
44
45
46
47
48
49
50
51
52
53
54
55
56
57
#include <iostream>
#include <string.h>
#include <vector>
#include <string>
#include <algorithm>
using namespace std;
int chk[100005], idx, idx2, findnexti;
string s, ss;
 
int func(string findnum) {
    memset(chk, 0sizeof(chk));
    string findnum2 = findnum == "12" ? "21" : "12";
 
    if (s.find(findnum) != string::npos) {
        idx = s.find(findnum);
        chk[idx] = 1; chk[idx + 1= 1;
        if (s.find(findnum2) != string::npos) {
            idx2 = s.find(findnum2);
            if (chk[idx2] || chk[idx2 + 1]) {
                if (chk[idx2]) {
                    chk[idx2 + 1= 1
                    findnexti = idx2 + 1;
                }
                else {
                    chk[idx2] = 1
                    findnexti = idx + 1;
                }
                ss = s.substr(findnexti + 1);
                if (ss.find(findnum2) != string::npos) {
                    return 1;
                }
            }
            else {
                return 1;
            }
        }
    }
    else {
        return 0;
    }
    return 0;
}
 
int main() {
    cin >> s;
    if (func("12")) {
        printf("Yes");
    }
    else if (func("21")) {
        printf("Yes");
    }
    else {
        printf("No");
    }
    return 0;
}
 
cs

 

๋” ๊ฐ„๊ฒฐํ•˜๊ณ  ์‰ฌ์šด ๋ฐฉ๋ฒ•

์•Œ์•„๋ณด๊ธฐ ๋ณต์žกํ–ˆ๋˜ ํ•จ์ˆ˜๋‚ด์šฉ์„ ์•„๋ž˜์ฒ˜๋Ÿผ ๊ฐ„๋‹จํ•˜๊ฒŒ ๋ฐ”๊ฟ€ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

  • ์ฃผ์–ด์ง„ ๋ฌธ์ž์—ด์„ str์ด๋ผ๊ณ  ํ–ˆ์„ ๋•Œ
  • ๋‹จ์ˆœํžˆ 12์„ ์ฐพ์•˜๊ณ , 12์„ ์ฐพ๊ณ  ๋‚œ ์ดํ›„ ๋ฌธ์ž์—ด์— ๋Œ€ํ•ด์„œ 21์„ ์ฐพ์•˜๋‹ค๋ฉด true
  • 21์„ ์ฐพ์•˜๊ณ , 21 ์ดํ›„ ๋ฌธ์ž์—ด์— ๋Œ€ํ•ด์„œ 12์„ ์ฐพ์•˜๋‹ค๋ฉด true
  • ๊ทธ ์™ธ๋Š” false๋กœ ์ทจ๊ธ‰ํ•˜์—ฌ No๋ฅผ ์ถœ๋ ฅํ•œ๋‹ค.
1
2
3
4
5
if (str.find("12"!= string::npos && str.substr(str.find("12"+ 2).find("21"!= string::npos ||
        str.find("21"!= string::npos && str.substr(str.find("21"+ 2).find("12"!= string::npos)
    cout << "Yes";
else
    cout << "No";
cs

์ด๋ ‡๊ฒŒ ๋ฌด์กฐ๊ฑด "12"๋‚˜ "21"์„ ์ฐพ๊ณ  ๋‚œ ์ดํ›„์˜ substring๋งŒ ๋ณด๋ฉด ๋˜๋Š” ์ด์œ ๋Š”

  1. string.find()ํ•จ์ˆ˜๊ฐ€ ์ฒ˜์Œ์œผ๋กœ ์ฐพ์€ ๋ฌธ์ž์—ด์˜ ์ฒซ ๋ฒˆ์งธ index๋ฅผ ๋ฐ˜ํ™˜ํ•ด์ฃผ๊ธฐ ๋•Œ๋ฌธ์ด๋‹ค. 
  2. 12๊ฐ€ ๋จผ์ € ์‹œ์ž‘ํ•  ๊ฒฝ์šฐ, 21์ด ๋จผ์ € ์‹œ์ž‘ํ•  ๊ฒฝ์šฐ ๋‘ ๊ฒฝ์šฐ ๋‹ค ๊ณ ๋ คํ•˜์—ฌ ์กฐ๊ฑด์‹์„ ๋งŒ๋“ค์—ˆ๊ธฐ ๋•Œ๋ฌธ์ด๋‹ค.

์œ„์— ์ž‘์„ฑํ•œ ์›๋ž˜ ์ฝ”๋“œ์—์„œ๋Š” 21์„ ์ฐพ์•˜์„ ๊ฒฝ์šฐ ๊ทธ ์•ž์—๋„ 12๊ฐ€ ์žˆ์ง€ ์•Š์„๊นŒ ์‹ถ์–ด์„œ ์ฝ”๋“œ๊ฐ€ ๋ณต์žกํ•ด์ง€๊ณ  ๊ธธ์–ด์กŒ๋Š”๋ฐ 12๊ฐ€ ์•ž์— ์žˆ๋Š” ๊ฒฝ์šฐ๋Š” ์ด๋ฏธ func(12)์—์„œ ์ฐพ์•˜์„ ๊ฒƒ์ด๊ณ  21์„ ์ฐพ์•˜๋‹ค๋ฉด ๊ทธ ์ดํ›„ substring์— ๋Œ€ํ•ด์„œ๋งŒ ์ƒ๊ฐํ•˜๋ฉด ๋์—ˆ๋‹ค.

๊ทธ๋ž˜์„œ ๋’ค์— ์†Œ๊ฐœํ•œ ๋ฐฉ๋ฒ•์œผ๋กœ ๊ฐ„๊ฒฐํ•˜๊ฒŒ ์ฝ”๋“œ๋ฅผ ๊ตฌ์„ฑํ•ด๋„ ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•  ์ˆ˜ ์žˆ๋‹ค.

๋Œ“๊ธ€